Dashboard TUI
Real-time terminal interface for monitoring Pilot operations.
Looking for a graphical interface? The Desktop App provides the same panels in a native macOS window built with Wails.
Launching
# Start with dashboard enabled
pilot start --dashboard
# Combined with other modes
pilot start --github --autopilot=dev --dashboard
pilot start --telegram --dashboardThe dashboard uses an alternate screen buffer and restores your terminal on exit.
Layout
The dashboard displays six panels arranged vertically:
╭─ PILOT ─────────────────────────────────────────────────────────╮
│ Logo + version │
╰─────────────────────────────────────────────────────────────────╯
╭─ TOKENS ─────╮╭─ COST ───────╮╭─ QUEUE ──────╮
│ 57.3K ││ $1.42 ││ 3 │
│ ↑ 28.1K in ││ ~$0.47/task ││ ✓ 12 ok │
│ ↓ 29.2K out ││ ││ ✗ 1 failed │
│ ▂▃▅▆▇▅▃▂▁• ││ ▁▂▄▆█▇▅▃▂• ││ ▃▂▁▃▅▆▄▂▁• │
╰──────────────╯╰──────────────╯╰──────────────╯
╭─ QUEUE ─────────────────────────────────────────────────────────╮
│ ✓ done GH-145 Add user validation [██████████████] #142 │
│ ● running GH-152 Implement caching [████████░░░░░░] 67% │
│ ◌ queued GH-158 Update dependencies [░▒▓▒░░░░░░░░░░] #1 │
╰─────────────────────────────────────────────────────────────────╯
╭─ AUTOPILOT ─────────────────────────────────────────────────────╮
│ Mode ................................. dev │
│ Auto-release ......................... enabled │
│ Active PRs ........................... 2 │
│ ~ #142: Waiting CI (3m) │
│ * #145: CI Passed (1m) │
╰─────────────────────────────────────────────────────────────────╯
╭─ HISTORY ───────────────────────────────────────────────────────╮
│ + GH-140 Fix login redirect 5m ago │
│ + GH-138 Add rate limiting 12m ago │
│ x GH-135 Broken migration 25m ago │
╰─────────────────────────────────────────────────────────────────╯Metrics Cards
Three side-by-side cards show lifetime aggregates with 7-day sparkline trends:
| Card | Primary | Details | Sparkline |
|---|---|---|---|
| TOKENS | Total tokens | Input ↑ / Output ↓ breakdown | Daily token usage |
| COST | Total USD spent | Average cost per task | Daily cost trend |
| QUEUE | Current queue depth | Succeeded ✓ / Failed ✗ counts | Daily task volume |
Metrics persist across restarts via SQLite. The sparkline pulses (•) to indicate live updates.
Queue Panel
Shows active and pending tasks with five visual states:
| State | Icon | Progress Bar | Meta |
|---|---|---|---|
| Done | ✓ | Full green bar | PR number |
| Running | ● | Animated fill | Percentage |
| Queued | ◌ | Shimmer animation | Queue position |
| Pending | · | Empty bar | — |
| Failed | ✗ | Red frozen bar | Error phase |
✓ done GH-145 Add validation [██████████████] #142
● running GH-152 Implement cache [████████░░░░░░] 67%
◌ queued GH-158 Update deps [░▒▓▒░░░░░░░░░░] #1
· pending GH-161 New feature [ ]
✗ failed GH-149 Broken test [████░░░░░░░░░░] testTasks are sorted by state priority: done → running → queued → pending → failed.
Autopilot Panel
Displays autopilot configuration and PR tracking:
Mode ................................. dev
Auto-release ......................... enabled
Active PRs ........................... 2
~ #142: Waiting CI (3m)
CI: running
* #145: CI Passed (1m)PR Stage Icons
| Icon | Stage | Description |
|---|---|---|
+ | PR Created | PR just opened |
~ | Waiting CI | CI checks running |
* | CI Passed | Ready to merge |
x | CI Failed | Needs fix |
? | Awaiting Approval | Manual review required |
> | Merging | Merge in progress |
^ | Releasing | Creating release tag |
! | Failed | Error state |
History Panel
Shows recent completed tasks with epic-aware grouping:
+ GH-140 Fix login redirect 5m ago
* GH-385 Epic: API overhaul [##--] 2/4 3m
+ GH-386 Add endpoints 2m ago
+ GH-387 Add validation 1m ago
· GH-388 Add tests --
· GH-389 Update docs --
x GH-135 Broken migration 25m ago+Success (green)xFailed (red)*Active epic with progress bar- Sub-issues indented under parent epic
Git Graph
Press g to toggle the git graph panel. When visible, it shows branch topology with colored tracks and merge points using standard git graph notation.
╭─ GIT GRAPH ───────────────────────────────────────────────────╮
│ * 3a1f2c8 (HEAD -> main) fix: login redirect alice │
│ * b7e4d01 Merge PR #142 bot │
│ |\ │
│ | * c9f3a22 feat: add caching bob │
│ | * 1d8e5f3 test: cache unit tests bob │
│ |/ │
│ * a4c7b90 chore: update deps alice │
╰───────────────────────────────────────────────────────────────╯Auto-sizing
The git graph automatically adjusts its detail level based on terminal width:
| Size | Content | When |
|---|---|---|
| Small | Graph + commit message | Narrow terminals |
| Medium | Graph + branch refs + message | Mid-width terminals |
| Full | Graph + refs + message + SHA + author | Wide terminals |
The graph auto-refreshes when branches change during execution.
Responsive Layout
When the terminal is narrow (less than ~90 columns) and the git graph is visible, the dashboard switches to stacked mode:
- Dashboard panels (QUEUE, AUTOPILOT, HISTORY, LOGS) stretch to full terminal width
- Git graph renders below the main panels at full width
- When the terminal is wide enough, git graph renders side-by-side with the dashboard
┌─────────── Wide terminal ────────────┐ ┌── Narrow terminal ──┐
│ ╭ QUEUE ──╮ ╭ GIT GRAPH ──╮ │ │ ╭ QUEUE ──────────╮ │
│ │ ... │ │ * abc ... │ │ │ │ ... │ │
│ ╰─────────╯ │ * def ... │ │ │ ╰────────────────╯ │
│ ╭ HISTORY ╮ │ * ghi ... │ │ │ ╭ HISTORY ────────╮ │
│ │ ... │ ╰──────────────╯ │ │ │ ... │ │
│ ╰─────────╯ │ │ ╰────────────────╯ │
│ │ │ ╭ GIT GRAPH ──────╮ │
│ │ │ │ * abc ... │ │
│ │ │ ╰────────────────╯ │
└──────────────────────────────────────┘ └─────────────────────┘Keyboard Shortcuts
| Key | Action |
|---|---|
q / Ctrl+C | Quit dashboard |
g | Toggle git graph panel |
l | Toggle logs panel |
j / ↓ | Select next task |
k / ↑ | Select previous task |
Enter | Open selected task’s issue URL |
u | Trigger hot upgrade (when available) |
Hot Upgrade
When a new Pilot version is detected, an orange notification appears:
╭─ ^ UPDATE ──────────────────────────────────────────────────────╮
│ v2.55.0 -> v2.56.0 available │
╰─────────────────────────────────────────────────────────────────╯
u: upgradePress u to upgrade in-place. Progress is shown during download:
╭─ * UPGRADING ───────────────────────────────────────────────────╮
│ Installing v2.56.0... [████████████░░░░░░] 65% │
╰─────────────────────────────────────────────────────────────────╯See Hot Upgrade for details.
Configuration
Dashboard settings in ~/.pilot/config.yaml:
dashboard:
# Cost estimation model (affects $/task calculation)
model: claude-opus-4-6
# Show logs panel by default
show_logs: truePersistence
Dashboard state persists to SQLite (~/.pilot/pilot.db):
- Session tokens: Input/output counts per day
- Execution history: Task results, durations, costs
- Metrics aggregates: Lifetime totals for cards
Data survives restarts and is used to populate sparklines on launch.
Web Dashboard & REST API
Starting in v1.53.0, Pilot includes an embedded web dashboard alongside the terminal TUI. The HTTP gateway serves a React frontend and a REST API for programmatic access to task data.
The web dashboard runs as a background HTTP server in polling mode (v1.62.0+). It is always available when Pilot is running, even without --dashboard.
Launching
The web dashboard is served at http://localhost:PORT/dashboard where PORT is your configured gateway port (default: 8090):
# Start Pilot — web dashboard available automatically
pilot start --github
# Open in browser
open http://localhost:8090/dashboardREST API Endpoints
The following REST endpoints are available under /api/v1/:
| Method | Endpoint | Description | Since |
|---|---|---|---|
GET | /api/v1/tasks | List all tasks (running, queued, completed) | v1.55.0 |
GET | /api/v1/tasks/:id | Get single task details | v1.55.0 |
GET | /api/v1/autopilot | Autopilot state and active PRs | v1.55.0 |
GET | /api/v1/history | Execution history with metrics | v1.55.0 |
GET | /api/v1/metrics | Token usage, cost, queue stats | v1.55.0 |
GET | /health | Health check (used by desktop app) | v1.53.0 |
Example — list tasks:
curl http://localhost:8090/api/v1/tasks | jq{
"tasks": [
{
"id": "GH-152",
"title": "Implement caching",
"state": "running",
"progress": 67,
"started_at": "2026-03-04T10:15:00Z"
},
{
"id": "GH-158",
"title": "Update dependencies",
"state": "queued",
"position": 1
}
]
}WebSocket Log Streaming
Connect to /ws/logs for real-time execution log streaming (v1.56.0):
const ws = new WebSocket('ws://localhost:8090/ws/logs');
ws.onmessage = (event) => {
const entry = JSON.parse(event.data);
console.log(`[${entry.task_id}] ${entry.level}: ${entry.message}`);
};Log entries include the task ID, log level, timestamp, and message. The WebSocket connection automatically receives logs from all running executions.
Desktop App Connection
The Desktop App connects to the same HTTP gateway via the /health endpoint for service discovery. When Pilot is running locally, the desktop app auto-detects it and displays the same panels as the web dashboard in a native macOS window.
Configuration
# ~/.pilot/config.yaml
gateway:
port: 8090 # HTTP server port (default: 8090)
host: "127.0.0.1" # Bind address (default: localhost only)
cors_origins: # Allowed CORS origins for web dashboard
- "http://localhost:3000"The gateway binds to 127.0.0.1 by default. To expose it on a network, set host: "0.0.0.0" — but ensure proper authentication is in place.
Color Palette
The dashboard uses a muted terminal aesthetic:
| Element | Color | Hex |
|---|---|---|
| Titles/Running | Steel blue | #7eb8da |
| Success/Done | Sage green | #7ec699 |
| Failed | Dusty rose | #d48a8a |
| Warnings | Amber | #d4a054 |
| Borders | Slate | #3d4450 |
| Dim text | Mid gray | #8b949e |