@manypkg/get-packages only includes workspace members in its packages list, not the workspace root. Adding "." to workspaces makes the root package discoverable, fixing "not in the workspace" errors from changeset version. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The missing control plane for AI coding agents
Agent Visualization • Zero-Lag Input Overlay • Mobile-First UI • Respawn Controller • Multi-Session Dashboard
Quick Start - Installation
curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | bash
This installs Node.js and tmux if missing, clones Codeman to ~/.codeman/app, and builds it. You'll need at least one AI coding CLI installed — Claude Code or OpenCode (or both). After install:
codeman web
# Open http://localhost:3000 — press Ctrl+Enter to start your first session
Update to latest version:
curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | bash -s update
Run as a background service
Linux (systemd):
mkdir -p ~/.config/systemd/user && printf '[Unit]\nDescription=Codeman Web Server\nAfter=network.target\n\n[Service]\nType=simple\nExecStart=%s %s/dist/index.js web\nRestart=always\nRestartSec=10\n\n[Install]\nWantedBy=default.target\n' "$(which node)" "$HOME/.codeman/app" > ~/.config/systemd/user/codeman-web.service && systemctl --user daemon-reload && systemctl --user enable --now codeman-web && loginctl enable-linger $USER
macOS (launchd):
mkdir -p ~/Library/LaunchAgents && printf '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0"><dict><key>Label</key><string>com.codeman.web</string><key>ProgramArguments</key><array><string>%s</string><string>%s/dist/index.js</string><string>web</string></array><key>RunAtLoad</key><true/><key>KeepAlive</key><true/><key>StandardOutPath</key><string>/tmp/codeman.log</string><key>StandardErrorPath</key><string>/tmp/codeman.log</string></dict></plist>\n' "$(which node)" "$HOME/.codeman/app" > ~/Library/LaunchAgents/com.codeman.web.plist && launchctl load ~/Library/LaunchAgents/com.codeman.web.plist
Windows (WSL)
wsl bash -c "curl -fsSL https://raw.githubusercontent.com/Ark0N/Codeman/master/install.sh | bash"
Codeman requires tmux, so Windows users need WSL. If you don't have WSL yet: run wsl --install in an admin PowerShell, reboot, open Ubuntu, then install your preferred AI coding CLI inside WSL (Claude Code or OpenCode). After installing, http://localhost:3000 is accessible from your Windows browser.
Mobile-Optimized Web UI
The most responsive AI coding agent experience on any phone. Full xterm.js terminal with local echo, swipe navigation, and a touch-optimized interface designed for real remote work.
- Swipe navigation — left/right on the terminal to switch sessions (80px threshold, 300ms)
- Keyboard accessory bar —
/init,/clear,/compactquick-action buttons above the virtual keyboard. Destructive commands (/clear,/compact) require a double-press to confirm — first tap arms the button, second tap executes — so you never fire one by accident on a bumpy commute - Smart keyboard handling — toolbar and terminal shift up when keyboard opens (uses
visualViewportAPI with 100px threshold for iOS address bar drift) - Safe area support — respects iPhone notch and home indicator via
env(safe-area-inset-*) - 44px touch targets — all buttons meet iOS Human Interface Guidelines minimum sizes
- Bottom sheet case picker — slide-up modal replaces the desktop dropdown
- Native momentum scrolling —
-webkit-overflow-scrolling: touchfor buttery scroll
codeman web --https
# Open on your phone: https://<your-ip>:3000
localhostworks over plain HTTP. Use--httpswhen accessing from another device, or use Tailscale (recommended) — it provides a private network so you can accesshttp://<tailscale-ip>:3000from your phone without TLS certificates.
Live Agent Visualization
Watch background agents work in real-time. Codeman monitors agent activity and displays each agent in a draggable floating window with animated Matrix-style connection lines back to the parent session.
- Floating terminal windows — draggable, resizable panels for each agent with a live activity log showing every tool call, file read, and progress update as it happens
- Connection lines — animated green lines linking parent sessions to their child agents, updating in real-time as agents spawn and complete
- Status & model badges — green (active), yellow (idle), blue (completed) indicators with Haiku/Sonnet/Opus model color coding
- Auto-behavior — windows auto-open on spawn, auto-minimize on completion, tab badge shows "AGENT" or "AGENTS (n)" count
- Nested agents — supports 3-level hierarchies (lead session -> teammate agents -> sub-subagents)
Zero-Lag Input Overlay
When accessing your coding agent remotely (VPN, Tailscale, SSH tunnel), every keystroke normally takes 200-300ms to round-trip. Codeman implements a Mosh-inspired local echo system that makes typing feel instant regardless of latency.
A pixel-perfect DOM overlay inside xterm.js renders keystrokes at 0ms. Background forwarding silently sends every character to the PTY in 50ms debounced batches, so Tab completion, Ctrl+R history search, and all shell features work normally. When the server echo arrives 200-300ms later, the overlay seamlessly disappears and the real terminal text takes over — the transition is invisible.
- Ink-proof architecture — lives as a
<span>at z-index 7 inside.xterm-screen, completely immune to Ink's constant screen redraws (two previous attempts usingterminal.write()failed because Ink corrupts injected buffer content) - Font-matched rendering — reads
fontFamily,fontSize,fontWeight, andletterSpacingfrom xterm.js computed styles so overlay text is visually indistinguishable from real terminal output - Full editing — backspace, retype, paste (multi-char), cursor tracking, multi-line wrap when input exceeds terminal width
- Persistent across reconnects — unsent input survives page reloads via localStorage
- Enabled by default — works on both desktop and mobile, during idle and busy sessions
Extracted as a standalone library:
xterm-zerolag-input— see Published Packages.
Respawn Controller
The core of autonomous work. When the agent goes idle, the Respawn Controller detects it, sends a continue prompt, cycles context management commands for fresh context, and resumes — running 24+ hours completely unattended.
WATCHING → IDLE DETECTED → SEND UPDATE → /clear → /init → CONTINUE → WATCHING
- Multi-layer idle detection — completion messages, AI-powered idle check, output silence, token stability
- Circuit breaker — prevents respawn thrashing when Claude is stuck (CLOSED -> HALF_OPEN -> OPEN states, tracks consecutive no-progress and repeated errors)
- Health scoring — 0-100 health score with component scores for cycle success, circuit breaker state, iteration progress, and stuck recovery
- Built-in presets —
solo-work(3s idle, 60min),subagent-workflow(45s, 240min),team-lead(90s, 480min),ralph-todo(8s, 480min),overnight-autonomous(10s, 480min)
Multi-Session Dashboard
Run 20 parallel sessions with full visibility — real-time xterm.js terminals at 60fps, per-session token and cost tracking, tab-based navigation, and one-click management.
Persistent Sessions
Every session runs inside tmux — sessions survive server restarts, network drops, and machine sleep. Auto-recovery on startup with dual redundancy. Ghost session discovery finds orphaned tmux sessions. Managed sessions are environment-tagged so the agent won't kill its own session.
Smart Token Management
| Threshold | Action | Result |
|---|---|---|
| 110k tokens | Auto /compact |
Context summarized, work continues |
| 140k tokens | Auto /clear |
Fresh start with /init |
Notifications
Real-time desktop alerts when sessions need attention — permission_prompt and elicitation_dialog trigger critical red tab blinks, idle_prompt triggers yellow blinks. Click any notification to jump directly to the affected session. Hooks auto-configured per case directory.
Ralph / Todo Tracking
Auto-detects Ralph Loops, <promise> tags, TodoWrite progress (4/9 complete), and iteration counters ([5/50]) with real-time progress rings and elapsed time tracking.
Run Summary
Click the chart icon on any session tab to see a timeline of everything that happened — respawn cycles, token milestones, auto-compact triggers, idle/working transitions, hook events, errors, and more.
Zero-Flicker Terminal
Terminal-based AI agents (Claude Code's Ink, OpenCode's Bubble Tea) redraw the screen on every state change. Codeman implements a 6-layer anti-flicker pipeline for smooth 60fps output across all sessions:
PTY Output → 16ms Server Batch → DEC 2026 Wrap → SSE → Client rAF → xterm.js (60fps)
Remote Access — Cloudflare Tunnel
Access Codeman from your phone or any device outside your local network using a free Cloudflare quick tunnel — no port forwarding, no DNS, no static IP required.
Browser (phone/tablet) → Cloudflare Edge (HTTPS) → cloudflared → localhost:3000
Prerequisites: Install cloudflared and set CODEMAN_PASSWORD in your environment.
# Quick start
./scripts/tunnel.sh start # Start tunnel, prints public URL
./scripts/tunnel.sh url # Show current URL
./scripts/tunnel.sh stop # Stop tunnel
./scripts/tunnel.sh status # Service status + URL
The script auto-installs a systemd user service on first run. The tunnel URL is a randomly generated *.trycloudflare.com address that changes each time the tunnel restarts.
Persistent tunnel (survives reboots)
# Enable as a persistent service
systemctl --user enable codeman-tunnel
loginctl enable-linger $USER
# Or via the Codeman web UI: Settings → Tunnel → Toggle On
Authentication
- First request → browser shows Basic Auth prompt (username:
adminorCODEMAN_USERNAME) - On success → server issues a
codeman_sessioncookie (24h TTL, auto-extends on activity) - Subsequent requests authenticate silently via cookie
- 10 failed attempts per IP → 429 rate limit (15-minute decay)
Always set CODEMAN_PASSWORD before exposing via tunnel — without it, anyone with the URL has full access to your sessions.
SSH Alternative (sc)
If you prefer SSH (Termius, Blink, etc.), the sc command is a thumb-friendly session chooser:
sc # Interactive chooser
sc 2 # Quick attach to session 2
sc -l # List sessions
Single-digit selection (1-9), color-coded status, token counts, auto-refresh. Detach with Ctrl+A D.
Keyboard Shortcuts
| Shortcut | Action |
|---|---|
Ctrl+Enter |
Quick-start session |
Ctrl+W |
Close session |
Ctrl+Tab |
Next session |
Ctrl+K |
Kill all sessions |
Ctrl+L |
Clear terminal |
Ctrl+Shift+R |
Restore terminal size |
Ctrl/Cmd +/- |
Font size |
Escape |
Close panels |
API
Sessions
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/sessions |
List all |
POST |
/api/quick-start |
Create case + start session |
DELETE |
/api/sessions/:id |
Delete session |
POST |
/api/sessions/:id/input |
Send input |
Respawn
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/sessions/:id/respawn/enable |
Enable with config + timer |
POST |
/api/sessions/:id/respawn/stop |
Stop controller |
PUT |
/api/sessions/:id/respawn/config |
Update config |
Ralph / Todo
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/sessions/:id/ralph-state |
Get loop state + todos |
POST |
/api/sessions/:id/ralph-config |
Configure tracking |
Subagents
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/subagents |
List all background agents |
GET |
/api/subagents/:id |
Agent info and status |
GET |
/api/subagents/:id/transcript |
Full activity transcript |
DELETE |
/api/subagents/:id |
Kill agent process |
System
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/events |
SSE stream |
GET |
/api/status |
Full app state |
POST |
/api/hook-event |
Hook callbacks |
GET |
/api/sessions/:id/run-summary |
Timeline + stats |
Architecture
flowchart TB
subgraph Codeman["CODEMAN"]
subgraph Frontend["Frontend Layer"]
UI["Web UI<br/><small>xterm.js + Agent Windows</small>"]
API["REST API<br/><small>Fastify</small>"]
SSE["SSE Events<br/><small>/api/events</small>"]
end
subgraph Core["Core Layer"]
SM["Session Manager"]
S1["Session (PTY)"]
S2["Session (PTY)"]
RC["Respawn Controller"]
end
subgraph Detection["Detection Layer"]
RT["Ralph Tracker"]
SW["Subagent Watcher<br/><small>~/.claude/projects/*/subagents</small>"]
end
subgraph Persistence["Persistence Layer"]
SCR["Mux Manager<br/><small>(tmux)</small>"]
SS["State Store<br/><small>state.json</small>"]
end
subgraph External["External"]
CLI["AI CLI<br/><small>Claude Code / OpenCode</small>"]
BG["Background Agents<br/><small>(Task tool)</small>"]
end
end
UI <--> API
API <--> SSE
API --> SM
SM --> S1
SM --> S2
SM --> RC
SM --> SS
S1 --> RT
S1 --> SCR
S2 --> SCR
RC --> SCR
SCR --> CLI
SW --> BG
SW --> SSE
Development
npm install
npx tsx src/index.ts web # Dev mode
npm run build # Production build
npm test # Run tests
See CLAUDE.md for full documentation.
Published Packages
xterm-zerolag-input
Instant keystroke feedback overlay for xterm.js. Eliminates perceived input latency over high-RTT connections by rendering typed characters immediately as a pixel-perfect DOM overlay. Zero dependencies, configurable prompt detection, full state machine with 78 tests.
npm install xterm-zerolag-input
License
MIT — see LICENSE
Track sessions. Visualize agents. Control respawn. Let it run while you sleep.



