•👤 By Richard Scorer•
GoBeadsProductivityArchitectureDeveloper Tools

Falling in Love with Beads Again (Across 35 Repositories)

Why repo-local Git issue tracking is brilliant, where it breaks when you scale across dozens of projects, and how we built Beads Everywhere to cure our cd fatigue.

A few months ago, I had an epiphany while managing tasks for my software projects.

I found beads. Beads provided an incredibly useful task management system for my projects. Not only could I work with the list of tasks, but my coding agent could also see and use the list.

Then came Beads (beads_rust / br), following the original bd concept. This is a Rust rewrite at a specific point in the evolution of beads, i.e. before Gas Town!

So now instead of my tasks living on an external server, my issues live directly inside my repository in a lightweight .beads/ database, synced to a plaintext issues.jsonl file versioned right alongside the code.

  • ⚡️ Sub-Millisecond Execution: Checking what needs doing (br ready) takes < 1ms.
  • 🔒 100% Sovereign & Offline: Works on trains, airplanes, or during internet outages.
  • 🤖 AI-Agent Ready: Autonomous coding agents don’t need OAuth tokens or web scrapers—they query br ready --json or parse the local JSONL directly.
  • 🔀 Branch-Aware: When you create tasks on a feature branch, they travel with that branch. When you merge your PR, the task state merges alongside the code diff.

It was love at first commit.


🛑 The Wall: Scaling to 35 Repositories

Like many solo developers, my workspace isn’t a massive corporate monorepo.

I maintain microservices, CLI tools, libraries, infrastructure configurations, and open source utilities. Over a few months of enthusiastic adoption, Beads spread across my entire machine: 35 active workspaces.

And that’s where the local-first model hit a functional wall: it has no peripheral vision.

When your issue databases live inside 35 separate folders, you run into two daily frustrations:

1. The Context-Switching Tax

Imagine you’re deep in ~/projects/frontend-ui, fixing a subtle responsive CSS layout bug. While testing an edge case, you spot that an API endpoint in ~/projects/backend-api is returning a null field unexpectedly.

In a purely repo-local setup, you have two equally bad options:

  1. Break flow: Stop what you’re doing, open a new terminal or run cd ../backend-api, execute br create --title="..." --type=bug, and cd back to your frontend. By the time you return, you’ve completely shattered your working memory.
  2. Postpone it: Tell yourself “I’ll log that bug once I finish this CSS component.” (Spoiler: you won’t. You’ll forget by lunch).

2. The Morning Triage Blind Spot

You sit down at your desk with your morning coffee. What is actually ready and unblocked to work on today across your entire machine?

Running cd project1 && br ready, cd project2 && br ready, cd project3 && br ready 35 times is exhausting. You end up only checking the two projects top of mind, while actionable P1 tasks in secondary repositories gather digital dust.


🩺 The First Fix: beads-doctor

There was another operational quirk of scaling across 35 local databases: schema drift.

br is actively developed and continually improving. Occasionally, an update introduces an internal database schema migration.

When you have 35 repositories, you touch some every day and others once a month. I would frequently cd into an older project weeks later, run br list, and suddenly hit unexpected schema errors because that workspace was two versions behind.

My initial solution was a Python script in ~/bin/beads-doctor. Using a ThreadPoolExecutor, it walked my workspace directories, audited all 35 .beads databases in parallel, and automatically executed:

br doctor migrate-schema plan --json
br doctor migrate-schema apply --plan-token <token>

It solved the maintenance headache, but it made something glaringly obvious:

We didn’t need to abandon local-first task tracking. We just needed a bird’s-eye view.


🐝 Enter beads everywhere (be)

We built Beads Everywhere (be) as a standalone Go aggregator.

It doesn’t replace Beads—it orchestrates it. Your data stays sovereign and decentralized inside each project’s .beads/ directory. be simply provides the telescope.

🐝 Beads Everywhere (be) - Universal multi-repo issue aggregator and command center

Available Commands:
  scan        Scan filesystem roots for all repositories tracked with Beads
  repos       List all tracked repositories and active issue counts
  ready       List all actionable, unblocked issues across all fleet projects
  create      Create a new issue in any fleet repository from anywhere
  search      Search issues across all repositories in the fleet
  doctor      Audit fleet repository health and automatically migrate schemas
  sync        Flush and sync all Git repositories tracked in Beads Everywhere
  web         Start the Beads Everywhere web command center

Here is how it changes daily development:

1. One Command for Morning Triage (be ready)

Instead of directory hopping, running be ready scans your registered workspaces and prints a global, unified queue of unblocked work across your entire computer:

$ be ready
PRIORITY  PROJECT       ID        TITLE
P1        agentic_ssh   iss-142   Investigate SSH keepalive drops under heavy concurrency
P1        sparks        iss-89    Update Schengen zone calculation edge cases
P2        auth-service  iss-34    Rotate local dev signing certs

You get an instant, machine-wide snapshot of what to tackle next in under 10 milliseconds.

2. Fire-and-Forget Quick Capture (be create)

When you’re working in frontend-ui and notice that backend-api bug, you never have to leave your directory:

be create -r backend-api -t "User profile endpoint returns null for unverified emails" -p 1 --type bug

It resolves the target repository path, invokes br create under the hood, and logs the task directly into the correct Git-tracked database. Zero context switching, zero lost thoughts.

Can’t remember which project had that note about configuring libwebsockets?

be search "libwebsockets"

It searches across all 35 repositories on disk in milliseconds.

4. Fleet Health & Batch Migrations (be doctor)

We integrated the original beads-doctor script directly into the Go binary. Running be doctor (or be migrate) audits all your workspaces in parallel and auto-applies pending schema updates:

$ be doctor -q
🩺 Running fleet doctor & schema migration check...
✨ Audited 35 workspaces: 35 healthy.

If a repository database ever gets into a degraded state, be doctor -r automatically repairs it across the entire fleet.

5. Fleet Git Sync (be sync)

Before closing your laptop or committing across multiple projects, be sync runs a parallel export across all tracked repositories, ensuring .beads/ SQLite databases are cleanly flushed to their Git-tracked issues.jsonl files.


🖥️ When You Want a UI: be web

Sometimes you don’t want terminal tables; you want an ambient visual board while drinking your coffee.

Running be web launches a local dashboard on http://localhost:8425:

be web

Ruthlessly Simple Architecture

We intentionally built beads everywhere with strict engineering constraints:

  • Zero Node.js / React Runtime: No megabyte-sized client bundles, no hydration delays, no webpack or Vite configuration.
  • Go + Embedded Templates (//go:embed): The HTML templates and static assets are baked directly into the single Go binary.
  • HTMX: Powers reactive modal triage, inline filtering, and dynamic updates with pure HTML over the wire.
  • Tailwind CSS v4: Embedded and pre-minified to a tiny 12KB stylesheet.
  • Resource Footprint: Starts in < 5ms and uses < 15MB of RAM.

You can keep it running in a browser tab all day without hearing your laptop fans spin up.


💡 The Takeaway

Local-first, Git-tracked issue management with Beads is one of the best things to happen to software development in years. Storing tasks right beside your source code gives you speed, sovereignty, and seamless AI agent collaboration.

You don’t have to sacrifice that sovereignty or return to bloated web apps just because you have 35 repositories.

With a lightweight local aggregator like beads everywhere, you get the best of both worlds: the isolation and speed of repo-local Git storage, paired with the peripheral vision of a unified cockpit.


📦 Installation

Available across macOS and Linux:

# Via Homebrew
brew install sandbanks/tap/beads_everywhere

# Via Go
go install github.com/sandbanks/beads-everywhere/cmd/be@latest
RS

Richard Scorer

Independent software engineer building high-performance, sovereign tools and agentic primitives at sandbanks.tech.