Mission control for AI coding agents. A native macOS app that lets you monitor all your Claude Code and Codex CLI sessions from one place—like a cosmic harbor where your AI crews dock and report in.
I don't write code anymore (like 98% of the time). Agents do. My job now is review, management, and guidance at the right time.
I've got one real SaaS product (with something like 5 repos and 10 SDKs), plus a couple other products I'm building that don't have users yet. That's a lot of projects, a lot of tasks within those projects, and a lot of LLM agents running around in all of them.
The problem? Keeping track of it all. Which session needs permission? Did that refactor finish? Is Claude waiting on me or still working? I'd find myself cycling through terminal tabs trying to figure out what was happening where.
OrbitDock is how I wrangle all that chaos. One dashboard to track every session across every project—live status updates, conversation history, usage limits, and quick terminal access. It's mission control for my new way of working.
- Multi-Provider Support - Track Claude Code and Codex CLI sessions together
- Live Session Monitoring - Watch conversations unfold in real-time
- 5-State Status System - Working, Permission, Question, Reply, Ended
- Quick Switcher (⌘K) - Jump between sessions or run commands instantly
- Quest System - Flexible work containers with linked sessions, PRs, and inbox
- Usage Tracking - Monitor rate limits for both Claude and Codex
- Focus Terminal (⌘T) - Jump directly to the iTerm2 tab running a session
- Cosmic Harbor Theme - Dark theme optimized for OLED displays
See FEATURES.md for the full feature list.
| Provider | Session Tracking | Usage Monitoring | Notes |
|---|---|---|---|
| Claude Code | CLI hooks + FSEvents | OAuth API | Hooks for status, FSEvents for transcripts |
| Codex CLI | Native FSEvents | App Server API | Watches ~/.codex/sessions/ rollouts |
- macOS 14.0+
- Xcode 15+ (for building from source)
- At least one CLI installed:
- Claude Code:
npm install -g @anthropic-ai/claude-code - Codex CLI: See OpenAI Codex docs
- Claude Code:
- Download the latest
.dmgfrom Releases - Drag
OrbitDock.appto/Applications - Open the app and go to Settings → Setup
- Copy the hook configuration and add it to
~/.claude/settings.json - Restart Claude Code to activate hooks
git clone https://github.com/your-username/orbitdock.git
cd orbitdock
open CommandCenter/CommandCenter.xcodeprojBuild and run with ⌘R. The CLI is automatically embedded in the app bundle.
Note: Codex CLI support is automatic—no hook setup needed. OrbitDock watches ~/.codex/sessions/ using native FSEvents.
Add to ~/.claude/settings.json:
{
"hooks": {
"SessionStart": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli session-start", "async": true}]}],
"SessionEnd": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli session-end", "async": true}]}],
"UserPromptSubmit": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli status-tracker", "async": true}]}],
"Stop": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli status-tracker", "async": true}]}],
"Notification": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli status-tracker", "async": true}]}],
"PreToolUse": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli tool-tracker", "async": true}]}],
"PostToolUse": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli tool-tracker", "async": true}]}],
"PostToolUseFailure": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli tool-tracker", "async": true}]}],
"SubagentStart": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli subagent-tracker", "async": true}]}],
"SubagentStop": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli subagent-tracker", "async": true}]}],
"PreCompact": [{"hooks": [{"type": "command", "command": "/Applications/OrbitDock.app/Contents/MacOS/orbitdock-cli status-tracker", "async": true}]}]
}
}| Hook | Command | Purpose |
|---|---|---|
SessionStart |
session-start | Creates session, captures model & permission mode |
SessionEnd |
session-end | Marks session ended with reason |
UserPromptSubmit |
status-tracker | Sets status to "working", captures first prompt |
Stop |
status-tracker | Sets status to "waiting" (reply or question) |
Notification |
status-tracker | Handles permission prompts, idle prompts, auth |
PreToolUse |
tool-tracker | Tracks tool usage, sets "working" status |
PostToolUse |
tool-tracker | Clears permission state after tool runs |
PostToolUseFailure |
tool-tracker | Handles failed/interrupted tools |
SubagentStart |
subagent-tracker | Tracks when Claude spawns agents (Explore, Plan) |
SubagentStop |
subagent-tracker | Tracks when agents finish |
PreCompact |
status-tracker | Records context compaction events |
┌──────────────────────────────────────────────────────────────────┐
│ OrbitDock App │
│ ┌─────────────┐ ┌──────────────────────────────────────────┐ │
│ │ Dashboard │ │ Session Detail │ │
│ │ - Active │ │ - Header (status, model, provider) │ │
│ │ - History │ │ - Conversation View │ │
│ │ - Streams │ │ - Quick Actions │ │
│ └─────────────┘ └──────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Usage Panel - Claude (5h/7d) + Codex (rate windows) │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────┐
│ SQLite + WAL │
│ ~/.orbitdock/ │
│ orbitdock.db │
└─────────────────┘
▲
┌────────────────────┴────────────────────┐
│ │
┌───────┴───────┐ ┌─────────┴─────────┐
│ Claude Code │ │ Codex CLI │
│ Swift CLI │ │ FSEvents Watcher │
│ (embedded) │ │ (Swift) │
└───────────────┘ └───────────────────┘
Claude Code uses a Swift CLI embedded in the app bundle:
orbitdock-cli session-start/end- Lifecycle tracking (model, source, permission mode)orbitdock-cli status-tracker- Work status, attention states, compaction eventsorbitdock-cli tool-tracker- Tool usage and permission state managementorbitdock-cli subagent-tracker- Track spawned agents (Explore, Plan, etc.)
Codex CLI uses native FSEvents watching:
- Watches
~/.codex/sessions/for rollout JSONL files - Parses session_meta, event_msg, and response_item entries
- State persisted in
~/.orbitdock/codex-rollout-state.json
├── migrations/ # Database migrations (SQL)
└── CommandCenter/ # Xcode project
├── OrbitDockCore/ # Shared Swift package
│ └── Sources/
│ ├── OrbitDockCore/ # Database, Git, Models
│ └── OrbitDockCLI/ # CLI hook handler
└── CommandCenter/ # SwiftUI macOS app
├── Models/
│ ├── Provider.swift # Multi-provider enum
│ └── Session.swift # Unified session model
├── Services/
│ ├── UsageServiceRegistry.swift # Coordinates all providers
│ ├── SubscriptionUsageService.swift # Claude usage API
│ ├── CodexUsageService.swift # Codex usage API
│ └── CodexRolloutWatcher.swift # Native FSEvents watcher
└── Views/
└── Usage/ # Provider usage gauges
cd CommandCenter/OrbitDockCore
swift build
.build/debug/orbitdock-cli --help# Check CLI logs
tail -f ~/.orbitdock/cli.log
# Check database directly
sqlite3 ~/.orbitdock/orbitdock.db "SELECT id, work_status FROM sessions LIMIT 5;"| Variable | Description |
|---|---|
ORBITDOCK_DB_PATH |
Override database path (for testing) |
ORBITDOCK_DISABLE_CODEX_WATCHER |
Disable the Codex FSEvents watcher |
ORBITDOCK_CODEX_WATCHER_DEBUG |
Verbose logging for Codex watcher |
The app needs Automation permission to control iTerm2 for the Focus feature:
System Settings → Privacy & Security → Automation → OrbitDock → iTerm
Sessions not appearing?
- For Claude Code: Restart the CLI after configuring hooks
- For Codex: Check that
~/.codex/sessions/exists and has JSONL files
Usage data not loading?
- Claude: Make sure you're logged in (
claude login) - Codex: Check the app server is reachable
Hooks not firing?
- Check
~/.orbitdock/cli.logfor errors - Verify the CLI path in settings.json matches your app location
MIT