- Overview
- Architecture
- Installation
- Configuration
- Usage
- Features
- Security
- API Reference
- Troubleshooting
- Development
Agent Orchestrator is a web-based multi-terminal management system for running multiple AI coding agent sessions in parallel (Claude Code, Codex, etc.). It provides real-time monitoring, status tracking, and unified control over multiple agent terminals.
Note: the repository is still named
claude-orchestratorfor historical reasons. The UI/product name is Agent Orchestrator.
- Multi-Workspace Tabs: browser-like tabs for switching between multiple workspaces
- Terminal Dashboard: dynamic terminal grid per workspace (1–16 pairs)
- Real-time Status Tracking: Visual indicators for idle/busy/waiting states
- Smart Notifications: Browser alerts when Claude needs input
- Git Integration: branch/status/PR metadata and worktree operations
- Tasks (Trello): browse boards/cards and perform common write actions (comments/move/assign/due/dependencies)
- Process Layer: Queue + tier tags + risk metadata + prompt artifacts + dependencies
- Diff Viewer: advanced PR/code review with Markdown rendering support
- Express Server: HTTP server and static file serving
- Socket.IO: Real-time bidirectional communication
- node-pty: Pseudo-terminal process management
- Service Architecture:
SessionManager: Manages PTY processes and session lifecycleStatusDetector: Detects Claude's state from output patternsGitHelper: Handles git operations and branch detectionNotificationService: Manages alerts and notificationsTokenCounter: Tracks context usage (Phase 2)TaskTicketingService: Trello task provider abstraction (/api/tasks/*)TaskRecordService: tier/risk/prompt metadata (/api/process/task-records/*)TaskDependencyService: dependency resolution (/api/process/*/dependencies)
- Xterm.js: Terminal rendering and interaction
- WebSocket Client: Real-time updates
- Service Architecture:
ClaudeOrchestrator: Main application controllerTerminalManager: Handles Xterm.js instancesNotificationManager: Browser notifications and alerts
- Node.js 16+
- Git
- Claude CLI installed and configured
- (Recommended) git worktrees set up per repo (
work1…workN) for fast parallel agent work
# Clone the repository
git clone <repository-url> claude-orchestrator
cd claude-orchestrator
# Run installation script
./install.sh
# Or manually:
npm install
cp .env.example .env
mkdir -p logs sessionsEdit .env file:
# Server
ORCHESTRATOR_PORT=3000
ORCHESTRATOR_HOST=127.0.0.1
# For LAN access (recommended with AUTH_TOKEN):
# ORCHESTRATOR_HOST=0.0.0.0
# Security
AUTH_TOKEN=your-secret-token
# Worktrees are configured via `config.json` (worktrees.basePath/worktrees.count)
# Session settings
SESSION_TIMEOUT=1800000 # 30 minutes
MAX_PROCESSES_PER_SESSION=50
# Logging
LOG_LEVEL=info
# Token tracking
MAX_CONTEXT_TOKENS=200000# Development (web-only)
npm run dev:web
# Development (web-only, safe ports; avoids colliding with a running prod instance)
npm run dev:web:safe
# Production mode
npm start- Dashboard URLs depend on your ports.
- Safe default for dev work is typically:
- server:
ORCHESTRATOR_PORT=4001 - client:
CLIENT_PORT=4100
- server:
- Statistics: Shows active/waiting/idle Claude sessions
- Notifications: Bell icon with unread count
- Settings: Configure notifications, sounds, theme
- Connection Status: Shows server connection state
Each worktree shows:
- Claude Terminal: AI agent interface
- Server Terminal: For running game server
- Branch Name: Current git branch
- Status Indicator:
- 🟢 Green: Idle/ready
- 🟡 Yellow: Busy/processing
- 🔴 Red: Waiting for input
- ⚫ Gray: Exited/stopped
When Claude is waiting for input:
- Yes/No buttons: Quick response buttons
- Search: Find text in terminal output
Ctrl+Shift+F: Search in terminalCtrl+C: Copy selected textCtrl+V: Paste text
- Multi-terminal web dashboard
- Real-time terminal streaming
- Status detection (idle/busy/waiting)
- Browser notifications
- Git branch display
- Quick action buttons
- Session restart capability
- Local network access
- Authentication support (can be disabled)
- Token usage tracking (basic)
- Enhanced status detection
- Terminal search functionality
- Session logs export
- Performance optimizations
- Mobile-optimized layout
- Task queue system
- Multi-agent coordination
- Automated git operations
- Result comparison
- AI agent communication
- ✅ Workflow modes: Focus (T1–T2) / Review (all; opens Queue) / Background (T3–T4)
- ✅ Queue (“📥 Queue”) for unified PR/worktree/session review
- ✅ Tier tagging per task and per agent tile
- ✅ Dependencies:
- Trello-backed via checklist named
Dependencies - Orchestrator-native via task records (
~/.orchestrator/task-records.json) - Queue includes a dependency graph modal (bounded depth) + “pick from queue” linking
- Trello-backed via checklist named
- ✅ Prompt artifacts see
~/.orchestrator/prompts/<id>.md - ✅ Tasks: board↔repo mapping + “Launch agent from Trello card” (via Tasks → Board Settings + card detail Launch section)
- ✅ Review conveyor: “Reviewer” + “Fixer” actions for PR tasks
Commander can drive the process layer via semantic commands (and voice uses the same command registry):
- Workflow modes:
set-workflow-mode(focus|review|background) - Focus behavior:
set-focus-tier2(auto|always) - Focus behavior:
Swap T2button auto-swaps to Tier 2 while Tier 1 is busy (persisted inui.workflow.focus.autoSwapToTier2WhenTier1Busy) - Panels:
open-queue,open-tasks,open-advice
Voice examples (rule-based, no LLM required):
- “enter focus mode”
- “tier two always”
- “open queue”
Set AUTH_TOKEN in .env to enable authentication:
AUTH_TOKEN=your-secret-tokenAccess methods:
- URL parameter:
http://localhost:3000?token=your-secret-token - Saved in browser (localStorage)
- Header:
X-Auth-Token: your-secret-token
- Local-only by default: No external API calls
- Input validation: Path traversal protection
- Process isolation: Resource limits per session
- Secure logging: Sensitive data redaction
- Rate limiting: Notification spam protection
- Always use authentication in shared environments
- Bind to localhost only if not using LAN access
- Use HTTPS with reverse proxy for remote access
- Regularly update dependencies
- Monitor logs for suspicious activity
terminal-input: Send input to terminalsocket.emit('terminal-input', { sessionId, data })
terminal-resize: Resize terminalsocket.emit('terminal-resize', { sessionId, cols, rows })
restart-session: Restart a sessionsocket.emit('restart-session', { sessionId })
sessions: Initial session statesterminal-output: Terminal output datastatus-update: Session status changebranch-update: Git branch changenotification-trigger: Notification eventsession-exited: Session terminatedsession-restarted: Session restarted
GET /: Dashboard UIGET /health: Health check{ "status": "ok", "timestamp": "2024-01-01T00:00:00Z", "uptime": 12345 }
- Check if server is running:
ps aux | grep node - Check firewall settings for port 3000
- Verify HOST setting in .env
- Check browser console for errors
- Verify WebSocket connection
- Check if Claude CLI is installed
- Verify AUTH_TOKEN matches in .env and request
- Clear browser cache/localStorage
- Check server logs
- Reduce terminal scrollback in code
- Restart long-running sessions
- Check for process leaks with
ps aux
Enable verbose logging:
LOG_LEVEL=debugCheck logs:
tail -f logs/combined.log
tail -f logs/sessions.log
tail -f logs/error.logclaude-orchestrator/
├── server/ # Backend Node.js code
│ ├── index.js # Main server
│ ├── sessionManager.js
│ ├── statusDetector.js
│ ├── gitHelper.js
│ ├── notificationService.js
│ └── tokenCounter.js
├── client/ # Frontend code
│ ├── index.html
│ ├── app.js
│ ├── terminal.js
│ ├── notifications.js
│ └── styles.css
├── logs/ # Log files (gitignored)
├── sessions/ # Session data (gitignored)
└── config/ # Configuration files
For process-layer status and resume docs, see:
PLANS/2026-01-25/WORKFLOW_TIER_RISK_PROMPTS.mdPLANS/2026-01-25/BRAIN_DUMP_IMPLEMENTATION_PLAN.mdPLANS/2026-01-25/DATA_MODEL.md
- Create service in
server/ - Import in
server/index.js - Initialize with dependencies
- Add WebSocket handlers
- Create class in
client/ - Import in
index.html - Initialize in
app.js - Add event handlers
# Run linting (when added)
npm run lint
# Manual testing
npm run dev
# Open multiple browser tabs
# Test all features- Fork the repository
- Create feature branch
- Make changes with clear commits
- Test thoroughly
- Submit pull request
- Limit scrollback buffer
- Throttle output updates
- Use virtual scrolling
- Batch DOM updates
- Compress WebSocket messages
- Batch status updates
- Use binary frames for large data
- Implement reconnection logic
- Monitor memory usage
- Implement session pooling
- Auto-cleanup inactive sessions
- Use worker threads for heavy operations
Edit server/statusDetector.js:
this.waitingPatterns.push(/Your pattern here/i);Add to server/notificationService.js:
notifyCustom(sessionId, message) {
return this.notify(sessionId, 'custom', message, {
priority: 'high',
actionRequired: true
});
}Add keyboard shortcuts in client/terminal.js:
if (e.ctrlKey && e.key === 'x') {
// Your custom action
}MIT License - See LICENSE file for details