33 open-source projects taken apart down to the function that calls the model, the open-source options for each part of a harness, and a first design for our own. Sources read on 12 Oct 2026.
Step 1
A language model can only read text and write text. On its own it cannot open a file, run a test or remember yesterday.
The harness is everything around the model that turns its text into actions: it shows the model the right things, runs the tools it asks for, keeps the record, and enforces the rules.
Think of the model as the driver and the harness as the car. Every project on this page is a different car built around much the same kind of driver.
The parts every harness has
Agent loop
the loopAsk the model. If it wants a tool, run it and ask again. Stop when it answers without asking for one.
Select any part to read about it.
One request, step by step
A message arrives from a person or a program.
The session gathers what the model should see: instructions, earlier messages, the list of tools.
The request goes to the model, and the reply streams back.
If the reply asks for a tool, the permission rules decide: run it, refuse it, or ask a person.
The tool runs in the execution environment and returns its result.
The result is written to the session, and the loop goes back to the model with it.
When the model replies without asking for a tool, that reply is the answer.
Step 2
The loop is the small part
Ask, run the tool, ask again: mini-SWE-agent does it in about a hundred lines, and even Cline keeps its loop in one file. Almost all of the code in these projects is everything around the loop.
Keep the record, rebuild the view
The strongest designs never edit history. They store every event in order and build what the model sees from it, so summarising old turns changes the view, not the record.
The big split is where the hands go
Some agents run commands on your machine; others send them to a sandbox elsewhere. The cloud designs keep the keys and the transcript outside the sandbox and treat it as disposable.
Permission is becoming data
Instead of code deciding what a tool may do, more projects use rule tables with three answers (allow, ask a person, deny) and priorities so an organisation's rule beats a project's.
Memory people can read
Long-term memory is moving to plain files, often in git, with agent-written entries held for a person's approval. Search by meaning is the exception, not the rule.
Everyone plugs in the same way
Tools arrive over MCP, instructions as AGENTS.md and skills folders, and outside code through hooks. The edges have standardised even where the insides differ completely.
Reference: the projects side by side
Come back to these while you work through the path: sizes, kinds and where each sits. The full comparison has its own tab.
mini-SWE-agentEach step on the scale is ten times the one before. Select a project to open it. Lines in Python, TypeScript, Rust, Go, Swift and Kotlin files in the whole repository, leaving out tests, documentation, examples, scripts, build output and any file over 50,000 lines (generated catalogues). Counted by us at the commit shown, so the numbers compare like with like but will not match a project's own claims. The Claude Agent SDK figure is only the open wrapper; the agent itself is closed.
Point at a project to see why it sits where it does. Select one to jump to its diagrams.
mini-SWE-agent
Aider
Trae Agent
Pi
Crush
Gemini CLI
Codex CLI
Loop
ForgeCode
Kimi Code CLI
Continue
Codebuff (Freebuff)
OpenHands SDK
Letta CodePackage, file and function names were checked against each repository at the commit shown. A module's purpose is taken from its own description or documentation where it has one, and otherwise from its source. Positions on the map, the "what is new" lists and everything under Our design are our reading and our proposal, not the projects' own claims. Each project ends with what we did not read, and each entry under Components says how we know it. Logos belong to their owners and are shown only to identify each project.