...:.
:=+=:
. .-*####+-
.- :++**####*=.
- :+***#####*=:.
: .+**######*+==++++++=:..
.. .=*#######*++++====+=--=-.
.:.- -+**######**+*#*+=-:-===:
-. .. -++++***#**++*#*--:---===:
-.:--==+=--=*++*+**********+==------++-
.:----=++*++##########******+=====--=+#=-.
.::-----=+*#%%%%%%#***###*+===--==+*=++=:.
...::::-=+*#%%############*+-----===+****+=:.
:--=-====+******++****##***-.::--++*######**
.++-+++++***********#*+*#***=.:---=+**=--=+==
-**++*++****+***##*++*****++=. ----=+=. ..:-
.+##***+*+*****##*#=-=**=-=-::. -**-::-==+++++
:*%%*+=+=+****##**++****+**+-.. -*=- .::::-=
.-#%#*+*+**#***+++**+****+*++=--+=::-:..:...-+
=###***=*+++++-=*=+++++-====-=:-=--:=---==---
.:-+***+=*+++**+++===*++++=--:= ::=::-=----++
.+****+++++*##+***++=+*-.:--:..-===---=-:-++
.-+###**+++*#****+=---:--==.--=:==-==:::-=++
:####*****+++======:.. :...:::---:.=------
.=###***+++*++++--:.:::. :-=::.:..-:---:
:+**++++++*++*+=-:: .. ...... .. .:..::
Drive AI coding agents (Claude, Codex, Gemini, any shell command) from your phone or browser. Sessions live in a Rust PTY broker that outlives the web server, so restarts don't kill your agents. Designed to ride on top of Tailscale — no ports to open, no DNS to wire up.
curl -fsSL https://raw.githubusercontent.com/almogdepaz/wolfpack/main/install.sh | bashDownloads the right pre-built binary for your platform, runs the setup wizard, and optionally installs as a login service. No runtime deps — broker is bundled.
Alternative: install via Bun / npm
bunx wolfpack-bridge # or: npx wolfpack-bridgeSupported: macOS (arm64/x64), Linux (x64/arm64).
wolfpack walks you through:
- Install Tailscale (recommended — you almost certainly want remote access)
- Pick a projects directory and port
- Detect your Tailscale hostname and run
tailscale servefor HTTPS - Install as a login service (optional)
- Print a QR code
Scan the QR with your phone, tap Add to Home Screen, done.
- Multi-machine — one phone manages sessions on every machine on your tailnet. Online/offline status per machine, cross-machine session list.
- Session triage — color-coded states (running / idle / needs-input), live output preview on cards.
- Agent-agnostic — Claude, Codex, Gemini, or any custom command. Configure per-session in Settings → Agents.
- Survives restarts — the broker daemon owns every PTY. Redeploy the server, agents keep running.
- Desktop grid — view up to 6 sessions side-by-side. Add via
+, remove via×,Cmd+ArrowLeft/Rightto navigate. - Mobile-first terminal — ghostty-web (WASM) emulator. Keyboard accessory bar (arrows, Esc,
git, copy). On-screen keyboard suppressed until you ask for it. Long-press to select. - PWA — install on home screen. Notifications + vibration when sessions need attention. Reconnects on drop.
- Ralph loop — autonomous task runner. Hand it a markdown plan, it iterates through tasks with an agent, committing along the way. See docs/ralph-macchio.md.
wolfpack Start the server (runs setup on first launch)
wolfpack setup Re-run the setup wizard
wolfpack ls List active broker sessions
wolfpack kill <name> Kill a session
wolfpack doctor Diagnose broker, binaries, JWT, Tailscale
wolfpack service ... install / start / stop / status / uninstall (launchd / systemd)
wolfpack uninstall --yes Remove everything
┌─────────────┐ ┌───────────┐ ┌──────────────────────────────────────────┐
│ Phone / │ │ Tailscale │ │ Your Machine │
│ Browser │◄──►│ (HTTPS) │◄──►│ │
│ (PWA) │ │ mesh VPN │ │ ┌──────────┐ unix ┌──────────────┐ │
└─────────────┘ └───────────┘ │ │ wolfpack │ socket │ wolfpack- │ │
│ │ server │◄───────►│ broker │ │
│ │ (Bun) │ │ (Rust, PTY) │ │
│ │ HTTP/WS │ │ owns agents │ │
│ └──────────┘ └──────────────┘ │
└──────────────────────────────────────────┘
- PWA — vanilla JS, no framework. ghostty-web renders the terminal.
- Server — Bun HTTP + WebSocket. Pure broker client; owns no PTYs.
- Broker —
wolfpack-broker, Rust daemon. Owns every PTY, keeps per-session output rings. One Unix-domain socket per host ($XDG_RUNTIME_DIR/wolfpack-broker.sock, fallback~/.wolfpack/broker.sock). Wire protocol in docs/broker-protocol.md.
Tailscale already gates who can reach the server. If you want an extra auth layer on top — useful if you share your tailnet with others, or for defense-in-depth — set a JWT secret:
export WOLFPACK_JWT_SECRET="$(openssl rand -base64 48)"Tokens are HS256; the server validates, it does not issue — sign them with any JWT library using the same secret.
Optional: WOLFPACK_JWT_AUDIENCE, WOLFPACK_JWT_ISSUER, WOLFPACK_JWT_CLOCK_TOLERANCE_SEC (default 30s).
~/.wolfpack/config.json (mode 0600):
{
"devDir": "/Users/you/Dev",
"port": 18790,
"tailscaleHostname": "your-machine.tailnet-name.ts.net"
}Per-server agent settings in ~/.wolfpack/bridge-settings.json. The broker socket's filesystem permissions are the auth boundary.
See CONTRIBUTING.md for dev setup, the asset pipeline, and PR conventions.
Bugs and feature requests: GitHub Issues. Questions and ideas: Discussions.
MIT

