Local-first control plane for Grok Build and Claude Code. Run one gateway next to your code, then drive your coding agents from your phone, laptop or browser: start tasks, approve edits and commands, and resume sessions, over loopback or your own Tailscale network. Nothing leaves your machines except what the agents themselves send to their providers.
Not affiliated. ClankerSpanker is an independent open-source project. It is not affiliated with, endorsed by, or sponsored by xAI, Anthropic, Google, Apple, or Tailscale. "Grok", "Claude" and other product names are trademarks of their respective owners and are used only to describe compatibility.
Mac native app ──┐
Linux Electron ──┼── REST + WebSocket ──► Host gateway (:8787)
Browser /app/ ──┤ ├── grok agent (ACP)
iOS (phone) ──┘ └── claude (+ approval hooks)
The primary website is https://clankerspanker.tech/.
In Chrome, with the gateway already running on that computer, paste http://127.0.0.1:8787 and the token from the host machine's setup page.
Firefox and Safari use the on-machine page instead: http://127.0.0.1:8787/app/. That address is one you open; the site does not redirect you there.
Requires Node 22+ and the agent CLI(s) you want to drive (grok, claude).
git clone https://github.com/nightmoose/ClankerSpanker.git
cd ClankerSpanker/host
npm install && npm run build && npm start- Open
http://localhost:8787/setupon the host machine to see the QR code and token. - Open https://clankerspanker.tech/ in Chrome and sign in with the token, or open
http://localhost:8787/app/on the host machine, or pair the iOS / desktop client. - Pick a project and send your first prompt.
Run it as a background service: ./scripts/install-service.sh (macOS launchd / Linux systemd --user).
Start at the docs index: architecture, clients, standalone installs, MCP, APNs push, host README, design RFCs.
ClankerSpanker/
├── host/ # Node gateway: the only agent runner
│ ├── src/
│ ├── web/ # Browser UI at /app/
│ └── scripts/ # launchd + systemd install
├── desktop/ # Electron: Linux laptop command center
├── ios/ClankerSpanker/ # SwiftUI: iOS + native macOS app
├── docs/
└── shared/ # OpenAPI contract
| Browser UI | https://clankerspanker.tech/ in Chrome, or http://<host-ip>:8787/app/ on the gateway |
| Pair a phone | http://localhost:8787/setup on the host (QR code; host-machine only) |
| Config | ~/.grok-dispatch/config.json (legacy directory name from the project's earlier name; kept for compatibility) |
Port 8787 is the default; change it with bindPort in the config. See host/README.md.
cd ios/ClankerSpanker
./run-mac.sh
# or Xcode: scheme ClankerSpanker → destination My Mac (not Designed for iPad)Sessions, host install/LaunchAgent, menu bar service, multi-folder projects.
Details: ios/ClankerSpanker/RUN-MAC.md.
cd host && npm run build # once
cd ../desktop && npm install && npm startHost → Install / update host copies the gateway to ~/.local/share/clankerspanker/host and enables a systemd user service (parity with Mac).
Config remains ~/.grok-dispatch.
AppImage / deb: run npm run dist:linux on Linux (or Linux CI). See desktop/README.md.
Standalone host + agent CLIs: docs/STANDALONE-INSTALLS.md.
Chrome on the same computer as the gateway: https://clankerspanker.tech/.
Any browser on the host machine: http://127.0.0.1:8787/app/ with the host token.
No local process management.
open ios/ClankerSpanker/ClankerSpanker.xcodeproj
# Scheme: ClankerSpankerPhone → your iPhone (unlocked + trusted) → RunDo not use “My Mac (Designed for iPad)” for the phone scheme.
The Apple team ID is not committed. Before building in Xcode:
cp ios/ClankerSpanker/Config/Local.xcconfig.sample ios/ClankerSpanker/Config/Local.xcconfig
# then set DEVELOPMENT_TEAM to your own team IDLocal.xcconfig is git-ignored and is pulled in by Config/Signing.xcconfig.
- Dispatch multi-turn tasks to Grok Build (ACP, plan mode, client approvals)
- Browse + resume Grok / Claude Code sessions from disk
- Soft-archive Active chats
- Optional desktop/OS notifications (host + laptop shells)
- Cross-platform host PATH / binary discovery (no hardcoded machine IPs)
- Listens on loopback + Tailscale by default (
bindHost: "auto"); bearer host token - The token is only shown on the host machine (
/setup) and never goes in WebSocket URLs - Grok: never yolo — file edits / dangerous tools wait for the client
- Claude: PreToolUse hook parks Edit/Bash until approved
- Gemini / Antigravity: not approval-gated. Headless
agycan't ask, so it runs with--dangerously-skip-permissions. The composer shows a warning on these profiles. SetANTIGRAVITY_REQUIRE_PERMISSIONS=1in the profile's env to require permissions (shell tools are then refused). host/src/auth.tsis the security boundary (constant-time compare; empty token authorizes nobody)
See CONTRIBUTING.md and the Code of Conduct. Run make check before opening a PR.
Report security issues privately: SECURITY.md.
MIT © 2026 NightMoose, Inc. Tokens and session JSON live under ~/.grok-dispatch/ (not in git).
