Real-time Kanban dashboard for monitoring Claude Code agent tasks, sessions, and subagents through a browser-based board.
- 📊 Real-time Kanban board — tasks flow through Pending → In Progress → Completed as Claude works
- 📈 Timeline view — horizontal bar chart showing task durations, colored by status, with hover tooltips
- 🔔 Desktop notifications — browser notifications + sound chime when tasks complete
- 📦 Auto-archive — stale sessions (>7 days, no active tasks) collapse into an "Archived" section
- 🤖 Agent team support — color-coded team members, owner filtering, member badges
- 🧩 Subagent visibility — see active subagents spawned via the Task tool, parsed from JSONL transcripts
- 🔗 Task dependencies — visual blockedBy/blocks relationships with smart badge clearing
- 📡 Server-Sent Events — instant updates via file watching, no polling
- ⌨️ Keyboard navigation — vim-style (hjkl) + arrow keys, sidebar/board focus toggling
- 🌙 Dark/light themes — system preference detection
- 🔍 Fuzzy search — across sessions, tasks, descriptions, and project paths
- 📝 Plan viewer — view and open Claude Code plans directly from the dashboard
- 🔌 Auto-port discovery — automatically finds an available port when the default is taken
- .NET 10 SDK (or later, via RollForward)
dotnet tool install -g atc-claude-kanban# Start the dashboard (default: http://localhost:3456)
atc-claude-kanban
# Start and open browser automatically
atc-claude-kanban --open
# Custom port (fails fast if port is unavailable)
atc-claude-kanban --port 8080
# Custom Claude directory
atc-claude-kanban --dir ~/.claude-workThen open your browser to http://localhost:3456 and watch your Claude Code tasks in real time.
Auto-port: When using the default port and it's already in use, the tool automatically tries up to 10 consecutive ports (3456, 3457, ...). When
--portis specified explicitly, the tool fails fast.
Three-column board showing task status with live updates:
| Column | Description |
|---|---|
| Pending | Tasks waiting to start |
| In Progress | Tasks Claude is actively working on (pulsing indicator) |
| Completed | Finished tasks |
Toggle between Kanban and Timeline views using the view toggle buttons in the header:
- Horizontal bars show each task's duration from creation to last update
- Color-coded by status: gray (pending), orange with glow (in-progress), green (completed)
- Hover tooltips show task name, status, duration, and start time
- Click any bar to open the task detail panel
- Time axis adapts to data range (seconds/minutes/hours/days)
- View preference persists across page reloads
Click the bell icon in the header to enable browser notifications:
- Fires when a task transitions from in_progress to completed
- Includes a two-tone audio chime (synthesized via Web Audio API — no audio files)
- Click the notification to focus the window and open the completed task
- Preference saved in localStorage
Sessions older than 7 days with no in-progress tasks are automatically archived:
- Archived sessions appear in a collapsible "Archived (N)" section at the bottom of the sidebar
- Dimmed to 50% opacity for visual distinction
- Expand/collapse state persists across page reloads
- Hidden during search or when filtering to active sessions
When Claude Code spawns agent teams, the dashboard shows:
- Color-coded owner badges per team member
- Owner filtering dropdown
- Team info modal with member details
- Task counts per agent
When Claude Code spawns subagents via the Task tool, the dashboard shows:
- Active subagent count badge in the sidebar (only when subagents are running)
- Collapsible subagent panel below Kanban columns with status dots, model info, and descriptions
- "Show all" toggle to view historical subagents (default: active only)
- Parsed from JSONL transcript files at
~/.claude/projects/{hash}/{sessionId}/subagents/
| Key | Action |
|---|---|
? |
Show help |
j/k |
Navigate up/down |
h/l |
Navigate columns |
Enter |
Toggle task detail |
Tab |
Switch sidebar/board focus |
[ |
Toggle sidebar |
I |
Session info |
P |
Open session plan |
C |
Copy project path |
F |
Open project folder |
D |
Delete task |
Claude Code writes task JSON files
↓
FileSystemWatcher detects changes
↓
Debounce + parse + cache (IMemoryCache)
↓
Broadcast via Server-Sent Events
↓
Browser updates Kanban board in real-time
The tool watches these paths under ~/.claude/:
| Path | Content |
|---|---|
tasks/{sessionId}/*.json |
Individual task files |
teams/{teamName}/config.json |
Team configurations |
projects/{hash}/sessions-index.json |
Session metadata |
projects/{hash}/{sessionId}/subagents/agent-*.jsonl |
Subagent transcripts |
plans/{slug}.md |
Plan markdown files |
The dashboard reads from ~/.claude/, where Claude Code stores all session data:
~/.claude/
├── tasks/ ← PRIMARY: task files (what the Kanban reads)
│ ├── {sessionId}/*.json ← Session-scoped tasks (UUID)
│ └── {teamName}/*.json ← Team-scoped tasks (named)
│
├── teams/ ← Team configurations (agent swarms)
│ └── {teamName}/config.json ← Members, roles, lead agent
│
├── projects/ ← Session metadata (enrichment)
│ └── {path-hash}/
│ ├── sessions-index.json ← Session list with project path, git branch
│ ├── {sessionId}.jsonl ← Session transcript (one JSON object per line)
│ └── {sessionId}/subagents/ ← Subagent transcripts
│
└── plans/ ← Plan markdown files
└── {slug}.md
JSON vs JSONL: Task files, team configs, and session indexes are standard .json (single object). Session transcripts are .jsonl (JSON Lines — one JSON object per line, append-only). The dashboard only reads .json files; .jsonl transcripts are used for metadata discovery (project path, git branch).
Session discovery: Sessions appear on the board if they have task .json files under tasks/, or if they have active subagents under projects/. The projects/ and teams/ directories enrich sessions with metadata (project name, git branch, team members).
- ASP.NET Core Minimal APIs with
Atc.Rest.MinimalApiendpoint definitions - FileSystemWatcher +
System.Threading.Channelsfor event-driven file monitoring - Server-Sent Events via
Results.Streamwith raw UTF-8 byte writes andTask.Delayheartbeats - Async service layer — all file I/O uses
ReadAllTextAsync/WriteAllTextAsync - IMemoryCache with TTL expiration (10s sessions, 5s teams)
- Embedded static files — single HTML dashboard served via
ManifestEmbeddedFileProvider