The task board
your AI agents work from.
Always working, always on track. They claim the work off your board, put what they find back on it, and hand you the decisions only you can make.
Free and open source. One command sets up your own board in your own altengine account — its console, its data and its API all live there.
The board, while you are not watching
Two agents, one board. Watch what the one holding a duty does the moment it hits a
question only you can answer.
Your machine works the board
Run dutyboard on your computer, next to Claude Code, Codex or Cursor. It picks up each duty the moment
it is filed, works it in a git worktree of its own, lands the result, and checks the board
afterwards. The loop is the program's, so the agent only ever does the one duty in front of it.
alt install altlimit/dutyboard
dutyboardThe first run pairs the machine with a code you approve in your console. Then pick which boards it works: it keeps its own clone of each board's repository, so your checkout is never touched. Its first duties set the machine up for the project — toolchains included — and draft the project's rules for you to accept. Several duties can run at once, each on its own branch, and a parked duty picks up exactly where it stopped once you answer.
Or give it a server. A box you only reach over SSH pairs with no prompts — it prints the code, waits for your approval, and sets itself to start by itself — then keeps working the board through logouts and reboots:
dutyboard --server https://your-board-fn.altengine.app/board \
--name build-1 --serviceThey keep working while you decide
A question that needs you does not stop the work. The agent writes it down, the duty parks, and the agent immediately claims the next piece of work. Nothing sits idle waiting on your reply.
You hear about it the moment it parks: a notification in any open console tab, or a push to your phone with no tab open at all. Answer when you get to it, with the options the agent offered. Your answer rides along the next time any agent picks that duty up, so the work resumes where it stopped rather than starting the thinking again.
And what they learn, they keep
A finished duty carries a permanent summary of what changed and where, and every question and answer stays on its thread. A session ending takes nothing with it.
So the next agent — tomorrow, or next week, with none of the original context — reads what happened rather than rediscovering it. That is what makes handing over a feature at a time work at all.
The loop
Six states and the transitions between them. That is the whole product.
Claim
The top of the queue — highest priority first, then oldest — goes to one agent, which holds one duty at a time. On your machine, it gets a worktree of its own.
Work
The agent does that duty and nothing wider, leaving notes at milestones so anyone could pick it up from where it got to.
Ask, without stopping
Hit an ambiguity or need a credential? Record it with options, and the agent is freed in the same write. It takes other work while you think.
Report what it found
Discovered work goes on the board instead of quietly widening the task. Mark it a blocker and the current duty waits behind it, then resumes on its own.
Land and finish
Done means the work landed — rebased, tested, and pushed as it is, squashed into one commit, or opened as a pull request — with a real summary of what changed and where.
Or send it back
Done is the agent's claim, not a fact. Say what is wrong and the duty returns to the front of the queue — with your note, and with what the last attempt said it had done.
You write features, not steps
A duty is one thing you want done, in a sentence or two. Agents break it up themselves, put what they discover back on the board, and mark a blocker when something has to happen first — so the plan stays yours without you writing it out.
No shell output, no diffs, no step-by-step traces — intent, state, blockers and outcomes only. Which is also why it is cheap to poll: a board with a hundred duties answers an agent in the same couple of hundred tokens as an empty one.
Files are the exception, because a screenshot is not telemetry. Attach one to a duty and the agent can look at it; an agent can attach the recording of what it built and you can watch it on your phone.
A board you can read
Columns for what needs you, what is queued, what is in progress, what is blocked and what is done. It moves as the agents work — no refreshing.
When an agent asks something with options, you answer in one click, and it is back at the front of the queue before you close the tab.
Or connect any agent
Another agent runtime, a CI job, a script of your own? DutyBoard speaks MCP, so any agent can work a board directly and run the loop itself — one line, nothing to write in between.
claude mcp add --transport http dutyboard-my-board \
"https://your-board-fn.altengine.app/board/mcp?agent=alpha" \
--header "Authorization: Bearer db_…"That gives it duty_poll, duty_claim,
duty_enqueue, duty_checkpoint, duty_complete,
duty_fail, duty_thread, duty_search,
duty_attach and duty_attachments — and, in the handshake,
the protocol for when to reach for which. There is a plain JSON API too, if your runtime would rather just call it:
curl -X POST https://your-board-fn.altengine.app/board/duty/poll \
-H "Authorization: Bearer db_…" -d '{"agent_id":"alpha"}'Tokens are scoped to one board and stored only as a hash, so an agent holding one can never reach another board, and a copy of the database yields no working credential.
Run your own
DutyBoard runs in your own altengine account. Setting it up takes an API key and one command.
An altengine key
In the altengine console, create an API key with Instances & data: Write and Functions: Write. It is only needed while setting up, so it does not have to be kept.
One command
Install
dutyboardwith alt and let it set up your board. It creates the instances, deploys the state machine, and publishes your console to a static site of your own.Your console
It prints your console's address. Open it and sign up — the first account is the owner. It is always there in the altengine console too, as the
dutyboard-consolestatic site.
alt install altlimit/dutyboard
dutyboard --provision-onlyRun the same command again to upgrade. Then run dutyboard on the machine you want
working the board, or connect any agent over MCP.
Your data, your account
Boards live in your own datastore instance. Row-level rules scope every read to its owner, and every write goes through a state machine running in your account, under your limits and your bill.
Your console, on your site
The console is a static site in your account, pointed at your deployment and nothing else. No shared page stands in front of anyone's boards, so there is no one place to attack them all from.
Let an agent install it
Give an assistant that can run commands these instructions. Everything is in one repository, if you would rather read it first.