Monitor your Claude Code sessions
as cute little crabs
A floating Dynamic Island for macOS that gives each Claude Code session a unique crab identity. See working, idle, and permission states at a glance across all your terminals — or from your phone via the built-in web dashboard.
All your Claude Code sessions at a glance
Keep track of all your parallel Claude Code sessions without switching between terminal windows. Real-time status, sound alerts, inline permissions, and a web dashboard for your phone.
Dynamic Island
A floating pill near your notch with an animated crab. Compact when idle, expands on click to reveal all sessions.
Ambient Glow
The island glows green while working, pulses orange when a session needs input, and flashes pink on errors.
Sound Alerts
Hear a sound when any session needs your input or permission. Never miss a prompt while multitasking.
Inline Permissions
Approve or deny tool permissions directly from the island widget. Allow, Deny, or Always Allow with a single click.
Code Preview
See a scrollable, syntax-highlighted preview of file changes before approving write permissions.
Click-to-Focus
Click any session to focus its terminal. Supports tmux panes, Ghostty, iTerm2, Terminal.app, and more.
Web Dashboard
Local web server with real-time updates. Monitor sessions and approve permissions from your phone. Installable as a PWA.
Expandable Content
Expand large permission content to 50% screen width with up to 80 lines visible. Works in both the island and web dashboard.
Unique Crab Names
Each session is deterministically assigned a charming crab name like Pinchy, Clawdia, or Captain Claw.
Stale Session Cleanup
Automatically detects and removes dead sessions when a Claude process crashes without firing a session end event.
Zero Config
One command installs everything: compiles the Swift app, copies hooks, and configures Claude Code settings.
Meet the moods
Each crab visually reflects what its Claude session is doing right now.
Working
Wiggling legs and sparkles. Claude is processing.
Needs Input
Bouncing with "!" badge. Needs your attention.
Permission
Wants tool approval. Allow or deny inline.
Idle
Closed eyes and "zzz". Waiting for a prompt.
Error
Pink crab with alert. An API error occurred.
Click any session, focus any terminal
Click a session in the island to instantly jump to its terminal. Detects your terminal app automatically by walking the process tree.
How Claude Observer works
Claude Observer uses Claude Code's hook system to track session lifecycle events in real time via lightweight JSON files.
Hook Events Fire
Claude Code triggers hooks on lifecycle events: session start/end, prompt submit, tool use, notifications, permission requests, and subagent activity.
Python Hook Writes State
The observer hook script receives event data via stdin and atomically writes a JSON file per session to ~/.claude-observer/sessions/.
Dynamic Island Polls
The floating panel polls the sessions directory every 2 seconds, reads JSON files, and updates the island with animated crabs and glow effects.
Interact & Navigate
Respond to permission requests inline, hear sound alerts, click sessions to jump to their terminal, or approve from your phone via the web dashboard. Dead sessions are auto-cleaned.
SessionStart Stop Notification ...~/.claude-observer/sessions/{id}.jsonNSPanel + animated crabs + glowSessionStartCreates session file
UserPromptSubmitMarks as "working"
PreToolUseMarks as "working"
PostToolUseMarks as "working"
StopMarks as "idle"
StopFailureMarks as "error"
NotificationMarks as "needs input"
PermissionRequestShows inline prompt
SubagentStartMarks as "working"
SubagentStopUpdates activity
SessionEndRemoves session file
Install Claude Observer in seconds
Requires macOS 12+, Xcode Command Line Tools, and Python 3. One command does everything.
Clone the repository
git clone https://github.com/svenliebig/claude-observer.git cd claude-observer
Install
Compiles the Swift app, installs the hook script, and configures Claude Code hooks.
make install
Run
make run # or directly: ~/.claude-observer/bin/claude-observer &
Meet the crew
Each repository gets a persistent crab name stored across sessions. The same project always gets the same crab.