bakedpi

Your AI engineering department

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
How it works

Assign an issue. Review the plan.
Merge the pull request.

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.

01

Create an issue

Describe the task in an enrolled repository. Any repository that the bot account can access with write access is enrolled.

you
02

Assign it to the bot

The daemon polls Forgejo like a person who checks the issue tracker. The issue enters one global queue: one piece of work at a time.

you
03

Read the plan

The agent reads the codebase and posts a proposal as a comment. Reply with an approval, or with changes. The agent takes correction.

agent, then you
04

The agent implements

It pushes the branch pi/issue-<n> and opens a pull request that closes the issue. CI runs on the Forgejo Actions runner.

agent
05

Review the pull request

Leave review comments. The agent pushes fixes to the same branch and answers each comment, the way a colleague would.

you, then agent
06

Merge

When you merge, the issue closes. If the agent is stuck at any point, it asks in a comment. Reply to continue.

you
Department = Forgejo + pi + bakedpi
BAKEDPI

keeps the judgment where it always lived: with you

LLMs 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

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.

pi agents

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.

bakedpi daemon

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.

From one agent to a fleet

Each worker is a pi configuration directory

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.

  • Its own model, from any providerA 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.
  • Standing instructionsAn AGENTS.md in the worker directory applies to every task. An AGENTS.md in the repository applies to that repository only.
  • Pluginspi extensions, skills, and prompt templates live in extensions/ and skills/, or as pi packages in settings.json.
  • CI verdictsThe stack ships a Forgejo Actions runner. Put a workflow under .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
Any model. Any provider.

If pi supports it, bakedpi supports it

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.

Anthropic OpenAI Google DeepSeek Mistral xAI Groq Cerebras Together Fireworks Moonshot MiniMax Z.ai Amazon Bedrock Google Vertex Azure OpenAI GitHub Copilot OpenRouter Vercel AI Gateway Cloudflare AI Gateway Hugging Face Ollama, vLLM, LM Studio, and any OpenAI-compatible endpoint

Built-in providers come from pi. Custom providers and local servers go in models.json; custom APIs go in a pi extension.

Get started

Try it now or bring your own Forgejo

Quick start

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.

Bring your own Forgejo

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.

Read before you enroll a repository. The agent executes shell commands with no sandbox beyond its process user, or beyond its container in the Docker setup. Workers clone over HTTP with their API token, so treat workspaces as secret-bearing. Do not enroll repositories you do not trust.