Getting Started
Docker is the easiest way to run Upkeep. Everything – the Go binary, Claude Code, the tea CLI, and other tools – is bundled in the image.
Quick start
Run the setup script to start Forgejo, create bot accounts, and configure everything:
script/setupSetup will prompt for an Anthropic API key if ANTHROPIC_API_KEY isn’t set. You can also use a Claude subscription (Max, Pro, Team, or Enterprise) instead – see Authenticating Claude below.
Once setup finishes, start the bots:
docker compose up upkeepThis runs cycles in a loop: managerbot first, then all role bots in parallel, then managerbot again. Cycles repeat with a configurable pause between them.
Running individual bots
docker compose run --rm upkeep run managerbot --turns 5
docker compose run --rm upkeep run forkbot --turns 20
docker compose run --rm upkeep run securibot --prompt "Audit simplecov dependencies"Running a single cycle
docker compose run --rm upkeep cycle
docker compose run --rm upkeep cycle --sequential
docker compose run --rm upkeep cycle --turns 15Other commands
docker compose run --rm upkeep report
docker compose run --rm upkeep webThe web dashboard serves on port 7200 by default. The runner and bots push events to it over an internal API – tool calls, text output, lifecycle transitions – and the dashboard streams them to the browser via SSE.
Authenticating Claude
If you have a Claude Code subscription (Max, Pro, Team, or Enterprise), generate a long-lived OAuth token:
claude setup-tokenIf you don’t have the Claude CLI installed locally, generate the token from inside the container:
docker compose run --rm --entrypoint claude upkeep setup-tokenAdd the token to CLAUDE_CODE_OAUTH_TOKEN in the .env file.
Alternatively, set ANTHROPIC_API_KEY in .env to use an Anthropic API key directly.
Custom domain or port
Both URLs default to http://localhost:7100. To use a custom domain or port, set FORGEJO_PUBLIC_URL and FORGEJO_URL before running setup, and update public_url in upkeep.yml to match. If you use a custom domain, add it to /etc/hosts.
Starting over
To wipe everything and start fresh:
docker compose down -v
script/setupThe -v flag removes named volumes (Forgejo data, runner data, CLI auth credentials). Without -v, only containers are stopped.
Local setup (without Docker)
See docs/local-setup.md in the main repository for instructions on installing CLIs locally and building the Go binary yourself.