Skip to main content
Contributor mode solves a unique problem: when you fork a project that uses Beads, your personal planning issues can pollute PRs. Contributor mode automatically routes your issues to a separate planning repository.

The problem

When you fork and contribute to a Beads-using project:
Your PR now includes .beads/ changes with your personal planning issue. This causes:
  • Noise in diffs: Reviewers see unrelated issue database changes
  • Merge conflicts: Your issues conflict with upstream issue changes
  • Privacy leakage: Your work habits and notes become public

How contributor mode works

Contributor mode automatically detects your role and routes issues accordingly:
  • Maintainer (SSH access): Issues go to ./.beads/ (project database)
  • Contributor (HTTPS fork): Issues go to ~/.beads-planning/ (personal database)
Role detection is automatic based on git remote URL. SSH access implies write permissions (maintainer), HTTPS without credentials implies fork (contributor).

Setting up contributor mode

1

Run the setup wizard

Navigate to your forked project and run:
This:
  • Creates ~/.beads-planning/ with its own database
  • Configures routing.mode=auto
  • Configures routing.contributor=~/.beads-planning
2

Verify configuration

Check that routing is enabled:
3

Create a test issue

Verify issues route to planning repo:
Check that the issue appears in planning repo, not project repo:

Role detection

Beads auto-detects your role using this algorithm:
  1. Check explicit override: git config beads.role
    • If set to maintainer → Maintainer
    • If set to contributor → Contributor
  2. Check push URL: git remote get-url --push origin
    • Starts with git@ or ssh:// → Maintainer
    • Contains @ (credentials) → Maintainer
    • HTTPS without credentials → Contributor
  3. Default: Contributor (safe fallback)
The algorithm prioritizes safety: when in doubt, route to personal database to avoid accidental pollution.

Explicit role override

For CI environments or shared machines, set explicit role:

Using contributor mode

Creating issues

Issues automatically route to planning repo:

Viewing issues

By default, commands show issues from both repos:

Graduating issues to project repo

When a personal issue becomes a project issue:
Issues promoted to the project repo WILL appear in PRs. Only promote issues that belong in the upstream project.

Configuration

Routing modes

The routing.mode config controls routing behavior:
  • auto: Automatic routing based on role detection (recommended)
  • explicit: No routing, use project repo only
  • (empty): Routing disabled

Planning repo location

Customize where planning issues go:

Planning repo prefix

Planning repo can use a different prefix:

Troubleshooting

Issues still appearing in project repo

Diagnosis:
Solutions:
  1. Verify routing.mode is auto
  2. Verify routing.contributor points to planning repo
  3. Check that BEADS_DIR is NOT set (it overrides routing)
  4. If using SSH URL but want contributor behavior, set git config beads.role contributor

BEADS_DIR conflicts with routing

Symptom: Warning about BEADS_DIR overriding routing Explanation: BEADS_DIR environment variable takes precedence over routing config. Solutions:

Planning repo not initialized

Symptom: Error “failed to initialize target repo” Diagnosis:
Solution:

CI environment detection issues

Problem: CI typically uses HTTPS even for maintainers, causing incorrect detection. Solution: Set explicit role in CI config:

Contributor vs maintainer comparison

Sync and backup

The planning repo has its own sync configuration:
Planning repo does NOT inherit the project repo’s sync configuration. It’s completely independent.

Best practices

For contributors

  • ✅ Run bd init --contributor immediately after cloning
  • ✅ Verify routing with a test issue before creating real issues
  • ✅ Check git status before creating PRs to avoid pollution
  • ✅ Use explicit role override in CI environments

For maintainers

  • ✅ Document contributor mode setup in project README
  • ✅ Set up .gitignore for contributor prefixes (if using prefix-based routing)
  • ✅ Review PRs for accidental .beads/ pollution
  • ✅ Use bd preflight to detect pollution (when available)

See also