From 675cfeaf6789255ad450a740dca4dca163b5bc57 Mon Sep 17 00:00:00 2001
From: arkon
Date: Tue, 24 Feb 2026 12:50:27 +0100
Subject: [PATCH] chore: bump version to 0.1603
---
CLAUDE.md | 2 +-
README.md | 698 +++++-------------
docs/screenshots/mobile-keyboard-closed.png | Bin 0 -> 405949 bytes
docs/screenshots/mobile-keyboard-open.png | Bin 0 -> 745505 bytes
docs/screenshots/mobile-keyboard-visible.png | Bin 199447 -> 0 bytes
docs/screenshots/mobile-main.png | Bin 371049 -> 0 bytes
docs/screenshots/mobile-no-keyboard.png | Bin 380201 -> 0 bytes
docs/screenshots/mobile-session.png | Bin 370890 -> 0 bytes
.../mobile-toolbar-above-keyboard.png | Bin 7690 -> 0 bytes
docs/screenshots/mobile-with-keyboard.png | Bin 246969 -> 0 bytes
package.json | 3 +-
scripts/postinstall.js | 65 +-
12 files changed, 228 insertions(+), 540 deletions(-)
create mode 100644 docs/screenshots/mobile-keyboard-closed.png
create mode 100644 docs/screenshots/mobile-keyboard-open.png
delete mode 100644 docs/screenshots/mobile-keyboard-visible.png
delete mode 100644 docs/screenshots/mobile-main.png
delete mode 100644 docs/screenshots/mobile-no-keyboard.png
delete mode 100644 docs/screenshots/mobile-session.png
delete mode 100644 docs/screenshots/mobile-toolbar-above-keyboard.png
delete mode 100644 docs/screenshots/mobile-with-keyboard.png
diff --git a/CLAUDE.md b/CLAUDE.md
index 743d1c1e..2bb5c621 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -35,7 +35,7 @@ When user says "COM":
1. Increment version in BOTH `package.json` AND `CLAUDE.md` (verify they match with `grep version package.json && grep Version CLAUDE.md`)
2. Run: `git add -A && git commit -m "chore: bump version to X.XXXX" && git push && npm run build && systemctl --user restart claudeman-web`
-**Version**: 0.1602 (must match `package.json` for npm publish)
+**Version**: 0.1603 (must match `package.json` for npm publish)
## Project Overview
diff --git a/README.md b/README.md
index 1cfb5417..3e812b90 100644
--- a/README.md
+++ b/README.md
@@ -2,11 +2,10 @@
-Manage Claude Code sessions better than ever
+The missing control plane for Claude Code
- Autonomous Claude Code work while you sleep
- Persistent sessions, Ralph Loop tracking, Respawn Controller, Agent Visualization, Multi-Session Dashboards
+ 24/7 Autonomous Sessions • Live Agent Visualization • Zero-Lag Input Overlay • Mobile-First UI • Respawn Controller • Multi-Session Dashboard • Ralph Loop Tracking
@@ -17,416 +16,247 @@
----
-
---
+## Quick Start
-
-
-
-
----
-
-## What Claudeman Does
-
-### 🔔 Notification System
-
-Real-time desktop notifications when sessions need attention — never miss a permission prompt or idle session again:
-
-| Hook Event | Urgency | Tab Alert | Meaning |
-|------------|---------|-----------|---------|
-| `permission_prompt` | Critical | Red blink | Claude needs tool approval |
-| `elicitation_dialog` | Critical | Red blink | Claude is asking a question |
-| `idle_prompt` | Warning | Yellow blink | Session idle, waiting for input |
-| `stop` | Info | — | Response complete |
-
-**Features:**
-- Browser notifications enabled by default (auto-requests permission)
-- Click any notification to jump directly to the affected session
-- Tab blinking alerts: red for action-required, yellow for idle
-- Notifications include actual context (tool name, command, question text)
-- Hooks are auto-configured per case directory (`.claude/settings.local.json`)
-- Works on HTTP for local use (localhost is a secure context)
-
----
-
-### 💾 Persistent Sessions
-
-Every Claude session runs inside **tmux** — sessions survive server restarts, network drops, and machine sleep.
+**Requirements:** Node.js 18+, [Claude CLI](https://docs.anthropic.com/en/docs/claude-code/getting-started), tmux (`apt install tmux` / `brew install tmux`)
```bash
-# Your sessions are always recoverable
-CLAUDEMAN_MUX=1
-CLAUDEMAN_SESSION_ID=abc-123-def
-CLAUDEMAN_MUX_NAME=claudeman-myproject
+npm install -g claudeman
+claudeman web
+# Open http://localhost:3000 — press Ctrl+Enter to start your first session
```
-- Sessions auto-recover on startup (dual redundancy: `state.json` + `mux-sessions.json`)
-- All settings (respawn, auto-compact, tokens) survive server restarts
-- Ghost session discovery finds orphaned mux sessions
-- Claude knows it's managed (won't kill its own session)
+`npm install -g` installs the `claudeman` CLI globally. It does **not** start a service — you run `claudeman web` to start the web server. Stop it with Ctrl+C.
----
+
+Full installer (auto-installs dependencies)
-### 🔄 Respawn Controller
-
-**The core of autonomous work.** When Claude becomes idle, the Respawn Controller kicks in:
-
-| State | Action | Next |
-|:-----:|:------:|:----:|
-| **WATCHING** | Monitor for idle | IDLE DETECTED |
-| **IDLE DETECTED** | Confirm silence | SEND UPDATE |
-| **SEND UPDATE** | Push continue prompt | CLEAR |
-| **CLEAR** | Run `/clear` | INIT |
-| **INIT** | Run `/init` | CONTINUE |
-| **CONTINUE** | Resume work | WATCHING |
-
-- Multi-layer idle detection (completion messages, output silence, token stability)
-- Sends configurable update prompts to continue work
-- Auto-cycles `/clear` → `/init` for fresh context
-- Step confirmation (5s silence) between each command
-- **Keeps working even when Ralph loops stop**
-- Run for **24+ hours** completely unattended
+If you don't have Node.js or tmux yet, the install script handles everything:
```bash
-# Enable respawn with 8-hour timer
-curl -X POST localhost:3000/api/sessions/:id/respawn/enable \
- -H "Content-Type: application/json" \
- -d '{
- "config": {
- "updatePrompt": "continue improving the codebase",
- "idleTimeoutMs": 5000
- },
- "durationMinutes": 480
- }'
+curl -fsSL https://raw.githubusercontent.com/Ark0N/claudeman/master/install.sh | bash
```
----
+This installs Node.js, tmux, and Claude CLI if missing, clones Claudeman to `~/.claudeman/app`, builds it, and optionally sets up a systemd service (Linux) for auto-start. After install, run `claudeman web`.
+
-### 🎯 Ralph / Todo Tracking
+
+Run as a background service
-Claudeman detects and tracks Ralph Loops and Todos inside Claude Code:
+**Linux (systemd):**
+```bash
+# The install script offers this automatically, or set it up manually:
+mkdir -p ~/.config/systemd/user
+cat > ~/.config/systemd/user/claudeman-web.service << EOF
+[Unit]
+Description=Claudeman Web Server
+After=network.target
-
-
-
+[Service]
+Type=simple
+ExecStart=$(which node) $(which claudeman) web
+Restart=always
+RestartSec=10
-**Auto-detects:**
-| Pattern | Example |
-|---------|---------|
-| Promise tags | `COMPLETE` |
-| Custom phrases | `ALL_TASKS_DONE` |
-| TodoWrite | `- [ ] Task`, `- [x] Done` |
-| Iterations | `[5/50]`, `Iteration 5 of 50` |
+[Install]
+WantedBy=default.target
+EOF
-**Tracks in real-time:**
-- Completion phrase detection
-- Todo progress (`4/9 complete`)
-- Progress percentage ring
-- Elapsed time
+systemctl --user daemon-reload
+systemctl --user enable --now claudeman-web
+loginctl enable-linger $USER # survive logout
+```
+
+**macOS (launchd):**
+```bash
+mkdir -p ~/Library/LaunchAgents
+cat > ~/Library/LaunchAgents/com.claudeman.web.plist << EOF
+
+
+
+
+ Label
+ com.claudeman.web
+ ProgramArguments
+
+ $(which node)
+ $(which claudeman)
+ web
+
+ RunAtLoad
+
+ KeepAlive
+
+ StandardOutPath
+ /tmp/claudeman.log
+ StandardErrorPath
+ /tmp/claudeman.log
+
+
+EOF
+
+launchctl load ~/Library/LaunchAgents/com.claudeman.web.plist
+```
+
+
+
+Windows (WSL)
+
+```powershell
+wsl bash -c "curl -fsSL https://raw.githubusercontent.com/Ark0N/claudeman/master/install.sh | bash"
+```
+
+Claudeman requires tmux, so Windows users need [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). If you don't have WSL yet: run `wsl --install` in an admin PowerShell, reboot, open Ubuntu, then install Claude CLI inside WSL: `curl -fsSL https://claude.ai/install.sh | bash`. After installing, `http://localhost:3000` is accessible from your Windows browser.
+
---
-### 👁️ Live Agent Visualization
+## Live Agent Visualization
-**Watch your agents work in real-time.** Claudeman monitors Claude Code's background agents (the `Task` tool) and displays them in draggable floating windows with Matrix-style connection lines.
+Watch Claude's background agents work in real-time. Claudeman monitors every `Task` tool invocation 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 Claude Code remotely (VPN, Tailscale, SSH tunnel), every keystroke normally takes 200-300ms to round-trip. Claudeman 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 `` at z-index 7 inside `.xterm-screen`, completely immune to Ink's constant screen redraws (two previous attempts using `terminal.write()` failed because Ink corrupts injected buffer content)
+- **Font-matched rendering** — reads `fontFamily`, `fontSize`, `fontWeight`, and `letterSpacing` from 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`](https://www.npmjs.com/package/xterm-zerolag-input) — see [Published Packages](#published-packages).
+
+---
+
+## Mobile
+
+The most responsive Claude Code experience on any phone. Full xterm.js terminal with local echo, swipe navigation, and a touch-optimized interface designed for real remote work.
+
-
+
+
+
-**Features:**
-- **Floating windows** — Draggable, resizable panels for each agent
-- **Connection lines** — Animated green lines linking parent sessions to agent windows
-- **Live activity log** — See every tool call, progress update, and message in real-time
-- **Status indicators** — Green (active), yellow (idle), blue (completed)
-- **Model badges** — Shows Haiku/Sonnet/Opus with color coding
-- **Auto-behavior** — Windows auto-open on spawn, auto-minimize on completion
-- **Tab badge** — Shows "AGENT" or "AGENTS (n)" count on session tabs
+| Terminal Apps | Claudeman Mobile |
+|:--------------|:-----------------|
+| 200-300ms input lag over remote | **Local echo — instant feedback** |
+| Tiny text, no context | Full xterm.js terminal, responsive layout |
+| No session management | Swipe between sessions, status badges |
+| No notifications | Push alerts for approvals and idle |
+| Manual reconnect after drops | tmux persistence — sessions survive anything |
+| No agent visibility | Background agents in real-time |
+| Copy-paste slash commands | One-tap `/init`, `/clear`, `/compact` buttons |
-**Subagent API:**
-| 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 |
+- **Swipe navigation** — left/right on the terminal to switch sessions (80px threshold, 300ms)
+- **Keyboard accessory bar** — `/init`, `/clear`, `/compact` quick-action buttons appear above the virtual keyboard with confirmation dialogs for destructive commands
+- **Smart keyboard handling** — toolbar and terminal shift up when keyboard opens (uses `visualViewport` API 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: touch` for buttery scroll
+
+```bash
+claudeman web --https
+# Open on your phone: https://:3000
+```
+
+> `localhost` works over plain HTTP. Use `--https` when accessing from another device.
---
-### 🔍 Project Insights Panel
+## Respawn Controller
-Real-time visibility into what Claude is reading and searching:
+The core of autonomous work. When Claude goes idle, the Respawn Controller detects it, sends a continue prompt, cycles `/clear` -> `/init` for fresh context, and resumes — running **24+ hours** completely unattended.
-- **Active Bash tools** displayed as they run (file viewers, grep, find)
-- **Clickable file paths** — Jump directly to files in Claude Code
-- **Timeout indicators** — See how long tools have been running
-- **Smart deduplication** — Overlapping file ranges collapsed
+```
+WATCHING → IDLE DETECTED → SEND UPDATE → /clear → /init → CONTINUE → WATCHING
+```
-Toggle via App Settings → Display → "Show Project Insights Panel"
+- **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)
---
-### 📊 Smart Token Management
+## Multi-Session Dashboard
-Never hit token limits unexpectedly:
+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. Claude knows it's managed and 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` |
-```bash
-# Configure per-session
-curl -X POST localhost:3000/api/sessions/:id/auto-compact \
- -d '{"enabled": true, "threshold": 100000}'
-```
+### 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.
-### 🖥️ Multi-Session Dashboard
+### Ralph / Todo Tracking
-Run **20 parallel sessions** with full visibility:
-
-- Real-time xterm.js terminals (60fps streaming)
-- Per-session token and cost tracking
-- Tab-based navigation
-- One-click session management
+Auto-detects Ralph Loops, `` tags, TodoWrite progress (`4/9 complete`), and iteration counters (`[5/50]`) with real-time progress rings and elapsed time tracking.
-
+
-**Monitor Panel** — Real-time session monitoring with memory, CPU, and process info:
+### 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
+
+Claude Code uses Ink (React for terminals) which redraws the entire screen on every state change. Claudeman 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)
+```
---
-### ⚡ Zero-Flicker Terminal Rendering
+## SSH Alternative (`sc`)
-**The problem:** Claude Code uses [Ink](https://github.com/vadimdemedes/ink) (React for terminals), which redraws the entire screen on every state change. Without special handling, you'd see constant flickering — unusable for monitoring multiple sessions.
-
-**The solution:** Claudeman implements a 6-layer antiflicker system that delivers butter-smooth 60fps terminal output:
-
-| PTY Output | **→** | 16ms Batch | **→** | DEC 2026 Wrap | **→** | SSE | **→** | rAF Batch | **→** | xterm.js | **→** | 60fps Canvas |
-|:----------:|:-----:|:----------:|:-----:|:-------------:|:-----:|:---:|:-----:|:---------:|:-----:|:--------:|:-----:|:------------:|
-
-#### How Each Layer Works
-
-| Layer | Location | Technique | Purpose |
-|-------|----------|-----------|---------|
-| **1. Server Batching** | server.ts | 16ms collection window | Combines rapid PTY writes into single packets |
-| **2. DEC Mode 2026** | server.ts | `\x1b[?2026h`...`\x1b[?2026l` | Marks atomic update boundaries (terminal standard) |
-| **3. Client rAF** | app.js | `requestAnimationFrame` | Syncs writes to 60Hz display refresh |
-| **4. Sync Block Parser** | app.js | DEC 2026 extraction | Parses atomic segments for xterm.js |
-| **5. Flicker Filter** | app.js | Ink pattern detection | Buffers screen-clear sequences (optional) |
-| **6. Chunked Loading** | app.js | 64KB/frame writes | Large buffers don't freeze UI |
-
-#### Technical Implementation
-
-**Server-side (16ms batching + DEC 2026):**
-```typescript
-// Accumulate PTY output per-session
-const newBatch = existing + data;
-terminalBatches.set(sessionId, newBatch);
-
-// Flush every 16ms (60fps) or immediately if >1KB
-if (!terminalBatchTimer) {
- terminalBatchTimer = setTimeout(() => {
- for (const [id, data] of terminalBatches) {
- // Wrap with synchronized output markers
- const syncData = '\x1b[?2026h' + data + '\x1b[?2026l';
- broadcast('session:terminal', { id, data: syncData });
- }
- terminalBatches.clear();
- }, 16);
-}
-```
-
-**Client-side (rAF batching + sync block handling):**
-```javascript
-batchTerminalWrite(data) {
- pendingWrites += data;
-
- if (!writeFrameScheduled) {
- writeFrameScheduled = true;
- requestAnimationFrame(() => {
- // Wait up to 50ms for incomplete sync blocks
- if (hasStartMarker && !hasEndMarker) {
- setTimeout(flushPendingWrites, 50);
- return;
- }
-
- // Extract atomic segments, strip markers, write to xterm
- const segments = extractSyncSegments(pendingWrites);
- for (const segment of segments) {
- terminal.write(segment);
- }
- });
- }
-}
-```
-
-**Optional flicker filter** detects Ink's screen-clear patterns (`ESC[2J`, `ESC[H ESC[J`) and buffers 50ms of subsequent output for extra smoothness on problematic terminals.
-
-**Result:** Watch 20 Claude sessions simultaneously without any visual artifacts, even during heavy tool use.
-
----
-
-### ⌨️ Lag-Free Terminal Input — Local Echo with Background Forwarding
-
-**The problem:** When accessing Claude Code remotely (VPN, Tailscale, SSH tunnel), every keystroke takes 200-300ms to echo back from the server. You type blind, make mistakes you can't see, and the whole experience feels broken. Traditional terminal apps have no solution for this — you're stuck with the round-trip latency.
-
-**The solution:** Claudeman implements a **Mosh-inspired local echo system** that makes typing feel instant, no matter how far away the server is. Keystrokes appear immediately in a pixel-perfect DOM overlay while simultaneously being forwarded to the PTY in the background.
-
-#### Why This Is Hard (and Why Nobody Else Does It)
-
-Claude Code uses [Ink](https://github.com/vadimdemedes/ink) (React for terminals), which **redraws the entire screen on every state change**. This makes the standard approach of writing directly to the terminal buffer impossible — Ink would immediately corrupt any injected characters on its next redraw cycle. Two separate attempts to use `terminal.write()` for local echo both failed for this reason.
-
-#### How It Works
-
-The system has three components working together:
-
-| Component | What It Does |
-|-----------|-------------|
-| **DOM Overlay** | A `` positioned inside xterm.js's `.xterm-screen` at z-index 7. Shows typed characters with pixel-perfect font matching. Completely invisible to Ink because it never touches the terminal buffer. |
-| **Background Forwarding** | Every keystroke is also sent to the PTY in the background (50ms debounced batches). The server's terminal state stays in sync — Tab completion, history, and all shell features work normally. |
-| **Enter Split** | When you press Enter, any remaining buffered keystrokes are flushed first, then Enter is sent separately after 120ms. This ensures the PTY has the complete text before submission. |
-
-#### The Overlay: Why a DOM Element Beats Buffer Writes
-
-```
-xterm.js DOM structure:
-├── .xterm-viewport (scrolling)
-└── .xterm-screen (position: relative)
- ├── .xterm-rows (z-index: 0) ← Ink owns this, redraws constantly
- ├── .xterm-selection (z-index: 1)
- ├── .xterm-helpers (z-index: 5)
- └── LOCAL ECHO OVERLAY (z-index: 7) ← Our overlay, Ink can't touch it
-```
-
-The overlay scans the terminal buffer bottom-up to find Claude Code's `❯` prompt marker, then positions itself right after it. It handles multi-line wrapping when input exceeds the terminal width, renders a block cursor at the end, and uses an opaque background that cleanly covers the server's stale cursor position.
-
-Font matching is critical: the overlay reads `fontFamily`, `fontSize`, `fontWeight`, and `letterSpacing` directly from xterm.js's `.xterm-rows` computed style, so the echo text is visually indistinguishable from real terminal text.
-
-#### Background Forwarding: The Key Innovation
-
-Previous local echo implementations (including our own earlier attempts) buffered input locally and only sent it on Enter. This broke Tab completion, shell history, and any interactive feature that depends on the PTY seeing keystrokes in real-time.
-
-Background forwarding solves this: every character is queued into a 50ms debounce buffer and sent to the PTY silently. The server processes keystrokes normally — Tab completion works, `Ctrl+R` history search works, everything works. The overlay just provides instant visual feedback while the round-trip happens invisibly.
-
-```
-Keystroke Flow:
- ┌─── DOM overlay (instant, 0ms)
-User types 'h' ─── onData('h') ───┤
- └─── Background buffer ──[50ms]──→ PTY
- │
-Server echoes 'h' ←────────────────────────────────────────────────────┘
- │ (200-300ms RTT)
- └──→ flushPendingWrites() ──→ overlay.clear()
- (server output replaces overlay — seamless transition)
-```
-
-#### Edge Cases Handled
-
-| Scenario | Behavior |
-|----------|----------|
-| **Paste** (multi-char) | Appended to overlay + sent to PTY immediately (no debounce) |
-| **Backspace** | Removes last overlay char + sends `\x7f` to PTY in background |
-| **Misprediction** | Server output arrives → overlay clears → server redraws correctly |
-| **Tab completion** | Background forwarding means PTY receives Tab keystroke normally |
-| **Ctrl+C / escape** | Overlay clears, control char sent immediately |
-| **Page reload** | Unsent input persisted to `localStorage`, restored on reconnect |
-| **Ink screen redraw** | Overlay is a separate DOM layer — completely unaffected |
-| **Tab switch** | Background buffer flushed to outgoing session before switching |
-
-#### The Result
-
-Typing over a 200-300ms connection feels identical to localhost. The overlay provides instant character feedback while background forwarding keeps the PTY perfectly synchronized. When the server's echo arrives (200-300ms later), the overlay seamlessly disappears and the real terminal text takes over — the transition is invisible.
-
-Enabled by default. Works during both idle and busy sessions.
-
-> **Open Source:** The local echo overlay has been extracted into a standalone library — [`xterm-zerolag-input`](https://www.npmjs.com/package/xterm-zerolag-input) — so any developer can add zero-latency input to their xterm.js application. See [Published Packages](#published-packages) below.
-
----
-
-### 📈 Run Summary ("What Happened While You Were Away")
-
-Click the chart icon on any session tab to see a complete timeline of what happened:
-
-**Tracked Events:**
-- Session start/stop and respawn cycles
-- Idle/working transitions with durations
-- Token milestones (every 50k tokens)
-- Auto-compact and auto-clear triggers
-- Ralph Loop completions
-- AI check results (idle detection verdicts)
-- Hook events (permissions, questions, stops)
-- Errors, warnings, and stuck-state alerts
-
-**Stats at a glance:**
-- Total respawn cycles
-- Peak token usage
-- Active vs idle time
-- Error/warning counts
-
----
-
-## Installation
-
-### macOS & Linux
+If you prefer SSH (Termius, Blink, etc.), the `sc` command is a thumb-friendly session chooser:
```bash
-curl -fsSL https://raw.githubusercontent.com/Ark0N/claudeman/master/install.sh | bash
+sc # Interactive chooser
+sc 2 # Quick attach to session 2
+sc -l # List sessions
```
-### Windows (WSL)
-
-```powershell
-wsl bash -c "curl -fsSL https://raw.githubusercontent.com/Ark0N/claudeman/master/install.sh | bash"
-```
-
-> **Prerequisites:** Claudeman requires tmux, so Windows users need [WSL](https://learn.microsoft.com/en-us/windows/wsl/install). If you don't have WSL yet:
-> 1. Run `wsl --install` in an admin PowerShell, then reboot
-> 2. Open **Ubuntu** from the Start menu to complete setup (create your Linux user)
-> 3. Install Claude CLI inside WSL: `curl -fsSL https://claude.ai/install.sh | bash`
-> 4. Then run the one-liner above
->
-> After installing, `http://localhost:3000` is accessible from your Windows browser.
-
-### npm (alternative)
-
-```bash
-npm install -g claudeman
-```
-
-### Requirements
-
-- Node.js 18+
-- [Claude CLI](https://docs.anthropic.com/en/docs/claude-code/getting-started) installed
-- tmux (`apt install tmux` / `brew install tmux`)
-
-## Getting Started
-
-```bash
-claudeman web
-# Open http://localhost:3000
-# Press Ctrl+Enter to start your first session
-```
-
-> **Note:** HTTP works fine for local use since `localhost` is treated as a secure context by browsers. Use `--https` only when accessing from another machine on your network.
+Single-digit selection (1-9), color-coded status, token counts, auto-refresh. Detach with `Ctrl+A D`.
---
@@ -439,115 +269,9 @@ claudeman web
| `Ctrl+Tab` | Next session |
| `Ctrl+K` | Kill all sessions |
| `Ctrl+L` | Clear terminal |
-
----
-
-## Mobile — The Best Claude Code Experience on Any Phone
-
-**Forget terminal apps.** Claudeman gives you the most responsive Claude Code shell ever built for mobile — with **local echo** that makes typing feel instant, even over high-latency connections.
-
-### Local Echo — Zero-Latency Typing
-
-When you're accessing Claude Code remotely (VPN, Tailscale, SSH tunnel), every keystroke normally takes 200-300ms to echo back from the server. Local echo eliminates this completely:
-
-- **Instant character feedback** — keystrokes appear immediately in a DOM overlay that perfectly matches Claude Code's terminal rendering
-- **Full editing support** — backspace, retype, correct mistakes before sending
-- **Input capture mode** — characters are buffered locally; only the final edited text is sent when you press Enter
-- **Persistent across reconnects** — unsent input survives page reloads and SSE disconnects via localStorage
-- **Block cursor** — pixel-perfect replica of Claude Code's native cursor
-- **Enabled by default on mobile** — works during both idle and busy sessions
-
-> *Built for real-world use: Thailand → Switzerland over Tailscale, 200-300ms RTT, typing feels like localhost.*
-
-
-
-
-
-
-
-### Why It's Better Than Any Terminal App
-
-| Terminal Apps | Claudeman Mobile |
-|:--------------|:-----------------|
-| 200-300ms input lag over remote | **Local echo — instant keystroke feedback** |
-| Tiny text, no context | Full xterm.js terminal, responsive layout |
-| No session management | Swipe between sessions, tab badges show status |
-| No notifications | Push alerts when Claude needs approval or goes idle |
-| Manual reconnect after drops | tmux persistence — sessions survive anything |
-| No agent visibility | See background agents working in real-time |
-| No token/cost tracking | Live token counts and cost per session |
-| Copy-paste slash commands | One-tap `/init`, `/clear`, `/compact` buttons |
-
-### Setup
-
-```bash
-# Start with HTTPS for mobile access over your network
-claudeman web --https
-
-# Open on your phone: https://:3000
-```
-
-> **Tip:** Local access on `localhost` works over plain HTTP. Use `--https` when accessing from another device on your network.
-
-### Touch-Optimized Interface
-
-| Feature | How It Works |
-|---------|-------------|
-| **Swipe Navigation** | Swipe left/right on the terminal to switch sessions (80px threshold, 300ms) |
-| **Keyboard Accessory Bar** | `/init`, `/clear`, `/compact` quick-action buttons appear above the virtual keyboard |
-| **Smart Keyboard Handling** | Toolbar and terminal shift up when the keyboard opens (uses `visualViewport` API) |
-| **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 |
-| **Confirmation Dialogs** | Destructive commands require a tap to confirm — no accidental `/clear` |
-| **Bottom Sheet Case Picker** | Slide-up modal replaces the desktop dropdown for case selection |
-| **Native Momentum Scrolling** | Terminal uses `-webkit-overflow-scrolling: touch` for buttery scroll |
-
-### Keyboard Accessory Bar
-
-When the virtual keyboard is open, a quick-action bar appears above the toolbar:
-
-| Button | Action | Confirmation |
-|--------|--------|--------------|
-| `/init` | Reinitialize context | "Run /init command?" |
-| `/clear` | Clear conversation | "Clear conversation history?" |
-| `/compact` | Summarize context | "Compact context?" |
-| `⌄` | Dismiss keyboard | — |
-
-### Mobile-Optimized Layout
-
-The mobile UI strips away desktop complexity to keep things fast and focused:
-
-- **Full-width terminal** with scrollable session tabs
-- Case management via bottom sheet (not desktop dropdown)
-- Monitor/subagent panels hidden by default (toggle in settings)
-- Full-screen modals for settings
-- Compact typography and spacing
-
----
-
-### Claudeman Sessions (`sc`) — Mobile SSH Alternative
-
-If you prefer SSH (via Termius, Blink, etc.), the `sc` command is a thumb-friendly session chooser:
-
-```bash
-sc # Interactive chooser
-sc 2 # Quick attach to session 2
-sc -l # List sessions
-```
-
-- **Single-digit selection** (1-9) — fast thumb typing on phone keyboards
-- **Color-coded status** — green for attached, gray for detached, `R` for respawn
-- **Token counts** displayed per session
-- **Pagination** for many sessions, auto-refresh every 60s
-
-| Symbol | Meaning |
-|--------|---------|
-| `●` / `*` | Attached (someone connected) |
-| `○` / `-` | Detached (available) |
-| `R` | Respawn enabled |
-| `45k` | Token count |
-
-**Detach:** `Ctrl+A D`
+| `Ctrl+Shift+R` | Restore terminal size |
+| `Ctrl/Cmd +/-` | Font size |
+| `Escape` | Close panels |
---
@@ -568,36 +292,27 @@ sc -l # List sessions
| `POST` | `/api/sessions/:id/respawn/stop` | Stop controller |
| `PUT` | `/api/sessions/:id/respawn/config` | Update config |
-### Ralph / Todo Tracking
+### Ralph / Todo
| Method | Endpoint | Description |
|--------|----------|-------------|
| `GET` | `/api/sessions/:id/ralph-state` | Get loop state + todos |
| `POST` | `/api/sessions/:id/ralph-config` | Configure tracking |
-### Subagents (Claude Code Background Agents)
+### 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 |
-| `GET` | `/api/sessions/:id/subagents` | Subagents for session's working dir |
-### Hooks & Notifications
-| Method | Endpoint | Description |
-|--------|----------|-------------|
-| `POST` | `/api/hook-event` | Hook callbacks `{event, sessionId, data?}` → notifications + tab alerts |
-
-### Run Summary
-| Method | Endpoint | Description |
-|--------|----------|-------------|
-| `GET` | `/api/sessions/:id/run-summary` | Timeline + stats for "what happened" |
-
-### Real-Time
+### 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 |
---
@@ -605,7 +320,7 @@ sc -l # List sessions
```mermaid
flowchart TB
- subgraph Claudeman["🖥️ CLAUDEMAN"]
+ subgraph Claudeman["CLAUDEMAN"]
subgraph Frontend["Frontend Layer"]
UI["Web UI
xterm.js + Agent Windows"]
API["REST API
Fastify"]
@@ -653,19 +368,6 @@ flowchart TB
---
-## Performance
-
-Optimized for long-running autonomous sessions:
-
-| Feature | Implementation |
-|---------|----------------|
-| **60fps terminal** | 16ms server batching, `requestAnimationFrame` client |
-| **Memory management** | Auto-trimming buffers (2MB terminal, 1MB text) |
-| **Event debouncing** | 50-500ms on rapid state changes |
-| **State persistence** | Debounced writes, dual-redundancy recovery |
-
----
-
## Development
```bash
@@ -681,44 +383,16 @@ See [CLAUDE.md](./CLAUDE.md) for full documentation.
## Published Packages
-Standalone libraries extracted from Claudeman, available on npm for use in any project:
-
### [`xterm-zerolag-input`](https://www.npmjs.com/package/xterm-zerolag-input)
[](https://www.npmjs.com/package/xterm-zerolag-input)
-Instant keystroke feedback overlay for xterm.js. Eliminates perceived input latency over high-RTT connections (SSH web clients, cloud IDEs, mobile terminals) by rendering typed characters immediately as a pixel-perfect DOM overlay.
-
-- **Zero dependencies** — works with both `xterm` (pre-5.4) and `@xterm/xterm` (5.4+)
-- **Configurable prompt detection** — character (`$`, `>`, `❯`), regex, or custom function
-- **Full state machine** — pending text, flushed text tracking, tab-switch save/restore, tab completion detection
-- **78 tests** covering every state transition
+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.
```bash
npm install xterm-zerolag-input
```
-```typescript
-import { ZerolagInputAddon } from 'xterm-zerolag-input';
-
-const zerolag = new ZerolagInputAddon({
- prompt: { type: 'character', char: '$', offset: 2 },
-});
-terminal.loadAddon(zerolag);
-
-terminal.onData((data) => {
- if (data === '\r') {
- const text = zerolag.pendingText;
- zerolag.clear();
- ws.send(text + '\r');
- } else if (data === '\x7f') {
- if (zerolag.removeChar() === 'flushed') ws.send(data);
- } else if (data.length === 1 && data.charCodeAt(0) >= 32) {
- zerolag.addChar(data);
- }
-});
-```
-
[Full documentation](packages/xterm-zerolag-input/README.md)
---
diff --git a/docs/screenshots/mobile-keyboard-closed.png b/docs/screenshots/mobile-keyboard-closed.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfc0082ddb6863165559f9ccef2da747d227a9cb
GIT binary patch
literal 405949
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%0AJO!n~pecIl;9FGpG*q_^;Oz4QLB3izcG9d1^Ff
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