bento GitHub

Docs

Set up Bento, connect a project, and run your work through it with Claude Code and Codex.

Setup

You need Python 3.9+ and git, plus Claude Code, Codex, or both. Bento is built and tested on macOS. Linux is untested. Windows won't work, because Bento relies on Unix file locks.

git clone https://github.com/ckoglmeier/bento.git ~/bento
mkdir -p ~/.local/bin
ln -s ~/bento/kb ~/.local/bin/kb
kb init ~/bento-data --owner yourname
kb install-agents

If your shell can't find kb, add that folder to your path and open a new terminal:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

The repo holds only code. Your board, docs, and plans live in the workspace folder on your machine. While it runs, Bento snapshots that folder to its own local git repo about once a minute, and kb history lists the snapshots. It never pushes them anywhere.

kb install-agents adds a short marked section to ~/.claude/CLAUDE.md and ~/.codex/AGENTS.md, and lets Codex's sandbox write to the workspace.

First five minutes

  1. Connect a project and open the board:
    kb connect ~/code/my-app --import-docs
    kb open
  2. In that project, ask Claude Code or Codex: "Read our backlog and add the next few epics to Bento." They land in Backlog.
  3. On the board, drag the one you want first into Next.
  4. Ask your agent "What's next?" It answers from the board and changes nothing. Tell it to pick the work up, and it claims the card and finishes into Review for you to check.

How it works

Every card is an epic: a meaningful group of work with one clear "done when". Small tasks go inside the epic's plan, not on the board.

The rules are short. Asking "what's next?" only reads. Agents claim a card before they start, finish into Review, and never move a card to Done. That call is yours. Agents put new work they notice in Backlog and don't start it. If one is stuck on a real decision, it blocks the card and tells you.

Agents get these rules from kb rules, which prints AGENTS.md. Claiming is atomic, so two agents can't take the same card.

The board

Every card is numbered within its project: the project's letters, then a number. B12 is the twelfth Bento card, and MA3 is the third card in my-app. Bento picks the letters from each project's name: one letter when it's free, the initials of a longer name like MA for my-app, or more of the name when those are taken. They never change once given, and kb projects lists them. Cards with no project use N. Moving a card to another project gives it the next number there. Its old number keeps working, and so do numbers from before projects had letters, like #36.

kb open opens the board at http://127.0.0.1:4747, and starts it in the background if it isn't running. You can also tell your agent "open bento". The board has five views:

ColumnMeaningWho puts cards here
BacklogEpics nobody has committed toAnyone
NextCommitted work. The top card goes first.You, or a handoff you asked for
DoingSomeone is working on itWhoever claims it
ReviewFinished, waiting for you to checkWhoever did the work
DoneYou accepted itYou only

Agents claim from Next. The exception is work you ask an agent for directly, in conversation. The agent claims it straight from Backlog and quotes you: kb claim MA40 --as codex --asked "build the site directions". Your words go on the card, and the card waits under "Started on your word" in your Inbox. Click That's right to confirm it, or Stop it to send it back to Backlog. From the command line, that's kb confirm MA40 or kb confirm MA40 --stop.

Decisions

An agent that needs you blocks its epic with a question, and can offer choices:

kb block MA12 "Which payment provider?" --option Stripe --option Paddle

You pick one in the Inbox, or type your own answer. Every answer is saved as a decision in DECISIONS.md, numbered D1, D2 and on. Mention other epics in it, such as "Stripe, and the same for MA13", and the decision is noted on them too. From the command line, kb answer MA12 Stripe --implies MA13,MA14 does the same, and kb decide "We launch in the US first" --implies MA12,MA13 records one you made in a conversation. Change your mind with kb decide "Paddle after all" --supersedes D3, and every epic D3 touched is told. kb why MA12 lists the decisions behind an epic, and the card shows them on the board.

Keeping the done-when honest

Once someone claims an epic, its done-when only changes with a reason: kb set MA12 "done when" "..." --reason "what the old one got wrong". The reason and the old wording go in the card's notes. When an agent makes the change, it shows in your Inbox until you keep it or put the old one back (kb bar MA12 keep or kb bar MA12 undo), so nobody can quietly lower the bar.

Tested before Review

An agent can't hand you work it hasn't tested. After claiming an epic, it writes the checks first with kb test-plan MA12. That adds a Testing plan section to the epic's plan doc, or starts a doc of its own when there's no plan. Each check says what to verify, how, and what to expect. Before Review, the agent runs every check and reports what it ran: kb review MA12 --as codex --tested "ran all four checks, all passed". Review refuses work with no testing plan or no report. If something can't be tested yet, the agent says why with --untested "no staging data yet", and the Inbox flags it next to the work. Your own cards skip the check. To turn it off, set { "review": { "require_tests": false } } in bento.json.

Health, briefings and resuming

kb health lists everything stuck: blocked epics, claimed work with no update for two days, work waiting in Review for two days, changed done-whens, late or at-risk milestones, and recurring reports that missed one and a half of their scheduled runs. Each line says since when, the next step, and who takes it. It exits 1 when something is stuck, so a scheduled job can alert on it. Change the thresholds in bento.json with { "health": { "quiet_days": 3, "review_days": 2 } }.

kb digest prints a short Markdown briefing: what's waiting on you, what's in progress, what's up next, milestones, what's stuck, recent decisions, and why work was sent back. API keys, tokens, and passwords are taken out, so you can paste it into a chat assistant. kb digest --out ~/briefing.md --watch keeps a file current.

An agent starting a session runs kb resume --as claude to see what it holds, what came back from you, the decisions on its epics, and what to do next.

Docs and plans

Connecting a project registers it in your workspace and adds nothing to its repo. Bento recognizes the project by its git remote, so every clone and worktree is connected automatically. --import-docs copies Markdown from docs/, plus root files like BACKLOG.md and ROADMAP.md, from the default branch into products/my-app/.

Imported docs are a copy. Decide which version is the real one: keep editing in the workspace and leave a pointer in the repo, or re-run kb import to refresh. A re-import overwrites workspace edits to those files.

Pull only what's worth doing soon onto the board. The --source flag points back to where the detail lives:

kb add "Saved searches" --source docs/BACKLOG.md#release-1 --release "Release 1" --done-when "..."

An epic can have one of four kinds of plan, which you can read, approve, or request changes on from the board:

KindCovers
implementationBuilding something
testingVerifying built epics as a group. It can't start until they reach Review.
releaseShipping a set of epics, with its exit gate and rollback
writingA piece of writing, often timed to warm up an audience before a release
kb plan testing "Search" --epics MA14

On the board you can edit any doc in place, or start a Codex or Claude Code thread on it.

Handoffs

Iterate with one agent, then hand epics and a plan to another:

kb plan implementation "Search" --epics MA12 MA13
kb handoff MA12 MA13 --to claude --plan products/my-app/plans/implementation-search.md --as codex

The receiver runs kb claim MA12 MA13 --as claude, reads the plan, and follows it. Handing off doesn't start an agent. Someone still has to ask it to pick the work up.

Hearing back without polling

kb service install

This runs Bento in the background on macOS and starts it at login. An agent that pushes work hears back once when the whole set reaches Review, or right away if an epic gets blocked:

The web board updates live the same way. For your own alerts on a phone, Slack, or anything else, add a command to bento.json in your workspace. It receives the event as JSON on stdin, plus $BENTO_TITLE and $BENTO_MESSAGE:

{ "notify": { "command": "curl -s -d \"$BENTO_MESSAGE\" https://ntfy.sh/your-private-topic" } }

Milestones

Dates belong on milestones and releases, not on ordinary epics. A milestone is a named moment with one date, such as a launch or a publish date. Epics feed it through needs, and milestones in different projects can depend on each other.

kb add "Essay publishes" --kind milestone -p writing --target 2026-12-01 --needs MA12,MA13

Each one can have a doc with its theme, acceptance criteria, and release notes. Start one with kb plan milestone "Essay publishes" --epics MA14. When it ships, run kb ship MA14, or choose Ship it in the Inbox. Epics it needed that aren't finished or in Review move to the next milestone in the same project, or to the one you name with --next MA15. Use --keep to ship without moving them. A milestone is at risk if a dependency is blocked, a dependency is dated after it, or dependencies are open with 7 days or fewer left.

Recurring reports

kb report add "App daily usage" --thread <codex-thread-id> -p my-app --schedule "Daily at 2:00"

The Reports panel on the board links to each report's thread, filtered by project. A report job can also post a dated copy with kb report post "App daily usage" report.md, which keeps its history in products/my-app/reports/ where people and agents can read it.

Commands

kb --help lists everything. These are the ones you'll use most:

kb                               the board across projects (-p my-app, --kind testing, --all, --json; same as kb list)
kb next --as codex               best card for you, changes nothing
kb inbox                         what's waiting on you (--order blocked,review,plans to change it)
kb show MA12                     one card in full
kb claim --as codex              take the best card (or: kb claim MA12 MA13 --as codex)
kb claim MA12 --as codex --asked "..."   take a Backlog card you asked for, in your words
kb confirm MA12                  confirm work claimed on your word (--stop sends it back)
kb add "title" --done-when "..."  add an epic to Backlog
kb add "title" --to scratchpad   save a note or idea
kb plan testing "Search" --epics MA14
kb push MA12 MA13 --to claude    hand epics over, with or without a plan
kb wait MA12 MA13                sleep until they reach Review or get stuck
kb wake MA12 MA13                have this Codex session resumed when they finish
kb set MA12 needs "MA9"          change a field
kb note MA12 "text" --as codex   add a dated note
kb block MA12 "reason"           flag a card as stuck (kb unblock MA12 clears it)
kb block MA12 "Which?" --option A --option B   ask with choices
kb answer MA12 "text"            answer a blocked card; it becomes a decision (--implies MA13,MA14)
kb decide "text" --implies MA12  record a decision (--supersedes D3 replaces one)
kb why MA12                      the decisions behind a card
kb test-plan MA12                start the epic's testing plan, before you build
kb review MA12 --as codex --tested "what ran, what passed" --note "text" --link https://preview.example.com
kb send-back MA12 "text" --reason mismatch   send Review work back (broken, unclear, missing, other)
kb bar MA12 keep                 keep an agent's done-when change (or: undo)
kb ship MA14                     mark a milestone reached; unfinished epics move on
kb health                        everything stuck, since when, and who's next
kb digest                        a Markdown briefing, secrets removed (--out file --watch)
kb resume --as claude            start of a session: what you hold and what came back
kb move MA12 next --top          move or release a card
kb delete MA12                   move a card to TRASH.md (kb restore MA12 undoes it)
kb calendar                      milestones and their dependencies
kb docs                          product docs and plans
kb projects                      connected projects and their card letters
kb archive                       move Done cards to ARCHIVE.md
kb history                       local snapshots of your workspace
kb open                          open the web board, starting it if needed
kb serve                         run the web board in this terminal

Update or remove

cd ~/bento && git pull

kb uninstall-agents removes what kb install-agents added and leaves your workspace alone. kb service uninstall stops the background service if you turned it on.