Local-first orchestrator for AI coding agents — one window over your fleet
Project description
🦆 Rubberduck
One window over every AI coding agent you run.
Launch Claude Code, Codex, or Copilot into isolated git worktrees, watch them work side by side, fork a session into a tree of attempts, and answer their prompts — all from one local dashboard. Your code and keys never leave your machine.
Install · Features · Dashboard · Using it
Works with Claude Code · Codex · GitHub Copilot CLI · any CLI agent
Install
pipx install rubberduckhq
Requires Python 3.11+. Then, once:
rubberduck install-hooks --global # wire your agent to report to Rubberduck
rubberduck serve # run the server + dashboard at :4200
Open http://localhost:4200 and start your agent — sessions appear on their own.
What it does
🪟 One window over every agent
Stop juggling five terminals. Every running session shows up in one dashboard — what each is doing, which one needs you, and how they relate.
🌿 Isolated git worktrees
Run several agents on the same repo without collisions. Each session can get its
own git worktree on its own branch; merge any branch back with a normal
git merge. Or run in place when you don't want a branch — your choice per session.
⑂ Fork into a tree of attempts
Fork a running session — the code (a new worktree branch) or just the conversation — and follow the whole lineage as a tree. Try three approaches to the same problem side by side.
🔔 Human in the loop (HITL)
Live state for every session: busy, idle, or waiting on a permission request. The Needs human panel surfaces the sessions waiting on you — answer their prompts from the dashboard for sessions Rubberduck launched, without switching terminals.
📜 Durable history
Every session is kept with its stated intention and an outcome summary, plus checkpoints of prompts, files, and tools. Catch up later without re-reading transcripts.
🔒 Local-first and private
The server runs on 127.0.0.1, gated by a per-install secret so a web page you
visit can't drive it. Rubberduck never sees your code or your API keys.
The dashboard
http://localhost:4200 is three columns — your agents, what needs you, and a
live pulse of activity (pictured at the top of this page).
- Agents — every session as a row, forks nested under their parent. A badge
marks each watched (you started it) or launched (Rubberduck started it
and can drive it); a
⎇glyph marks the ones on a git branch. Click a row for its detail drawer — timeline, diff, live output, checkpoints, and inline notes. - Needs human — the human-in-the-loop (HITL) panel: sessions waiting on a permission request, with inline Approve/Deny for the ones Rubberduck can reach.
- Pulse — a live ticker of the latest action across every agent.
Using it
Two commands: install-hooks runs once per machine (it persists across
reboots), and serve runs whenever you want Rubberduck active.
Claude Code
rubberduck install-hooks --global
rubberduck serve
Start claude as usual — sessions appear automatically. The richest
integration: hook events plus the JSONL transcript.
Codex
rubberduck install-hooks --agent codex --global
rubberduck serve
One extra step: Codex won't run a hook until you trust it. Start codex, run
/hooks, and trust the Rubberduck hook (re-trust if Rubberduck later updates
the hook script). Use --global — Codex's repo-local hooks are unreliable upstream.
GitHub Copilot CLI
rubberduck install-hooks --agent copilot --global
rubberduck serve
Start copilot as usual — sessions appear automatically, no extra steps.
Bring your own agent
Any CLI agent works through the launch path: click New session in the dashboard, point it at a command and a folder. Rubberduck spawns it in a terminal tab and supervises the process directly — no hooks needed. State is read from the agent's terminal output, so it's coarser than the hook integrations above, but it works for anything.
Two kinds of session
- Watched — you start the agent in your own terminal; its hooks report to Rubberduck. Rubberduck observes but doesn't own the process, so you drive it and answer its prompts in your terminal.
- Launched — you click New session; Rubberduck opens a terminal tab, runs the agent, and owns the process — so you can drive it and answer permission requests from the dashboard.
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.3.0.tar.gz.
File metadata
- Download URL: rubberduckhq-0.3.0.tar.gz
- Upload date:
- Size: 125.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45433f3871010ba9dcb41037bc42abb087ba45c6ef001fc8d2da2f4db7e0351d
|
|
| MD5 |
1e91927802475e3d666ce4bdf69def34
|
|
| BLAKE2b-256 |
454c3a86e6b846b1040b50a2acd6b151e139f24c32ac7315461b032108efe0fc
|
File details
Details for the file rubberduckhq-0.3.0-py3-none-any.whl.
File metadata
- Download URL: rubberduckhq-0.3.0-py3-none-any.whl
- Upload date:
- Size: 136.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a51efe1c57d54b5e3a6043fa51e23d48d74c416d754b64d81d3631dd69bfa83
|
|
| MD5 |
4df1b418f414afbfd2680ff340ce4fec
|
|
| BLAKE2b-256 |
9588b4cb7dc90f341c33cf6a3a3f9e60d29ea98beddf2ad861d74a5123adc5ca
|