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.
Metadata
Release files for beacon-board 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| beacon_board-0.1.0.tar.gz | 203.9 kB | Without provenance | Details for beacon_board-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| beacon_board-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for beacon_board-0.1.0-py3-none-any.whl |
Total release size: 334.5 kB
Release files / beacon_board-0.1.0.tar.gz
| Download URL | beacon_board-0.1.0.tar.gz |
|---|---|
| Size | 203.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bb4cd5b9ca7076cbbf028eefa271e41a1c6d137731a9e57dc29077d72b905dd3
|
|
BLAKE2b-256 checksum How to use checksums |
38754b95fe6c7a07d16542c0d8140b04eaeb0314710c170da5201d0b55016b5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / beacon_board-0.1.0-py3-none-any.whl
| Download URL | beacon_board-0.1.0-py3-none-any.whl |
|---|---|
| Size | 130.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c76f449834863eea2998e49fb197ce02f1d7633f7f7c7fdf9b97c101745122ac
|
|
BLAKE2b-256 checksum How to use checksums |
51f0993d0560ec645a8fdc3ee6cc46b79a31fa44fee8fd57b3e27ebaaa6f1e6a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Security for beacon-board 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.