beacon-board
A kanban board backed by markdown files, with a CLI that people and coding agents can both drive. Tickets are files in a directory. The board is a single static HTML page. There is no server and no database.
Install
uvx beacon-board --help # run without installing
pipx install beacon-board # or install it
Quickstart
beacon-board init
beacon-board new --app AB --title "First ticket" --type Task
beacon-board build --open
That writes beacon.toml, a tickets/ directory and board.html.
Why the CLI matters
Coding agents are good at writing markdown and bad at remembering which ID comes next. The CLI closes that gap: it allocates IDs atomically, refuses malformed tickets at creation, and reports problems instead of silently dropping files.
Give an agent access to the commands and it can read and update the same backlog you do:
beacon-board list --status Next --json
beacon-board set AB-07 --status Now
beacon-board comment AB-07 "Reproduced on a clean install."
beacon-board agent-docs prints an instruction block to paste into whatever
your assistant reads. Nothing here is specific to one tool.
Tickets
One markdown file per ticket, in tickets/.
# AB-07: [Bug] Search drops the last result
**Epic:** [AB-03 Search overhaul](AB-03-epic-search-overhaul.md)
**Assignee:** rae
**Depends on:** None
**Related:** AB-04
**Estimate:** S
**Type:** Bug
**Status:** Next
## Objective
The final match is missing from every result page.
## Acceptance Criteria
- [ ] Searching a mailbox with exactly one match shows it.
## Acceptance Criteria renders as a checklist, so write items as - [ ] and
tick them to - [x]. Plain bullets render as prose instead, which is why the
section is worth writing consistently. ## Comments holds dated entries,
oldest first: - **2026-08-14:** text.
Three levels: the ID prefix groups tickets into apps, **Epic:** groups them
within an app, and everything else is a ticket. A ticket whose **Epic:** reads
Self is an epic container. With only one prefix in play, the app level
disappears from the board.
Configuration
beacon.toml, found by walking up from the working directory. Every key has a
default, so the file is optional.
[meta]
name = "My Board"
[[apps]]
prefix = "AB"
label = "My Project"
[statuses]
columns = ["Later", "Next", "Now", "Done"]
protected = ["Done"]
[assignees.rae]
label = "rae"
color = "#ffffff"
protected statuses are the ones the CLI refuses to set without --force.
Useful when you want an agent to do the work but not to declare it finished.
Commands
| Command | What it does |
|---|---|
init |
Scaffold a board here |
new |
Create a ticket, allocating the ID |
set |
Change fields on a ticket |
comment |
Append a dated comment |
list |
List tickets, with filters and --json |
show |
Print one ticket |
next-id |
The next free ID for a prefix |
validate |
Report every problem |
build |
Write the board HTML |
doctor |
Print resolved config and paths |
agent-docs |
Print instructions for a coding agent |
Every command takes --help. beacon-board --version prints the version.
Exit codes: 0 ok, 1 usage or runtime error, 2 validation failed, 3
refused by rule. Branch on these rather than on the message text.
Requirements
Python 3.11 or newer. No runtime dependencies.
Contributing
Bug reports and pull requests are welcome on GitHub. To work on it:
python -m pip install -e ".[dev]"
python -m pytest
python -m ruff check .
See CONTRIBUTING.md for the house rules.
Author
Built by Bojan Gasparovic. More work and writing at zeroemdashes.com.
License
MIT.
Generated boards embed Poppins, DM Sans and Fira Code, all licensed under
the SIL Open Font License 1.1. The licence text ships with the package at
beacon_board/templates/fonts/OFL.txt.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file beacon_board-0.1.0.tar.gz.
File metadata
- Download URL: beacon_board-0.1.0.tar.gz
- Upload date:
- Size: 203.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb4cd5b9ca7076cbbf028eefa271e41a1c6d137731a9e57dc29077d72b905dd3
|
|
| MD5 |
60fd3f71802930a1625df952b201a641
|
|
| BLAKE2b-256 |
38754b95fe6c7a07d16542c0d8140b04eaeb0314710c170da5201d0b55016b5c
|
File details
Details for the file beacon_board-0.1.0-py3-none-any.whl.
File metadata
- Download URL: beacon_board-0.1.0-py3-none-any.whl
- Upload date:
- Size: 130.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c76f449834863eea2998e49fb197ce02f1d7633f7f7c7fdf9b97c101745122ac
|
|
| MD5 |
786682354f71ba6cc05320c468e13267
|
|
| BLAKE2b-256 |
51f0993d0560ec645a8fdc3ee6cc46b79a31fa44fee8fd57b3e27ebaaa6f1e6a
|