beads — dependency-aware issue tracker for agents
beads (bd) stores work as a graph of beads (issues) in a version-controlled Dolt database. bd ready computes the claimable frontier — open issues with no open blockers — so an agent that lost its context can ask what can I work on right now? instead of re-reading a rotting plan file. It is not Jira: the graph, not a human dispatcher, decides what is next.
Overview
- Ready queue over flat lists —
bd readyexcludes anything blocked, in progress, deferred, or gated.bd list --status openis not the same thing. - Hash IDs —
bd-a1b2is derived from content, not a counter, so concurrent agents and branches never collide and merges never renumber. - Typed dependencies — blocking (
blocks,parent-child,conditional-blocks,waits-for) vs annotation-only (discovered-from,related,tracks,caused-by, …). - Workflows — a formula (TOML) is
bd cooked into a proto, thenbd mol poured into a molecule of real beads; wisps are the ephemeral variant, gates park a step on a PR, CI run, timer, or human sign-off. - Dolt sync, not git refs you fight with — issue data rides
refs/dolt/dataon the existing remote viabd dolt push/bd dolt pull..beads/issues.jsonlis a passive export, not the database and not a backup. - Agent-first output — nearly every command takes
--jsonagainst a versioned schema contract.
Quick Start
brew install beads # or: npm install -g @beads/bd
bd init --quiet # non-interactive init for agents
bd create "Set up database" -p 1 -t task --json
bd dep add <child-id> <blocker-id> # blocker must close first
bd ready --json # the claimable frontier
bd update <id> --claim # take it atomically
bd close <id> --reason "done"
bd dolt push # share with the team
Agent rules
- Install
bdif it is missing — checkbd version; if absent usebrew install beads,npm install -g @beads/bd, or the install script. Never hand-roll ago build. - Never invent issue IDs. IDs are hashes minted by
bd create. Read them back from the command's--jsonoutput; never guess, extrapolate, or renumber (bd-1,bd-2in the docs are illustrative only). - Always pass
--jsonwhen the output feeds a decision — the schema is a stable contract (json-schema). - Work discovered mid-task becomes a bead with provenance:
bd create "…" --deps discovered-from:<current-id> --json. It links without blocking. - Ask the graph, do not scan it —
bd ready --json, thenbd ready --explain --jsonwhen something you expected is missing. - Close with a reason, and
bd dolt pushbefore the session ends or work is lost to the next clone.
Documentation
Getting started
- Intro · Installation — every install path, components (CLI / plugin / MCP), platform notes
- Quickstart — init, create, depend, ready, claim, close, sync
- IDE setup —
bd setuprecipes, hooks, instruction files - Versions & drift — authored: which version the docs describe vs the current release
Core concepts
- How beads works — the graph, ready work, storage modes, the whole model in one page
- Issues · Dependencies & gates — fields, types, priorities, edge semantics
- Hash IDs — why IDs are hashes and what that buys concurrent agents
- Sync concepts — Dolt as source of truth, and what JSONL export is not
Workflows
- Workflows — formula → proto → molecule in three phases
- Formulas · Molecules · Gates · Wisps
Reference
- CLI reference — index of every top-level
bdcommand - JSON schema contract — the
--jsonenvelope and per-command fields - Claude Code integration —
bd setup claude, the SessionStartbd primehook - Upstream README — the project's own overview
Common Workflows
- Adopt beads in a repo:
bd init --quiet→bd setup claude(SessionStart hook runsbd prime) → seed beads →bd dolt push. - Work a session:
bd ready --json→bd update <id> --claim→ work →bd close <id> --reason "…"→ repeat untilbd readyis empty →bd dolt push. - Break down an epic:
bd create "Auth System" -t epic --json, thenbd create "…" --parent <epic-id>per child; inspect withbd dep tree <epic-id>. - Repeatable pipeline: write
release.formula.toml→bd cook release.formula.toml→bd mol pour release --var version=X→bd ready --mol <mol-id>. - Something you expected is not ready:
bd ready --explain --json, thenbd blocked,bd dep cycles,bd doctor.
Upstream Sources
- Repository: https://github.com/gastownhall/beads
- Documentation: https://beads.gascity.com (every page is served as Markdown;
/llms.txtis the index)
Sync & Update
When the user runs sync: re-fetch the docs-site Markdown pages and the upstream README listed in sync.json, and update docs/. Check /llms.txt for pages added upstream that are not yet sources.
When the user runs diff: compare cached docs/ against upstream and report what moved — including whether the docs' stated release still lags the latest tag (see versions).