The 50 First Dates Problem
Coding agent sessions last about ten minutes. When the session ends, everything the agent learned disappears. The next session starts from scratch. You re-explain the project structure, re-describe the bug, re-establish which files matter. Steve Yegge, ex-Amazon, ex-Google, and ex-Sourcegraph, spent a year dealing with this before building Beads.
The standard workaround is a markdown plan file. Write a TODO.md, point the agent at it, and hope for the best. Yegge found this breaks fast: "All they know is what's on disk. If you got competing documents, obsolete documents, conflicting documents... they get dementia."
Markdown plans have no dependencies, no priority ordering, no machine-readable structure, and no compaction strategy. An agent reading a 2,000-line plan file wastes context on closed items and stale notes. The plan file becomes the problem it was supposed to solve.
What Beads Is
Beads (bd) is a dependency-aware issue tracker that stores structured tasks in your git repository. Each task has a hash-based ID (like bd-a3f2), a priority level, a status, and typed dependency links to other tasks. The agent queries Beads at session start, gets back the highest-priority unblocked work, and begins.
Yegge describes it as "orchestration for what you're working on today and this week." It is not a project management tool. It is not Jira. It is a machine-readable memory layer that tells an agent: here is what to do next, here is what blocks it, and here is what you did yesterday.
Git-Native
All state lives in .beads/ as JSONL, committed alongside code. Memory travels with the repo.
Dependency Graph
Four link types: blocks, parent-child, related, discovered-from. Agents resolve work order automatically.
Memory Decay
Old closed tasks get compacted into LLM-generated summaries. Saves context window for active work.
Agent-Agnostic
Works with Claude Code, Codex, AMP, Cursor, or any agent that reads files. JSON output, CLI-first.
Stealth and Contributor Modes
bd init --stealth runs Beads locally without committing to the repo. Good for personal use on shared projects. bd init --contributor routes planning issues to a separate repo, keeping experimental work out of PRs.
Architecture: SQLite + JSONL + Git
Beads uses a dual-storage model. SQLite (.beads/beads.db) handles fast local queries. JSONL (.beads/issues.jsonl) is the git-tracked source of truth that syncs across machines. A background daemon synchronizes the two with a 5-second debounce on JSONL exports.
Hash-based IDs prevent merge collisions when multiple agents or branches touch the same Beads database. This is the key architectural bet: treating git as the distributed database protocol means Beads gets branching, merging, and conflict resolution for free.
| Component | File | Purpose |
|---|---|---|
| Database | .beads/beads.db | SQLite for fast local queries (gitignored) |
| Source of truth | .beads/issues.jsonl | Git-tracked change log, syncs across machines |
| Config | .beads/config.yaml | Local settings (gitignored by default) |
| Daemon | Unix socket | Background sync, 60% less CPU than polling |
The project is migrating to a Dolt backend for version-controlled SQL with cell-level merge and native branching. This would replace the SQLite+JSONL dual model with a single storage layer that has git-like semantics built into the database itself.
Key Commands
Beads is CLI-first. Every command supports --json for machine consumption. Agents interact through the CLI; humans can use the CLI or one of the community-built UIs.
Core Beads workflow
# Initialize Beads in a project
bd init
bd setup claude # Configure for Claude Code
# Create work items
bd create "Refactor auth module" -t epic -p 1 --description="Split monolith"
bd create "Extract JWT validation" -p 2 --parent bd-a3f2
# Session start: find what to work on
bd ready # Shows open issues with no unmet dependencies
# During work
bd update bd-a3f2 --status in_progress
bd show bd-a3f2 # Full issue details + dependencies
# Session end
bd close bd-a3f2 --reason "JWT extraction complete"
bd compact # Summarize old closed issues to save context
bd sync # Export to JSONL for git
# Inspect the dependency graph
bd dep tree bd-a3f2 --direction=both
bd stats # Total issues, open, closedThe bd ready command is the critical one. It resolves the dependency graph and returns only issues that are unblocked and ready for work. An agent starting a new session runs bd ready, picks the top result, and has full context without any human re-explanation.
The Land the Plane Protocol
Session handoffs are where most agent workflows break. The agent does good work, hits the context limit, and the next session has no idea what happened. Beads defines a formal "Land the Plane" protocol for session ends:
1. Run Quality Gates
Lint, test, type-check. Verify the session's work actually compiles before closing out.
2. File Discovered Work
Any new issues found during the session get created as Beads with proper dependency links.
3. Close Finished Issues
Mark completed work with reasons. Update in-progress items with current state notes.
4. Sync and Handoff
Run bd sync, push to git, generate a ready-to-paste prompt for the next session.
One developer using this protocol reported refactoring 315 frontend files in a single 12-hour session while doing other things on the side. The agent worked through compaction cycles, checked Beads for context after each one, and maintained coherence across the full run.
The 80% Rule
That same developer notes agents "are able to do the right thing about 80% of the time, but that's still 20% that needs a human." Beads does not make agents perfect. It makes the 80% reliable enough to run with light supervision. The 20% is where edit accuracy matters most.
Beads vs Claude Code Tasks
An Anthropic engineer explicitly credited Beads as inspiration for Claude Code's Tasks system. The paddo.dev analysis frames this as the "pattern-to-product cycle": community project solves a real problem, platform vendor productizes it.
But Tasks and Beads are not competitors. They operate at different layers.
| Dimension | Beads | Claude Code Tasks |
|---|---|---|
| Scope | Project-level, persists for weeks | Session-level, fresh per invocation by default |
| Storage | .beads/ in git repository | ~/.claude/tasks/ on local machine |
| Agent support | Any agent (Claude, Codex, AMP, Cursor) | Claude Code only |
| Dependencies | 4 link types: blocks, parent-child, related, discovered-from | Task A blocks task B |
| Memory compaction | bd compact summarizes old closed issues | Automatic context compression |
| Setup overhead | Install Go binary, bd init, configure CLAUDE.md | Built-in, zero setup |
| Multi-session | Native, git-backed | Opt-in via CLAUDE_CODE_TASK_LIST_ID env var |
Use Both
The practical answer: use Tasks for within-session coordination when spinning up Claude Code Agent Teams. Use Beads for cross-session project memory that survives across weeks and works with multiple agents. They do not conflict.
Where Beads Fits in the Agent Memory Hierarchy
Production coding agents now implement a recognizable memory hierarchy that mirrors CPU cache design. Beads occupies L2: persistent project state that loads on demand.
| Layer | What | Example |
|---|---|---|
| L1 (always loaded) | Config files, rules | CLAUDE.md, .cursorrules, AGENTS.md |
| L2 (on-demand) | Project state, task memory | Beads (.beads/), Claude Tasks |
| L3 (session) | Conversation history with compaction | Context window + auto-compression |
| L4 (external) | Retrieval for rare queries | Codebase search, documentation lookup |
L1 is tiny but always present. L2 (Beads) is larger and queried at session boundaries. L3 is the live context window, where context rot becomes the primary challenge. L4 is the full codebase, accessed through search tools.
The key insight from this hierarchy: L2 memory (Beads/Tasks) only works if L3 operations are reliable. If the agent loses accuracy when applying edits within a session, the session state it writes back to Beads is corrupted. Memory systems need accurate execution underneath them.
Honest Limitations
Beads is not magic. Yegge himself calls it "a crummy architecture (by pre-AI standards) that requires AI in order to work around all its edge cases." The community has identified several real limitations:
Agents Don't Proactively Use It
Claude and other agents won't query Beads unprompted. You need explicit CLAUDE.md instructions telling the agent to check Beads at session start and end.
Instructions Fade in Long Sessions
As context grows, CLAUDE.md instructions lose weight. The agent may stop following the Land the Plane protocol mid-session.
Session Handoffs Need Manual Triggers
The agent won't automatically run bd sync before a session ends. You need to prompt it or build it into hooks.
Merge Conflicts Still Happen
Hash-based IDs reduce but don't eliminate conflicts when multiple agents edit overlapping work items.
The 29-contributor community is actively building around these edges. VS Code extensions, Emacs modes, Neovim plugins, web dashboards, and multi-agent orchestration layers all exist. The protocol-first design (stable CLI with --json output, JSONL source of truth) makes this possible.
Where Morph Fits: Reliable Edits for Long-Running Workflows
Beads solves the memory problem. It does not solve the execution problem. When an agent picks up a task from Beads and applies a code change, that edit needs to land correctly. A misapplied diff corrupts not just the file but the session state the agent writes back to Beads.
This is where fast apply models become critical infrastructure. Morph processes file edits at 10,500 tokens per second with sub-200ms latency. When an agent is working through a Beads queue of 20 tasks across 12 hours, each edit needs to be fast enough to not bottleneck the workflow and accurate enough to not corrupt the chain.
The combination works like this: Beads tells the agent what to do. The reasoning model (Claude, GPT) figures out the change. Morph applies it to the file. The agent verifies, updates Beads, and moves to the next task. Each layer does one thing.
Fast Apply for Agent Workflows
Morph's apply model handles the edit step in agent pipelines. 10,500 tok/s, sub-200ms latency, and high accuracy on multi-file changes.
Getting Started with Beads
Install and initialize Beads
# Install (requires Go)
git clone https://github.com/steveyegge/beads.git
cd beads
go install ./cmd/bd
# Initialize in your project
cd /path/to/your/project
bd init
# Configure for your agent
bd setup claude # Adds Beads instructions to CLAUDE.md
bd onboard # Interactive setup wizard
# Verify it works
bd stats
bd readyAfter setup, add session bookend instructions to your CLAUDE.md or agent config:
CLAUDE.md integration
## Beads Workflow
At session start:
1. Run `bd ready` to find highest-priority unblocked work
2. Run `bd show <id>` for full context on the chosen task
3. Update status: `bd update <id> --status in_progress`
At session end (Land the Plane):
1. Run quality gates (lint, test, typecheck)
2. Create new issues for discovered work
3. Close completed issues with `bd close <id> --reason "..."`
4. Run `bd sync` to export state
5. Commit and pushThe GitHub repo has detailed quickstart docs, FAQ, and agent-specific configuration guides. The community maintains web UIs (npx beads-ui), TUI interfaces (lazybeads), and editor integrations for VS Code, Emacs, and Neovim.
FAQ
What is Beads for coding agents?
Beads is a git-backed issue tracker built for AI coding agents by Steve Yegge. It stores tasks, dependencies, and agent memory as JSONL files in a .beads/ directory committed to git. When a new session starts, the agent queries Beads to find unblocked work and resumes without re-explanation. It has 17.9K GitHub stars and inspired Claude Code's Tasks system.
How is Beads different from Claude Code Tasks?
Beads operates at project scope and stores memory in git, making it agent-agnostic and persistent across weeks. Claude Code Tasks operates at session scope and stores data in ~/.claude/tasks/. Tasks handles immediate coordination; Beads handles long-term project memory. You can use both without conflict.
Does Beads work with agents other than Claude Code?
Yes. Beads works with Claude Code, OpenAI Codex, Sourcegraph AMP, Cursor, and any agent that reads files. The CLI outputs JSON, and the JSONL format is universal. This agent-agnostic design is one of its main advantages over platform-specific memory systems.
What is the Land the Plane protocol?
A session-end protocol where the agent runs quality gates, files discovered work as new issues, closes finished items, syncs state with bd sync, and generates a handoff prompt for the next session. It prevents context loss between sessions.
Is Beads production-ready?
It is in active use by thousands of developers. Yegge honestly calls it "a crummy architecture (by pre-AI standards) that requires AI in order to work around all its edge cases." The 29-contributor community is building tooling fast: web UIs, editor integrations, and multi-agent orchestration layers. The core is stable; the ecosystem is still maturing.
Do I need Beads if I already use Claude Code Tasks?
Tasks handles within-session coordination. If your work fits inside a single Claude Code session or a few coordinated terminals, Tasks is sufficient. If you need memory that survives across weeks, works with multiple agents, or lives in the git repo alongside your code, add Beads.