neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
Phone control for the agent panes already running in iTerm2. Nothing restarts.
Developer toolsPython · HTMLGitHub @charlie-818OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Phone control for a fleet of live Claude Code panes — attach to existing iTerm2 sessions, view status, answer prompts, drive panes from a passkey-gated PWA over Tailscale.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Phone control for a fleet of live agent panes.
CC Dispatch reads and drives your existing iTerm2 agent sessions — Claude Code,
Codex and Grok — from your phone, each with its own critter on the yard so you can
tell them apart. See every pane's status at a glance, read what each one is doing,
answer permission prompts, send follow-ups, and get a push notification the
moment a session finishes or needs input — all from a passkey-protected PWA
served over your Tailnet.Read the full README ↗Phone control for a fleet of live agent panes.
CC Dispatch reads and drives your existing iTerm2 agent sessions — Claude Code, Codex and Grok — from your phone, each with its own critter on the yard so you can tell them apart. See every pane's status at a glance, read what each one is doing, answer permission prompts, send follow-ups, and get a push notification the moment a session finishes or needs input — all from a passkey-protected PWA served over your Tailnet.
Nothing is restarted. The server attaches to sessions that are already running (via the iTerm2 Python API) and only ever writes in response to an authenticated request from the UI. Kill the server and your fleet is exactly as it was.
Website · Docs · Contributing · Security
iTerm2 panes ──► iTerm2 Python API ──► server.py ──► PWA (static/index.html)
(Claude/Codex/Grok) │ ▲
│ │ passkey / WebAuthn
~/.claude/statusline.sh ─► /tmp/cc-status│ │ web-push
~/.claude/cc-active.sh ─► │ │
(fleet status .json) ───────────────┘ your phone, over Tailscale
server.py — aiohttp server. Polls iTerm2 for pane contents, reads each
session's transcript (Claude's .jsonl, Codex's rollout, Grok's chat log),
exposes the fleet over HTTP/WebSocket, and sends keystrokes back to panes that
are confirmed to be running one of those agents. Permission mode, effort and
model are Claude-only controls and are hidden for the others.auth.py — WebAuthn/passkey login. The bootstrap token in the QR is
single-use to register the first passkey; after that, only passkeys get in.vault.py + dispatch-auth — the credential broker. An agent in a pane
runs dispatch-auth request <service>; you approve it on your phone; the
secret is released just-in-time and never touches disk in plaintext.static/ — the installable PWA (service worker + web-push).127.0.0.1) by default. Reachability is Tailscale's
job: tailscale serve terminates TLS and proxies to the local port, so there
is no listener on any network interface for a stranger to find..integrations.vault); the
Fernet key is stored in the macOS login keychain via the security CLI.All per-install secrets and state are git-ignored — see .gitignore. This
repo contains code only. Full writeup: docs/SECURITY-MODEL.md.
brew install whisper-cpp) + a local model — see below.CC_FLEET_DIR
(default /tmp/cc-status). Ready-to-use hooks that do this ship in
examples/ — see Wire up the fleet-status hooks below. Panes
without a status file are still driveable when iTerm2 reports Claude as the
foreground job; the hooks just make the fleet view complete.git clone https://github.com/charlie-818/claude-dispatch.git
cd claude-dispatch
# make
make venv
# raw
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
make venv also installs requirements-dev.txt (pytest, ruff) so make check
works right away.
So every Claude Code pane shows up in the fleet, install the two helper scripts and point Claude Code at them:
# make
make hooks
# raw
cp examples/statusline.sh examples/cc-state.sh ~/.claude/
chmod +x ~/.claude/statusline.sh ~/.claude/cc-state.sh
Then merge the keys from examples/settings.snippet.json
into ~/.claude/settings.json. They:
statusLine to statusline.sh, which writes each pane's status JSON
(tagged with its iTerm2 session id) into CC_FLEET_DIR, andUserPromptSubmit / Stop / Notification hooks that call
cc-state.sh to record whether the pane is working or idle.New panes appear in the app within a couple of seconds of their first repaint.
# In one terminal: expose the port over your Tailnet with TLS
tailscale serve --bg 8788
# In another: start the server (attaches to your live iTerm2 fleet)
# make
make run
# raw
.venv/bin/python server.py
On startup the server prints a QR code and a URL with the bootstrap token baked in. Scan it with your phone, register a passkey, and add the PWA to your home screen. That's it — subsequent visits are passkey-only.
The /api/whisper endpoint transcribes recorded audio locally — nothing leaves
the machine. Install the CLI and fetch a model once:
brew install whisper-cpp
mkdir -p models
curl -L -o models/ggml-base.en.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
Override the binary/model with WHISPER_BIN / WHISPER_MODEL if they live
elsewhere.
| Env var | Default | Purpose |
|---|---|---|
DISPATCH_PORT | 8788 | Server port. |
DISPATCH_BIND | 127.0.0.1 | Bind address. Leave on loopback. |
CC_FLEET_DIR | /tmp/cc-status | Where pane status .json files are read. |
VAPID_SUB | mailto:[email protected] | Contact mailto: for web-push. |
WHISPER_BIN | whisper-cli | whisper.cpp binary. |
WHISPER_MODEL | models/ggml-base.en.bin | Local transcription model. |
FFMPEG_BIN | ffmpeg | ffmpeg binary, used for audio conversion. |
DISPATCH_GITHUB_CLIENT_ID | (empty) | GitHub OAuth device-flow client id for the integrations page; empty disables it. |
Details: docs/DEPLOYMENT.md. In short:
deploy/install-launchd.sh ensure installs the recommended reboot watchdog —
the server should survive a reboot without you re-running anything by hand.server / deploy / all modes install the other launchd
templates in deploy/launchd/ (run-on-login, auto-deploy-on-push).tailscale serve in front of the loopback port — the
watchdog doesn't change the security model above.make venv # venv + requirements.txt + requirements-dev.txt
make check # ruff + pytest
The tests/ suite is 153 unit tests against the pure parsers and write gates
(pane detection, auth helpers, vault helpers, sweep auth) — no live iTerm2
needed, so it runs in CI on ubuntu and macOS. What it can't cover: anything
that requires a real iTerm2 session or a live agent pane — exercise those by
hand against a real fleet, as described in CONTRIBUTING.md.
Contributions welcome — see CONTRIBUTING.md.
Please don't open a public issue for a vulnerability — see SECURITY.md for how to report one privately.