Stop dropping tasks. Start sending updates.
For consultants juggling several clients at once. Bentoban is a weekly planner that lives in your terminal: every client gets its own compartment, your day stays focused, and it nags you the moment a task goes stale or someone is waiting on an update.
$ git clone https://github.com/fredrikburman/bentoban && cd bentoban && make installNeeds Go 1.25+. MIT licensed. The command is b.
A replica running in your browser, on a fake week with four clients. Fix the Flags on Home, move cards on the Board, or see each client’s ranked Objectives. The real b reads your markdown files and reloads when they change.
Five clients. One of you.
Every client has its own board, its own notes and its own stakeholders. Nobody keeps the picture across all of them except you, and you’re in a meeting.
That’s where things slip: the update you promised Anna, the due date that crept up while another client ate your week, the Task that’s been “doing” since September.
Bentoban keeps that picture in one place and keeps poking you about it. Gently. Mostly.
Sorry, totally forgot to send that. Wait, that was due Friday? I was sure I'd told you. It's in progress. It has been for a while.
A week, not a backlog.
Endless backlogs are where plans go to die. Bentoban plans in Weeks: you commit to 3–5 results, link the work to them, and check in every day.
- Friday
Commit
Pick 3–5 Commitments for next week. Results that are true or not by Friday (“security controls documented”), not lists of Tasks.
/friday - Each morning
Pick Today
Choose 1–3 Tasks that move a Commitment. Three. Not eleven.
/today - Each evening
Wrap up
What got done, what carries over, who needs to hear about it.
/wrap - Next Friday
Keep or miss
Each Commitment is kept or missed. A missed one is carried, re-scoped or dropped with a reason. Nothing disappears quietly.
b week close
The whole routine, with a worked Week and a cheat sheet, is in the guide.
It nags. Softly, and only about real things.
b computes Flags from your files. They never block anything, and a Flag that’s always on gets ignored, so they stay few and fixable.
Press enter on one and b offers the fix: link it, move it, set a new date, mark it told. Overdue, Due soon and Untold are promises to other people, so those can’t be snoozed.
Overdue KITE-4 Send revised quote: due 2026-10-17, 3 days ago Due soon INT-4 Invoice September: due tomorrow (2026-10-21) Untold ACME-7 Fix currency rounding: done 1 day ago; tell Anna Chase NORD-8 Get VPN access from IT: waiting 6 days on Lars (chased 1×) WIP nord: 2 doing Tasks (limit 1): NORD-9, NORD-11Stale NORD-9 Rotate staging secrets: doing, untouched for 9 days; stuck or abandoned?
- OverduePast its due date.
- Due soonDue within two days.
- UntoldHas news its Notify list has not heard yet.
- WIPMore Tasks in doing than the Client’s limit (one, unless you say otherwise).
- StaleUntouched too long: doing for 3 days, next for 3 weeks.
- ChaseA waiting Task whose chase date has come: time to nudge whoever it waits for.
- No planThe Week has no Commitments at all, though Tasks are doing or next.
You did the work. Did you tell anyone?
Every Task can have a Notify list: the people who should hear about it. When it’s done, when its date moves or when it stops waiting, b marks it Untold until you’ve told them.
Claude drafts the message, you send it, and b told logs it under ## Updates. Next month, when someone asks “did you ever mention that?”, you can prove you did.
Untold since Mon: ACME-7 Fix currency rounding → done Notify: Anna (product owner, ACME Corp) · Slack Hi Anna, the currency rounding fix is live. Totals now round per line, so invoices match the quote again. Send it yourself, then I’ll record it with b told ACME-7. OK?
Plain markdown. Yours forever.
Your work lives in a Brain: a private git repo of plain markdown files, one file per Task with YAML frontmatter.
- Grep it, edit it in your editor, version it with git.
- No database, no account, no sync service.
- No “export your data” button, because it’s already yours.
b synccommits, pulls and pushes to your private remote. That’s the whole sync story.
brain/
├── config.yml
├── weeks/2026-W43.md
└── clients/acme/
├── client.yml
├── context.md
├── notes/2026-10-15-kickoff.md
└── workstreams/pricing/tasks/
└── ACME-3 - build-pricing-calculator.md--- id: ACME-3 title: Build pricing calculator status: doing priority: p1 due: 2026-10-22 commitment: 2026-W43/C1 notify: [Anna] --- ## Plan - [x] sketch UI - [ ] wire the API
A deterministic tool and a thoughtful assistant.
b never calls an LLM. It computes facts and hands them over as JSON. The judgment calls, like what matters today or what next week should commit to, go to optional Claude Code skills.
They propose. You say yes. Nothing is written without it. With make install-claude, every Claude session in any repo starts with your Focus.
Not into AI? Skip it. b is a complete app on its own.
Focus 2026-10-20 (Tue, 2026-W43) Inbox: 3 Commitments: C1 acme: Pricing calculator live for sales (4 tasks, 1 done) C2 nord: Security controls documented (2 tasks, 0 done) C3 internal: September invoiced, every client (1 task, 0 done) Today: ACME-3 Build pricing calculator (acme, doing, C1) NORD-11 Document access controls (nord, doing, C2) INT-4 Invoice September (internal, doing, C3) Flags: Overdue KITE-4 Send revised quote: due 2026-10-17, 3 days ago Due soon INT-4 Invoice September: due tomorrow (2026-10-21) ... 6 more
/todayMorning. Proposes 1–3 Tasks that move this Week’s Commitments, and what to park./wrapEvening. What got done, what carries over, who needs an update./fridayReviews the Week, triages the Inbox, and helps you commit to the next one./tellDrafts the message for a Task’s Notify list, or a whole Client update./note-actionsPulls action items out of meeting notes, and turns the ones you confirm into Tasks./onboard-clientInterviews you about a new engagement and drafts its Context, Workstreams and Tasks.
Client stuff stays put.
On your machine
Everything lives in your own repo. No account, no server, nothing to sign up for.
No phoning home
bmakes no network calls of its own. Onlyb syncreaches the network, through git, to the remote you set up.AI opt-out per Client
ai: falsein aclient.ymlhides that Client from all JSON, Focus and every Claude session. The TUI still shows it, for your eyes only.
Install
Four commands, about a minute. Everything stays in plain files on your machine.
Install b
Builds the binary and puts it in ~/.local/bin. Needs git, make and Go 1.25+. Make sure that folder is on your PATH.
$ git clone https://github.com/fredrikburman/bentoban $ cd bentoban && make install
Create your Brain
The Brain is a plain folder of markdown files, and it is all your data. This also writes ~/.config/b/config.yml so b can find it.
$ b init ~/brainAdd a client and a first Task
Every Task belongs to a Client. The key (ACME) becomes its Task IDs, like ACME-1.
$ b client new acme --key ACME --name "ACME Corp" $ b add "Build pricing calculator" -c acme
Open the board
$ b
Optional extras
- Claude Code rituals. Run
make install-claudein the repo (needsjq). - Back it up. Give the Brain a private git remote. It holds your client work, so never make that repo public.