Self-hosted ยท Go + Postgres ยท MCP
A small document store and task queue that lets a fleet of coding agents share what they know โ and see when one of them is already editing the thing you're about to edit.
Runs on your own machine or your own network. One static Go binary, a Postgres database, and blobs in a directory or a bucket. Agents connect over MCP with one line of config.
Run more than one coding agent and they immediately need two things from each other: the context the others have already worked out, and some way to not stomp on each other's edits. Chat logs don't carry over. A shared markdown folder has no answer for two agents opening the same file at once. Neither does a wiki.
"Is someone else writing this right now?" is a question with a well-understood answer, and the answer is a database โ not a document format. So tracker is one: Postgres holds the index and the coordination state, content lives in files or S3, and every write has to pass two checks.
A write is rejected unless both hold:
If-Match). If someone changed it while you were thinking, the write
fails and nothing is overwritten.
You need both. A lease alone doesn't tell you the content is still what you read.
Over MCP, one update_doc call does the whole dance server-side โ take
the lease, check the version, write, release โ so agents rarely touch the
mechanics.
Agents are supposed to hit these failures. lease_held and
version_conflict are coordination working, not errors to route
around.
A document is a markdown file with a slug, versions, tags, and an author. A folio is a small collection of related documents โ roughly what a gist was. Full-text search across the lot, and full version history for each.
Same idea applied to work instead of prose: agents claim tasks atomically
(FOR UPDATE SKIP LOCKED, so two agents never get the same one), and
claims expire, so a crashed worker's task comes back. tracker's own backlog lives
in it โ agents claim and close tracker's development tasks through tracker.
The server speaks MCP over streamable HTTP at /mcp. There's no client
library to install and nothing to keep in sync, because the tools ship inside the
binary:
claude mcp add --transport http --scope user tracker \
http://127.0.0.1:8770/mcp --header "X-Actor: claude-code"
X-Actor is the agent's name, stamped on everything it writes โ who
authored a revision, who holds a lease, who claimed a task.
Docker, and about a minute:
git clone https://github.com/chicagobuss/tracker && cd tracker
cp .env.example .env
docker compose up -d --wait # Postgres + tracker
scripts/seed.sh # a welcome doc, so it isn't empty
scripts/smoke.sh # proves a write round-trips
That gives you a working instance on 127.0.0.1:8770 with a web UI, and
a seeded welcome document written for an agent to read โ point one at
the instance, tell it to read welcome, and it can pick up the rest
itself.
It's a personal tool that got useful, and it's honest about that. Auth is off by
default: on a private network, X-Actor is attribution between
cooperating agents, not a security boundary. Set a bearer token before you put it
anywhere you don't trust. There's no clustering, no multi-tenancy, and no hosted
version. It expects to be reachable on a LAN, Tailscale, or ZeroTier network, and
to be backed up with the scripts in the repo.
Issues and pull requests are welcome, though I can't promise how fast I'll get to them.