A minimal, markdown-based drop-in replacement for steveyegge/beads written in Rust.
minibeads (mb) is a dependency-aware issue tracker designed for AI agent workflows. Issues are stored as markdown files with YAML frontmatter, making them both human-readable and git-friendly. The tool emphasizes simplicity, with no database required—just markdown files in .minibeads/issues/.
- Markdown-only storage: No SQLite, no JSONL—just
.mdfiles - Dependency tracking: Issues can block each other, with automatic detection of ready work
- AI-friendly: Full MCP (Model Context Protocol) integration for AI agents
- Fast: Rust implementation with coarse-grained file locking
- Drop-in replacement: Compatible with upstream beads MCP server (https://github.com/steveyegge/beads)
cargo install minibeadsThis installs the mb binary (short for "minibeads"). To use minibeads as a
drop-in replacement for upstream beads
(e.g., with the beads MCP server), alias or symlink it to bd:
# Symlink approach
ln -s $(which mb) ~/.local/bin/bd
# Or shell alias
alias bd=mbUse Rust 1.87 or newer (required by the build-time metadata helper).
# Clone the repository
git clone https://github.com/rrnewton/minibeads.git
cd minibeads
# Build in debug mode (recommended for development)
make build
# Or build release version
make release
# Install to ~/.local/bin
make installThe binary will be named mb (short for "minibeads").
# Initialize a beads database in your project
mb init
# Create your first issue
mb create "Fix login bug" -p 1 -t bug
# List all issues
mb list
# Show issue details
mb show mb-1
# Update issue status
mb update mb-1 --status in_progress
# Add dependencies (mb-2 blocks mb-1)
mb dep add mb-1 mb-2
# Find ready work (no blockers)
mb ready
# Get statistics
mb statsRun mb quickstart for a comprehensive guide.
minibeads stores all data in .minibeads/issues/ as markdown files. Existing
projects with .beads/ continue to work as a legacy fallback until you move the
directory.
.minibeads/
├── config.yaml # Contains issue-prefix
├── .gitignore # Auto-managed (minibeads.lock, command_history.log)
├── issues/
│ ├── myproject-1.md # Issue files with YAML frontmatter
│ └── myproject-2.md
├── comments/ # Optional per-issue comment JSON files
└── github-sync-state.json # Last-synced GitHub ancestry state, when used
Each issue is a markdown file with YAML frontmatter:
---
title: Fix authentication bug
status: in_progress
priority: 1
issue_type: bug
assignee: alice
depends_on:
myproject-5: blocks
created_at: 2025-10-30T10:00:00Z
updated_at: 2025-10-30T11:00:00Z
---
# Description
User sessions expire too quickly. Need to extend timeout to 24 hours.
# Design
Update session middleware to use configurable timeout from environment variable.
# Acceptance Criteria
- [ ] Session timeout configurable via SESS_TIMEOUT env var
- [ ] Default remains 1 hour if not set
- [ ] Tests pass for various timeout valuesminibeads works seamlessly with AI agents via the beads MCP server. Agents can:
- Create, update, and close issues
- Query dependencies and find ready work
- Track progress across sessions using the markdown history
Set BEADS_DB or MB_BEADS_DIR environment variables, or let the MCP server auto-discover .minibeads/ in your project.
# Run all tests (unit + e2e)
make test
# Run full validation (Rust tests + e2e + fmt + clippy)
make validate
# Run longer randomized/stress suites
make stress-test
# Format code
make fmtsrc/
├── main.rs # CLI entry point and command handlers
├── storage.rs # File-based storage operations
├── format.rs # Markdown serialization/deserialization
├── types.rs # Core data structures (Issue, Status, etc.)
└── lock.rs # Coarse-grained file locking
tests/
├── e2e_tests.rs # Test harness
└── basic_operations.sh # Shell-based e2e tests
- Human-readable: Issues are plain text files you can read, edit, and grep
- Git-friendly: Diffs, merges, and history work naturally
- Simple: No schema migrations, no database corruption, no SQL
- Portable: Copy
.minibeads/anywhere, it just works
- Performance: Faster than Go for file operations
- Safety: No null pointers, no data races
- Zero-copy: Minimize allocations (see CLAUDE.md for patterns)
- Small binary: Single ~23MB binary with no runtime dependencies
minibeads uses coarse-grained locking with .minibeads/minibeads.lock containing the process PID. Operations use exponential backoff (up to 5 seconds) when lock is held. This is simpler than upstream's per-issue locking and sufficient for AI agent workflows.
mb init [--prefix PREFIX]- Initialize beads databasemb create TITLE [OPTIONS]- Create new issuemb list [FILTERS]- List issues with optional filtersmb show ISSUE_ID- Show detailed issue informationmb update ISSUE_ID [OPTIONS]- Update issue fields--search TEXT --replace TEXT [--field FIELD] [--replace-all]- targeted, aider-style edit of a text field (defaultdescription) instead of overwriting it wholesale. By default the search text must match exactly once; a missing or ambiguous match is an error and the issue is left untouched. This is the recommended way for agents to revise a long description — far safer than rewriting the whole field. (minibeads-specific)--append TEXT [--field FIELD]- appendTEXTto the end of a text field (defaultdescription), inserting a blank line before it when the field is non-empty so it becomes its own paragraph. Simpler than a search/replace when you only want to add to the end. (minibeads-specific)
mb close ISSUE_ID [--reason REASON]- Close (complete) an issuemb reopen ISSUE_ID...- Reopen closed issuesmb comments add ISSUE_ID --body TEXT- Add a local issue commentmb comments list ISSUE_ID- List local issue commentsmb comments delete ISSUE_ID COMMENT_ID...- Delete local issue comment(s) by ID (minibeads-specific)
mb dep add FROM TO [--type TYPE]- Add dependency- Types:
blocks(default),related,parent-child,discovered-from
- Types:
mb ready [--assignee USER] [--priority N]- Find ready work (no blockers)mb blocked- Show blocked issues and what blocks themmb stats- Show statistics (total, open, blocked, average lead time)mb list --github- Show only issues linked to GitHub Issues
minibeads can sync a subset of issues with GitHub Issues using the authenticated
gh CLI. Linked issues store the GitHub issue URL in external_ref; unlinked
issues are ignored.
mb github link ISSUE_ID GITHUB_ISSUE [-R owner/repo]- Link to an existing GitHub issuemb github list- Show current minibeads-to-GitHub issue linksmb github import [-R owner/repo] [--state open|closed|all] [--label LABEL] [--assignee USER] [--author USER] [--mention USER] [--milestone M] [--app APP] [--search QUERY] [--limit N] [--dry-run] [--quiet|--verbose]- Import matching GitHub issues that are not already linked to minibeads issuesmb github publish ISSUE_ID [-R owner/repo]- Create a GitHub issue and link itmb github sync [ISSUE_ID...] [-R owner/repo] [--dry-run] [--quiet|--verbose]- Bidirectionally sync linked issuesmb github stress-test -R owner/repo [-n N] [--steps N] [--seed N] [--adversarial] [--verbose]- Create real temporary GitHub issues in a disposable repo and run seeded randomized sync stress tests
Synced fields are title, description/body, open/closed state, and comments.
minibeads keeps .minibeads/github-sync-state.json as the last-synced ancestry
record so it can distinguish local-only changes, GitHub-only changes, and
both-sides conflicts. Labels, priority, assignee, dependencies, and other
minibeads-specific metadata remain local for now.
Comment sync propagates deletions in both directions. The sync state pairs each
synced local comment with its GitHub comment id, so deleting a comment on one
side (for example with mb comments delete) deletes its counterpart on the
other side on the next sync, rather than re-importing it. Pull-only sync
(--pull-only) applies GitHub-side deletions locally but never deletes on
GitHub.
Linked GitHub issues get a marker comment containing MB_DO_NOT_SYNC so people
viewing the GitHub issue can see which local minibeads issue owns the sync. That
marker comment is ignored by comment sync and is not imported into minibeads.
mb github import only creates local issues for GitHub issues whose URL is not
already present in any local issue's external_ref; already linked issues remain
the responsibility of mb github sync.
By default, mb github sync prints one informative line per linked issue plus a
summary. Use --quiet for only the summary line, or --verbose to include
field/comment details under each issue and print each underlying gh CLI call
with elapsed time to stderr.
Design note: upstream Beads has an external_ref field and import/collision
logic around it, but does not provide this exact GitHub sync workflow in the
vendored version. minibeads uses the same external_ref idea for the URL and
keeps the sync ancestry outside the issue markdown to avoid churning normal
issue fields.
--db PATH- Path to .minibeads directory--json- Output JSON format--mb-validation MODE- Validation mode: silent, warn, error (default) [minibeads-specific]--mb-no-cmd-logging- Disable command history logging [minibeads-specific]
- All MCP operations work identically
- Command-line interface is compatible
- Issue semantics (status, priority, dependencies)
- No SQLite database: Markdown is the only storage
- No issues.jsonl: Markdown files are the source of truth
- Simpler locking: Coarse-grained lock instead of per-issue locks
- File-backed comments: Comments are stored separately from issue markdown
- Better markdown sanitization: Auto-escapes section headers in user content
To export for upstream beads compatibility, use mb export (planned in minibeads-11) to generate issues.jsonl. Bidirectional sync (minibeads-12) will enable hybrid workflows.
See .minibeads/issues/ for tracking:
- minibeads-9: Comments data model
- minibeads-10: Events/audit trail
- minibeads-11: Export to issues.jsonl format
- minibeads-12: Bidirectional jsonl/markdown sync
- minibeads-7: Colorful CLI output
MB_BEADS_DIR- Path to .minibeads directory [minibeads-specific]BEADS_DB- Path to .beads database (supports.dbextension for compatibility)BEADS_WORKING_DIR- Working directory for MCP operations
- Read
CLAUDE.mdfor coding conventions (strong types, zero-copy patterns) - Read
OPTIMIZATION.mdfor performance guidelines - Use
make validatebefore committing - Follow commit message format (see recent commits)
MIT License. See LICENSE for details.
- Upstream beads: https://github.com/steveyegge/beads
- MCP specification: https://modelcontextprotocol.io