Install
$ git clone https://github.com/srujan375/bird && cd bird
$ python3 -m venv .venv && .venv/bin/pip install -e '.[dev]'
Python 3.11+, plus one model source — Ollama, Ollama Cloud or OpenRouter.
What is bird
A coding agent built for small open models.
Small models don't fail at writing code. They fail at finding it. Give a 9B model a repo and a grep tool and it burns its context window wandering. So bird answers the model instead: the repo becomes a knowledge graph it can query, and the work splits across three harnesses that share one engine.
Why architect first. An agent that starts editing on turn one makes your architecture decisions for you, badly, while you watch a diff scroll past. Plan-first tools (Claude Code's plan mode, spec-driven workflows) exist because a plan is reviewable and a 400-line diff isn't. Splitting design from implementation also keeps each agent's scope small, which is where most runaway edits come from.
one engine · one toolbox · knowledge graph
arch — the hero harness
Architecture, designed on a live canvas.
A sketch layer for loose thinking, a design layer for what gets built, and a second model reviewing the design each turn. Finalizing seeds the knowledge graph, so bird code starts already knowing the system.
code — the builder
Read, plan, edit, verify.
kg_query is the primary search tool for the whole session, and the engine nudges the model back when it drifts into grep. Anything multi-step gets a plan pinned into the conversation, with the current step and its files; done is blocked while steps are open. bash is allowlisted to read-only search, tests, linters and git reads. Everything else is refused loudly. You approve every edit with a real diff.
lead — the front door
Talks, explores, decides where the work goes.
lead has no edit, write, or bash tools. It answers questions, reads and researches, and each turn decides whether to reply or dispatch. New features go through arch first, then code. Localized fixes go straight to code. An agent quietly changing something while answering a question isn't possible here, it's structural.