Beads uses Dolt as its storage backend. Dolt provides a version-controlled SQL database with cell-level merge, native branching, and multi-writer support via server mode.
- Native version control — cell-level diffs and merges, not line-based
- Multi-writer support — server mode enables concurrent agents
- Built-in history — every write creates a Dolt commit
- Native branching — Dolt branches independent of git branches
# Embedded mode (single writer)
bd init
# Server mode (multi-writer)
gt dolt start # Start the Dolt server
bd init --server # Initialize with server modeIf upgrading from an older version that used SQLite:
# Preview the migration
bd migrate --to-dolt --dry-run
# Run the migration
bd migrate --to-dolt
# Optionally clean up SQLite files
bd migrate --to-dolt --cleanupMigration creates backups automatically. Your original SQLite database is preserved as beads.backup-pre-dolt-*.db.
Single-process access to the Dolt database. Good for development and single-agent use.
# .beads/config.yaml (or auto-detected)
dolt:
mode: embeddedCharacteristics:
- No server process needed
- Single writer at a time
- Direct database access
Connects to a running dolt sql-server for multi-client access.
# Start the server (Gas Town)
gt dolt start
# Or manually
cd ~/.dolt-data/beads && dolt sql-server --port 3307# .beads/config.yaml
dolt:
mode: server
host: 127.0.0.1
port: 3307
user: rootServer mode is required for:
- Multiple agents writing simultaneously
- Gas Town multi-rig setups
- Federation with remote peers
Federation enables direct sync between Dolt installations without a central hub.
┌─────────────────┐ ┌─────────────────┐
│ Gas Town A │◄───────►│ Gas Town B │
│ dolt sql-server│ sync │ dolt sql-server│
│ :3306 (sql) │ │ :3306 (sql) │
│ :8080 (remote) │ │ :8080 (remote) │
└─────────────────┘ └─────────────────┘
In federation mode, the server exposes two ports:
- MySQL (3306): Multi-writer SQL access
- remotesapi (8080): Peer-to-peer push/pull
# Add a peer
bd federation add-peer town-beta 192.168.1.100:8080/beads
# With authentication
bd federation add-peer town-beta host:8080/beads --user sync-bot
# Sync with all peers
bd federation sync
# Handle conflicts
bd federation sync --strategy theirs # or 'ours'
# Check status
bd federation status| Pattern | Description | Use Case |
|---|---|---|
| Hub-spoke | Central hub, satellites sync to hub | Team with central coordination |
| Mesh | All peers sync with each other | Decentralized collaboration |
| Hierarchical | Tree of hubs | Multi-team organizations |
Peer credentials are AES-256 encrypted, stored locally, and used automatically during sync:
# Credentials prompted interactively
bd federation add-peer name url --user admin
# Stored in federation_peers table (encrypted)# Check federation health
bd doctor --deep
# Verify peer connectivity
bd federation statusWhen someone clones a repository that uses Dolt backend:
- On first
bdcommand (e.g.,bd list), bootstrap runs automatically - A fresh Dolt database is created
- If a Dolt remote is configured, data is pulled from the remote
- Work continues normally
No manual steps required. The bootstrap:
- Detects fresh clone (no Dolt database yet)
- Acquires a lock to prevent race conditions
- Initializes the Dolt database and pulls from configured remotes
- Creates initial Dolt commit
bd list # Should show issues
bd vc log # Should show initial commitSymptom: Connection refused errors when using server mode.
failed to create database: dial tcp 127.0.0.1:3307: connect: connection refused
Fix:
gt dolt start # Gas Town command
# Or
gt dolt status # Check if runningSymptom: bd list shows nothing on fresh clone.
Check:
ls .beads/dolt/ # Should NOT exist (pre-bootstrap)
BD_DEBUG=1 bd list # See bootstrap outputForce bootstrap:
rm -rf .beads/dolt # Remove broken state
bd list # Re-triggers bootstrapSymptom: Queries fail, inconsistent data.
Diagnosis:
bd doctor # Basic checks
bd doctor --deep # Full validation
bd doctor --server # Server mode checks (if applicable)Recovery options:
-
Repair what's fixable:
bd doctor --fix
-
Rebuild from remote:
rm -rf .beads/dolt bd list # Re-triggers bootstrap
Symptom: "database is locked" errors.
Embedded mode is single-writer. If you need concurrent access:
# Switch to server mode
gt dolt start
bd config set dolt.mode server# .beads/config.yaml
# Dolt settings
dolt:
# Auto-commit Dolt history after writes (default: on for embedded, off for server)
auto-commit: on # on | off
# Server mode settings (when mode: server)
mode: embedded # embedded | server
host: 127.0.0.1
port: 3307
user: root
# Password via BEADS_DOLT_PASSWORD env var| Variable | Purpose |
|---|---|
BEADS_DOLT_PASSWORD |
Server mode password |
BEADS_DOLT_SERVER_MODE |
Enable server mode (set to "1") |
BEADS_DOLT_SERVER_HOST |
Server host (default: 127.0.0.1) |
BEADS_DOLT_SERVER_PORT |
Server port (default: 3307) |
BEADS_DOLT_SERVER_TLS |
Enable TLS (set to "1" or "true") |
BEADS_DOLT_SERVER_USER |
MySQL connection user |
DOLT_REMOTE_USER |
Push/pull auth user |
DOLT_REMOTE_PASSWORD |
Push/pull auth password |
BD_DOLT_AUTO_COMMIT |
Override auto-commit setting |
Dolt maintains its own version history, separate from Git:
# View Dolt commit history
bd vc log
# Show diff between Dolt commits
bd vc diff HEAD~1 HEAD
# Create manual checkpoint
bd vc commit -m "Checkpoint before refactor"In embedded mode (default), each bd write command creates a Dolt commit:
bd create "New issue" # Creates issue + Dolt commitIn server mode, auto-commit defaults to OFF because the server manages its
own transaction lifecycle. Firing DOLT_COMMIT after every write under
concurrent load causes 'database is read only' errors.
Override for batch operations (embedded) or explicit commits (server):
bd --dolt-auto-commit off create "Issue 1"
bd --dolt-auto-commit off create "Issue 2"
bd vc commit -m "Batch: created issues"Gas Town provides integrated Dolt server management:
gt dolt start # Start server (background)
gt dolt stop # Stop server
gt dolt status # Show server status
gt dolt logs # View server logs
gt dolt sql # Open SQL shellServer runs on port 3307 (avoids MySQL conflict on 3306).
~/.dolt-data/
├── beads/ # HQ database
├── beads_rig/ # Beads rig database
└── gastown/ # Gas Town database
After successful migration from SQLite, you may have backup files:
.beads/beads.backup-pre-dolt-20260122-213600.db
.beads/sqlite.backup-pre-dolt-20260123-192812.db
These are safe to delete once you've verified Dolt is working:
# Verify Dolt works
bd list
bd doctor
# Then clean up (after appropriate waiting period)
rm .beads/*.backup-*.dbRecommendation: Keep backups for at least a week before deleting.
- CONFIG.md - Full configuration reference
- GIT_INTEGRATION.md - Git worktrees and protected branches
- TROUBLESHOOTING.md - General troubleshooting