The ticket board your agents actually run — pick up the card, move it across the columns, do the work, close it.
One folder. Copy it in, hand it to your agent.
apps/kanban-factory ├── README.md ├── RUNBOOK.md ├── agents │ ├── board-driver │ └── orchestrator ├── app.json ├── assets ├── docker-compose.yaml ├── glue │ ├── kb.sh │ └── read-token.php ├── kanban.html └── rig.yaml

The ticket board your agents actually run — pick up the card, move it across the columns, do the work, close it.
A real Kanban board — open-source Kanboard (MIT) — running in one small container on your box, with the agent seats that drive it. Instead of you dragging cards, an agent pulls a ticket, moves it across Backlog, Ready, In progress, and Done, records the work on the card, and closes it — all through the board's own API, terminal-in / terminal-out as the interface. The board's own UI is the surface; you just watch the work move.
The human-shaped software factory, composed in an afternoon — an existing tool your agents operate, not a bespoke app.
One folder: a rigspec that boots the containerized board and launches the seats, plus a ~20-line JSON-RPC glue wrapper. Copy it in, hand it to your agent.
Kanboard's own authenticated UI is the real surface. Boot the rig, then open Kanboard's own UI at its local board URL (by default http://127.0.0.1:8791) and sign in there. The included kanban.html is only a launcher/explainer — it is not the board and holds no credentials.
An agent drives one ticket end to end, entirely over JSON-RPC — never the browser:
1. create the ticket 2. pick it up — the driving agent records an explicit pickup on the ticket 3. move it across the columns (resolved dynamically), ending in Done 4. record one bounded work step on the ticket 5. work complete — the card lands visibly, open, in the Done column 6. terminal closure — closeTask, after it is in Done
Work complete and terminal closure are recorded distinctly; a greyed closed card alone is not "work done".
Kanboard is open-source (MIT) — no license caveat. This package runs it in one container on your box and drives it with agent seats.
/jsonrpc.php — createTask — file a ticket on the board/jsonrpc.php — getColumns — resolve the board columns dynamically/jsonrpc.php — moveTaskPosition — move a card into a named column/jsonrpc.php — createComment — record pickup and the work step on the ticket/jsonrpc.php — getTask — read a card's column and open/closed state/jsonrpc.php — closeTask — terminal closure after the card is in Done~/studio/apps/kanban-factoryPaste this into your box's lead agent — it installs the app on your box.
Install request — Kanban Factory
App id: kanban-factory
Registry repo: mvschwarz/rigs-to-apps
Manifest path: apps/kanban-factory/app.json
Please install this mini-app onto my studio box:
1. Retrieve kanban-factory's app.json from the registry repo (mvschwarz/rigs-to-apps) at apps/kanban-factory/app.json,
then resolve and record its current commit SHA for provenance.
2. Apply judgment: check for name and port collisions with what's already
installed, and place it in a sensible sidebar group (category default: build).
3. Install the app directory to ~/studio/apps/kanban-factory.
4. Register its surfaces door: route /kanban.html with the
▤ glyph, grouped under the build default group.
5. No server — this is a pure static surface.
6. Then verify:
- docker compose boots the single Kanboard container (SQLite, loopback-only, digest-pinned) and it answers on its local board URL
- An agent files a ticket, records an explicit pickup on it, and moves it across the dynamically-resolved columns into the Done column
- The card lands visibly OPEN in Done (work complete), then closeTask closes it (terminal) — both states recorded distinctly, over JSON-RPC and never the browser UI
Verbs this app exposes (for reference, method omitted):
/jsonrpc.php — createTask — file a ticket on the board
/jsonrpc.php — getColumns — resolve the board columns dynamically
/jsonrpc.php — moveTaskPosition — move a card into a named column
/jsonrpc.php — createComment — record pickup and the work step on the ticket
/jsonrpc.php — getTask — read a card's column and open/closed state
/jsonrpc.php — closeTask — terminal closure after the card is in Done
(You are my trusted box lead agent; act inside the box. Nothing here calls out.)