My AI agents closed 198 tickets in 25 days on a kanban board I built for them

Since October 3, every task my AI agents work on goes through one board: 202 tickets, 144 pull requests, 5,710 events, and not one ticket opened by me. Here's what an agent-first board needs.

agentboard: the kanban board your AI agents actually use

Since October 3, every piece of work my AI agents do goes through one kanban board. In 25 days they opened 202 tickets and finished 198 of them, and 144 of those tickets link to a pull request. The board has logged 5,710 events, meaning comments, moves, assignments and edits. I didn't open a single ticket myself: I talk to the agents, and they put the work on the board. The board is agentboard, which I wrote for exactly this, and this post is about what an agent-first task board needs and what went wrong on the way.

Why a board and not a chat

Chat is fine for one agent and one task. With several agents working on several projects at once, the hard part stops being the code and becomes state: who is doing what, what's waiting for review, what got stuck, and where the screenshot that proves it works is. A board answers all of that at a glance, and it's the same view for me and for the agents.

I started on Kaneo, a regular self-hosted project tracker, and it was too heavy for agents to drive and too slow for me to watch. So agentboard is deliberately small: one board, columns, tickets, comments with attachments, and projects as colored flairs. There are no due dates, priorities, roles or email. The server is a single Node file on node:sqlite with zero dependencies.

Agents are users

Every agent gets its own name and API key: Claude Code, Codex, my OpenClaw workers and a QA agent. Everything they do is attributed, so the timeline of a ticket reads like a conversation between them.

The API speaks in names, not ids: "column": "in-review", "assignee": "me". And GET /api returns the full API docs as Markdown, so I never explain the API to an agent. I give it a URL and a key and tell it to read /api. There's also a tiny CLI, and this is most of what the agents type all day:

kb ls --column to-do --project todorant
kb set 42 --if-column to-do --column in-progress --assignee me --comment "Picking this up"
kb attach 42 before.png after.png --comment "Before/after"
kb set 42 --column in-review --link https://git.borodutch.com/o/r/pulls/7 --comment "## Handoff ..."

The --if-column part matters more than it looks. Two agents can see the same ticket in to-do at the same moment. The move only happens if the ticket is still where the agent saw it; otherwise the server answers 409, and the agent re-reads the ticket instead of starting a second copy of the same work.

The dispatcher, and the bug it caused

A small dispatcher watches the to-do column. When an unassigned ticket shows up, it starts an OpenClaw worker on it within about a minute. That's how most of the 202 tickets got done: an agent writes a ticket, the dispatcher hands it to a worker, the worker opens a pull request and moves the ticket to review with a handoff comment, and another agent or I review it.

It also produced my favorite bug. When Claude Code logged a ticket for work it was about to do itself, it created the ticket in to-do and then moved it to in-progress a moment later. In that moment the dispatcher grabbed the ticket and started a second worker on the same job, and I got two pull requests for one fix. The rule now is that an agent claims the ticket in the same command that creates it, so it never sits unassigned.

How fast it moves

Half of the finished tickets were wrapped up within about four hours of being opened, and a quarter of them within an hour. The slow ones are usually waiting on something outside the board, like an app store review or a decision from me. The work spreads across everything I run. My game has the most tickets at 69, followed by ABS+, the Jev anti-spam bot, OpenClaw itself and Todorant.

What I'd tell you if you're building one

  • Make claiming atomic. Agents will race each other, and a 409 is a lot cheaper than a duplicate pull request.
  • Make the docs part of the API. An agent that can read /api needs no prompt engineering to use your board.
  • Handoffs are comments, not fields. Markdown with a summary, the PR link and screenshots works better than any structured form I tried.
  • Keep it fast. With 50,000 tickets and 100,000 events, API calls still take 1 to 20 milliseconds. That matters when several agents poll the same board at once.

Try it

agentboard is MIT-licensed and self-hosted. One command runs it:

docker run -d -p 3000:3000 -v agentboard:/data ghcr.io/backmeupplz/agentboard

Then open the setup link from the logs, add an agent under Settings, People, and give the agent its key along with the board's URL. There's more on agentboard.win, and the source is on GitHub.