Local-first orchestrator for AI coding agents — one window over your fleet
Project description
Rubberduck
Shadow companion across multiple agents and sessions — a second brain looking over your shoulder.
Local-first orchestrator for AI coding agents. Launches agents (Claude Code, Codex, any CLI agent) into isolated git worktrees, supervises them, lets you fork a running session into a tree of parallel attempts, and keeps durable history with an intention → outcome summary per session.
Design: rubberduck-design.md.
Install
pipx install rubberduckhq
Requires Python 3.11+. No pipx? brew install pipx (macOS) or see
pipx docs. pipx installs the CLI in
its own isolated environment, which avoids the externally-managed-environment
error a bare pip install hits on Homebrew Python.
Bring your own agent (Claude Code, Codex, any CLI agent) and your own API key — Rubberduck never sees your code or credentials.
Use it
There are two commands, and they do different things:
rubberduck install-hooks --global # ONCE: wire Claude Code to report to Rubberduck
rubberduck serve # EACH TIME: run the server + dashboard at :4200
install-hooksedits Claude Code's config so everyclaudesession automatically streams into Rubberduck. Run it once per machine (or once per repo without--global). You never run it again.serveis the running process: it receives those events, stores history, serves the dashboard, and orchestrates agents you launch. Run it whenever you want Rubberduck active, and leave it running. Open http://localhost:4200.
install-hooks makes Claude talk to Rubberduck; serve is what's listening.
You need both — but only serve repeatedly.
Then just use Claude Code as usual — sessions appear in the dashboard on their
own. From there you can launch agents into isolated git worktrees, fork a
session into a tree of parallel attempts, answer permission requests, and read
per-session checkpoints (prompts, files, tools, outcome). Runtimes: generic
(any CLI), claude-code (richest — hook events + JSONL transcript), codex.
Two kinds of session
- Watched — you start
claudein your own terminal; the hooks report each event to Rubberduck. Rubberduck observes but doesn't own the process. These run on whatever branch you already have checked out. - Launched — you click New session in the dashboard. Rubberduck opens a new tab in your terminal (iTerm or Terminal), runs the agent there, and — for a git repo — creates an isolated worktree first. It detects a killed tab via a 20s heartbeat and marks the session terminated after 60s of silence.
How worktrees work
A launched session on a git repo gets its own git worktree — a second
working directory that shares your repo's .git object store. Picking the repo
~/code/myapp creates:
~/.rubberduck/worktrees/myapp/rubberduck/<branch>/ # the worktree (a checkout)
on a new branch rubberduck/<session-name> (slug of the name you gave it, or a
timestamp). That branch lives in your repo — git branch in ~/code/myapp
lists it. The agent works in the worktree without touching your main checkout.
To fold a session's work back in, from your repo:
git merge rubberduck/<branch> # or rebase, or open a PR from that branch
Deleting a session from the dashboard removes its worktree and branch. If the
branch has commits not yet in main, delete asks before discarding them.
Notes
Each session has a Notes tab — a private, local-only list of reminders or TODOs for that session. Notes never leave your machine and are never sent to any agent or service.
Develop
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
ruff check src tests # lint
black --check src tests scripts
mypy # types (strict)
pytest # unit + runtime tests
python scripts/slop_check.py
cd web && npm install
npm run lint && npm run typecheck && npm run build
State lives in ~/.rubberduck/ (override with RUBBERDUCK_HOME).
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rubberduckhq-0.2.0.tar.gz.
File metadata
- Download URL: rubberduckhq-0.2.0.tar.gz
- Upload date:
- Size: 107.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3171e2522db92e033fa09a8875dc35ef2444923ee49c8f094a7f905062311fb
|
|
| MD5 |
1bbdb020925f26bfb5c12ccac12ee4fa
|
|
| BLAKE2b-256 |
614f86ec0e869e1bd3dfc85fc891d3161f1587cc0254fdf1907597dfbba38794
|
File details
Details for the file rubberduckhq-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rubberduckhq-0.2.0-py3-none-any.whl
- Upload date:
- Size: 115.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
260a78a4b81749f3b4219d8501c947792e235218efb5c3a9d2d44ec8ec44e1a7
|
|
| MD5 |
e5b3de1fff8b594246efb6f5db1fe41a
|
|
| BLAKE2b-256 |
fceff7144910a16d196d2a77470dd2b9baa89d6b8ef9a22da2a166838f48ef7a
|