bakedpi is a self-hosted AI engineering department: a git server, an issue tracker, and a team of AI coding agents, assembled from proven open-source parts and brought up on your own hardware with one command.
You work as the lead engineer. The agents work as your team. An agent reads the issue, posts a plan, and waits for your approval. Then it opens a pull request and answers your review like a colleague.
$export OPENROUTER_API_KEY=sk-or-... $docker compose up bootstrap $docker compose up -d
$git clone https://github.com/briandeheus/bakedpi $cd bakedpi && cp env.example .env $npm install && npm run build && npm start
All communication happens in the issue tracker, in plain conversation. There is no dashboard, no new interface, and no magic approval keyword. The agent interprets your comments.
Describe the task in an enrolled repository. Any repository that the bot account can access with write access is enrolled.
youThe daemon polls Forgejo like a person who checks the issue tracker. The issue enters one global queue: one piece of work at a time.
youThe agent reads the codebase and posts a proposal as a comment. Reply with an approval, or with changes. The agent takes correction.
agent, then youIt pushes the branch pi/issue-<n> and opens a pull request that closes the issue. CI runs on the Forgejo Actions runner.
Leave review comments. The agent pushes fixes to the same branch and answers each comment, the way a colleague would.
you, then agentWhen you merge, the issue closes. If the agent is stuck at any point, it asks in a comment. Reply to continue.
youLLMs write good code now. They do not carry what a lead engineer carries: the architecture, the history, the taste, the reasons behind "no". bakedpi does not try to teach the model any of that. The design conversation before the code and the review before the merge are part of the protocol, not a hope about model behavior.
Forgejo provides the git hosting, the issue tracker, and the CI runner. Issues, comments, and pull requests are the whole interface. Nothing bespoke, nothing to learn.
The pi coding agent provides the engineers, with any configuration and extension that pi supports. Each worker has its own model from any provider pi knows, its own instructions, and its own skills.
The thin daemon that turns them into a team. It polls Forgejo, derives whose turn it is from the timeline, and keeps one pi session per issue. The session survives a restart.
bakedpi adds nothing of its own here. A worker gains a capability because a file exists in its configuration, not because of a bakedpi release. A mixed fleet, each worker with its own model, is a directory per worker.
settings.json sets the default model per worker, from any provider pi supports. Share one OpenRouter key across the fleet, or give a worker its own auth.json for Anthropic, OpenAI, Google, a local server, or anything else.
AGENTS.md in the worker directory applies to every task. An AGENTS.md in the repository applies to that repository only.
extensions/ and skills/, or as pi packages in settings.json.
.forgejo/workflows/ with runs-on: docker and the agent's pull requests get checked.
config/ ├── bananapi.pi/ │ ├── settings.json # an Anthropic model │ ├── AGENTS.md # standing instructions │ └── skills/ ├── applepi.pi/ │ ├── settings.json # a DeepSeek model │ ├── auth.json # its own DeepSeek key │ └── extensions/ └── cherrypi.pi/ # empty: pi defaults + the shared OpenRouter key # add a worker $ ./bin/provision-agent.sh cherrypi.pi $ docker compose up bootstrap && docker compose up -d
bakedpi has no model layer of its own. The workers use the pi provider catalog, pi credentials, and pi models.json. Pick a provider per worker, mix them in one fleet, or point a worker at a local server.
Built-in providers come from pi. Custom providers and local servers go in models.json; custom APIs go in a pi extension.
Install Docker, then bring up the whole department with Compose: Forgejo, Postgres, a CI runner, and two example workers.
$export OPENROUTER_API_KEY=sk-or-... $docker compose up bootstrap $docker compose up -d
Then open localhost:3000, log in as bakedpi-admin, create a repository, add a worker as a collaborator, and assign it an issue.
Point the daemon at a Forgejo instance you operate, without Docker. It needs Node 22.19 or newer, git, and a bot account with an API token.
$git clone https://github.com/briandeheus/bakedpi $cd bakedpi && cp env.example .env $npm install && npm run build && npm start
Set BAKEDPI_FORGEJO_URL and BAKEDPI_TOKEN in .env, then set a provider key or log in to any provider with the pi CLI. Give the bot account write access to each repository it works in.