Skip to content

Install

New to terminal tooling? Start with the short Prerequisites checklist, then come back here.

Use whichever command matches the tooling you already have — just the one. Each installs the same program and leaves you with a brnrd command on your PATH.

Terminal window
curl -LsSf https://hugimuni-labs.github.io/brnrd/install.sh | sh

If you have Node:

Terminal window
npm install -g brnrd

If you have uv:

Terminal window
uv tool install brnrd

If you have pipx:

Terminal window
pipx install brnrd

Check it:

Terminal window
brnrd --version
brnrd --help

brnrd also needs git, and at least one coding-agent CLI on your PATH — Claude Code (claude), Codex (codex), Grok Build (grok), or Mistral Vibe (vibe) — authenticated with your own subscription or API key. brnrd drives that CLI; it never asks you for a model key of its own.

Self-hosted gates and local execution are free. No brnrd account is needed to use them.

The loom is brnrd’s runtime: one process that holds your threads, starts a coding-agent body for each, and hands them letters. It runs as a login service, launchd on macOS and systemd –user on Linux:

Terminal window
uv tool install brnrd
brnrd loom install

That is the whole install. brnrd loom install ends with one receipt:

interpreter: /Users/you/.local/share/uv/tools/brnrd/bin/python3
brnrd: (the version you installed)
home: /Users/you/brnrd (default)
body: claude/sonnet (picked: claude has fuel, session 91% week 76%; written to /Users/you/brnrd/loom/config.toml)
service: /Users/you/Library/LaunchAgents/dev.brnrd.loom.plist
replaced: none
pid: 4242
  • interpreter is the Python the service runs. It is the one brnrd was installed into; install refuses a source checkout (see Troubleshooting).
  • home is found for you: the installed service’s home, else the one loom home on this machine (~/brnrd, or a home inside a brnrd account), else a new ~/brnrd. When more than one could be meant, install lists them and asks for --home.
  • body is the coding agent the loom runs, as shell/core. Unset, install asks Claude Code, then Codex (with the model in your ~/.codex/config.toml), for its quota and writes the first one with fuel left. brnrd loom config edit changes it.
  • replaced names the loom install stopped to make way. The service’s own loom is reloaded; a loom running outside the service is sent SIGTERM, which ends only its loop. Bodies are never stopped: they keep their sessions, and the new loom picks them up.

The service freezes the installing shell’s PATH: run install from the shell whose tools (claude, codex, gh, …) your bodies should see. brnrd loom install --dry-run prints the receipt without writing or starting anything; --no-start writes the service and leaves it for the next login. brnrd loom status and brnrd loom logs show it running; stop, start and uninstall do what they say. brnrd setup pairs a channel such as Telegram, so letters reach you away from the terminal.

To upgrade, run uv tool upgrade brnrd (or the route you installed with). The running loom sees its files change and re-execs itself; its bodies resume from the letters they held.

Terminal window
brnrd

Run this once, from the repository you want brnrd to work in. Bare brnrd is the guided setup: it narrates each step as it runs it, prints the exact command for anything it can’t do without you, and never redoes a step that’s already standing. In order:

  • checks for a coding-agent CLI on your PATH;
  • pairs this machine with your brnrd account — a link you approve in your browser — then installs and starts the background service;
  • picks where resident memory lives;
  • offers a door (Telegram, Slack, or Signal) so brnrd can reach you without a terminal open;
  • queues the first run: a conversation, not a form, that writes the repository’s contract (AGENTS.md) with you.

Re-run brnrd any time; it resumes from whatever step is still standing, and a finished repo gets a four-line receipt instead of repeating setup. Execution never leaves your machine.

A quick sanity check, once a coding-agent CLI is on PATH, that doesn’t wait on any of the above:

Terminal window
brnrd run "summarize the test layout; do not change files"

runs it right there, in the terminal — nothing else installed or connected.

Continue to Connect for a persistent channel — your phone, a chat gate, an identity that isn’t you — or skip straight to First task and keep working from the terminal.

Terminal window
npx brnrd

npx runs brnrd once without adding anything to your PATH, so there is no brnrd command afterwards — every later command has to be npx brnrd … as well. Good for a first look; if you keep using it, install it properly with one of the lines above.

brnrd is a Python program. The npm package is a launcher: on first run it builds a private, durable virtualenv under ~/.local/share/brnrd (or $BRNRD_HOME), installs brnrd from PyPI into it, and hands over. Every run after that is just a launch. Your system Python is not touched and your PATH is not rewritten by the launcher itself — only by npm, for the brnrd command.

That durability is what makes the npm route a real install: brnrd loom install and brnrd daemon install write a systemd/launchd unit pointing into that virtualenv, and it is still there tomorrow.

If no Python is on the machine, the launcher downloads a checksum-pinned uv release and lets uv provision CPython, under the same directory. It never pipes a script into a shell.

To run the loom on brnrd’s main instead of the PyPI release, and have it move with main by itself:

Terminal window
curl -LsSf https://hugimuni-labs.github.io/brnrd/install.sh | sh -s -- --dev

It clones main to ~/.brnrd/src (BRNRD_DEV_DIR moves it), installs that checkout editable with uv tool install --editable, prints brnrd loom install --dev --dry-run, then runs it for real and ends with brnrd loom status. The loom follows the checkout without a config line: on a green main CI it fast-forwards and re-execs at an idle tick.

It warns, without stopping, about what bites later: PYTHONPATH set (brnrd would run another checkout’s code), no claude or codex on PATH (the loom needs a body), and gh missing or signed out (following main reads CI through it; run gh auth login first). Run it again to update by hand: it fast-forwards a clean checkout on main, and refuses one with uncommitted changes or on another branch, the same rule the loom applies. Keep your own edits in another clone.

Terminal window
git clone https://github.com/hugimuni-labs/brnrd
cd brnrd
pip install -e ".[dev]"
pytest

For remote-assisted brr development — running the daemon against your own editable checkout so it re-execs itself between tasks as you change brr’s own code:

Terminal window
brnrd up --dev-reload