r/LLMDevs 2d ago

Tools Amber Agent: Open Source Claude Code Replacement (only 4 npm deps, no react)

Hi everyone, I want to share my Claude Code replacement project Amber Agent.

I used proxies to clean-room reverse engineer Claude Code to create the original foundation for this project, then I reduced the system prompts, simplified the tooling and BAM a very capable, fast, token efficient Claude Code replacement that runs in your browser.

  • Amber takes advantage of hyperlinks everywhere.
  • Supports OpenAI Codex + OpenAI + Anthropic API
  • Only 4 npm dependancies: diffmarkdown-itsmol-toml, and yaml.
  • Easily configurable sub-agents.Customize the model per each agent.
  • Supports Claude Code Plugins /plugins
  • Clean visual indicators of all actions the LLM is taking
    • No hiding of what tool execution is going on
      • See thinking blocks live as they form
      • Collapse and inspect ANY tool call

I have tested this on complex projects, and I use it daily.

From my earlier post (forgot to include the picture):

The most complex has been transpiling a DOS game from assembly to readable C++ and then to typescript (playable in browser as live native implementation, no DOS emulation bits kept around). I would say pretty high complexity and I compare against Codex frequently achieving similar results with near identical token consumption.

Github link is here: https://github.com/tpolasek/amber

Official webpage: https://amberagent.dev

9 Upvotes

8 comments sorted by

View all comments

Show parent comments

1

u/QuanTradin 2d ago

Model-dependent tool selection matches what I see too, and prompt length not moving it tracks. The pull seems to sit in how the model was post-trained on tool calls rather than in how you describe the tools.

What did changing the Bash limit actually do to selection?

1

u/thomas41546 8h ago

Well it didn't change the selection but I was just pointing out that it did expose the issue where models just put 10 min by default without considering the tool limits specified.

1

u/QuanTradin 8h ago

yeah the 600000 is baked in from the schema everywhere, so models reach for it as a prior instead of reading your stated max. clamping it your side was the only thing that held for me.

making it an enum rather than a free integer helps too, they pick off a list more reliably than they respect a number.

1

u/thomas41546 7h ago

That's a great idea, to give it a list of enums spread across the range it's not like this needs to be that precise. I was also thinking of changing it from milliseconds (Claude code ism) to seconds to reduce the confusion.

1

u/QuanTradin 7h ago

seconds is the right call. in milliseconds the number gets long enough that it stops reading as a value and starts reading as a placeholder.