beacon-board icon

beacon-board

A kanban board backed by markdown files, with a CLI that people and coding agents can both drive.

Python 3.11+ · no runtime dependencies · MIT

Tickets are files in a directory. The board is a single static HTML page. There is no server and no database, so the backlog lives in your repository, moves with it, and reviews like code.

board.html
The beacon-board kanban board with Later, Next, Now and Done columns

One static HTML page, rebuilt from the ticket files on demand.

Install and run
uvx beacon-board --help     # run it
pipx install beacon-board   # or keep it
beacon-board init
beacon-board new --app AB \
  --title "First ticket" --type Task
beacon-board build --open
# AB-07: [Bug] Search drops a result
**Assignee:** rae
**Type:** Bug
**Status:** Next
## Objective
The final match is missing from
every result page.
Why it exists
AgentsA backlog an agent can drive

Coding agents are good at writing markdown and bad at remembering which ID comes next. The CLI allocates IDs atomically, refuses malformed tickets at creation, and reports problems instead of silently dropping files.

GuardrailsProtected statuses

Mark a column protected and the CLI refuses to set it without --force. Useful when you want an agent to do the work but not to declare it finished.

StructureThree levels, no ceremony

The ID prefix groups tickets into apps, the epic field groups them within an app, and everything else is a ticket. With one prefix in play, the app level disappears from the board.

ScriptingExit codes you can branch on

0 ok, 1 usage or runtime error, 2 validation failed, 3 refused by rule. list --json gives machine-readable output, so pipelines never parse message text.

Where it came from

beacon-board started as Beacon, the private ticket store behind everything else on this site. Bouncer, FLY, JUMP and LoadBear were all built against it, with the agents reading and writing the same files I did. It was extracted and published once it had earned the trust.

Run beacon-board agent-docs to print an instruction block to paste into whatever your assistant reads. Nothing in it is specific to one tool.