The contributor problem
You fork an OSS project that uses beads. Every planning bead you create writes to the fork’s.beads/ data, and your fork’s issue database now diverges from
upstream in every PR you open. What you want is to plan freely about the
project without planning in the project.
Routing solves this by detecting your role and redirecting bd create to a
separate planning repository (~/.beads-planning by default) that is never
pushed upstream.
How routing decides
When you runbd create, the target repository is chosen in strict
precedence order:
--repo <path>— explicit override, always winsrouting.mode: auto— route by detected role (maintainer or contributor)routing.default— everything else (defaults to., the current repo)
bd list and bd ready
read from the routed repository, and ID lookups like bd show fall back to
the routed repository when a bead isn’t found locally.
Role detection
The role that drives auto mode comes from git config —beads.role is the
source of truth:
beads.role is unset, bd prints a warning and falls back to a
deprecated remote-URL heuristic:
SSH does not reliably indicate push access — fork contributors often clone
over SSH. Set
beads.role explicitly and the heuristic (and its warning)
never runs.Setup
Contributors
- Creates the planning repository (
~/.beads-planningby default) as its own git repo with a.beads/directory - Sets
routing.mode: autoandrouting.contributorto the planning repo - Adds the planning repo to
repos.additionalso routed beads stay visible (see hydration) - On forks, points sync at the
upstreamremote sobd dolt pullfetches issue data from the source repo rather than your fork
bd init also detects the fork pattern (an upstream remote that
differs from origin) and applies the same contributor configuration
automatically; pass --role maintainer to opt out.
Teams
Configuration reference
Set these withbd config set <key> <value>; see the
configuration reference for storage locations.
Verify the effective configuration and where each value comes from:
Overriding per bead
--repo bypasses routing entirely for one bead:
Discovered work stays with its parent
A bead created with adiscovered-from dependency inherits its parent’s
source_repo, so work discovered while executing a task stays attributed to
the same repository as that task — regardless of your role:
--repo to override the inheritance.
Multi-repo hydration
Routing writes beads to another repository — which means your current database doesn’t contain them. Hydration imports beads from other repos into your database, each tagged with itssource_repo, so bd list and
bd ready show one unified view.
Configure it by listing the other repos in repos.additional:
bd repo sync reads each additional repo’s .beads/issues.jsonl export and
imports the beads with their original prefixes and source_repo set,
skipping repos whose export hasn’t changed. bd init --contributor wires
hydration up automatically; bd doctor warns when routing targets are
missing from repos.additional.
Once hydrated, beads from other repos are ordinary rows in your database —
filter by provenance or link them with normal dependencies:
bd dep add also accepts external:<project>:<capability> targets —
see bd dep.
One agent, many projects
An AI agent working across several repositories should run a single beads MCP server instance:.beads/embeddeddolt/ by
default; server mode uses .beads/dolt/). Running one MCP instance per
project invites operations landing in the wrong database.
To share one Dolt server across all projects instead of embedded per-project
storage, initialize with bd init --shared-server (or set
BEADS_DOLT_SHARED_SERVER=1): projects share a server at
~/.beads/shared-server/ while staying isolated in per-project databases
named after their issue prefixes. See MCP Server
for installation and client configuration.
Troubleshooting
Beads land in the wrong repository
bd config set beads.role maintainer),
forcing the target for one bead (--repo .), or disabling role detection
entirely (bd config set routing.mode explicit).
Routed beads don’t appear in bd list
The routing target isn’t being hydrated. Add it and sync:bd doctor catches this misconfiguration.
Discovered beads appear in the “wrong” repo
Intentional — beads with adiscovered-from dependency inherit the parent’s
source_repo. Override with --repo at creation time.
Planning beads show up in upstream PRs
The planning repo must be a separate git repository, never committed to the fork:Role warning on every bd create
bd warns when it falls back to the URL heuristic. Silence it permanently:
Related pages
- Multi-Repo Migration — full setup walkthroughs for contributor, team, and multi-phase workflows
- Agent Coordination — assigning and claiming work between agents
- Federation — peer-to-peer sharing of beads across repos and organizations
bd init,bd config,bd repo,bd create— command reference