Skip to Content
FeaturesDashboard TUI

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 --dashboard

The 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:

CardPrimaryDetailsSparkline
TOKENSTotal tokensInput ↑ / Output ↓ breakdownDaily token usage
COSTTotal USD spentAverage cost per taskDaily cost trend
QUEUECurrent queue depthSucceeded ✓ / Failed ✗ countsDaily 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:

StateIconProgress BarMeta
DoneFull green barPR number
RunningAnimated fillPercentage
QueuedShimmer animationQueue position
Pending·Empty bar
FailedRed frozen barError 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 [████░░░░░░░░░░] test

Tasks 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

IconStageDescription
+PR CreatedPR just opened
~Waiting CICI checks running
*CI PassedReady to merge
xCI FailedNeeds fix
?Awaiting ApprovalManual review required
>MergingMerge in progress
^ReleasingCreating release tag
!FailedError 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)
  • x Failed (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:

SizeContentWhen
SmallGraph + commit messageNarrow terminals
MediumGraph + branch refs + messageMid-width terminals
FullGraph + refs + message + SHA + authorWide 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

KeyAction
q / Ctrl+CQuit dashboard
gToggle git graph panel
lToggle logs panel
j / Select next task
k / Select previous task
EnterOpen selected task’s issue URL
uTrigger 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: upgrade

Press 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: true

Persistence

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/dashboard

REST API Endpoints

The following REST endpoints are available under /api/v1/:

MethodEndpointDescriptionSince
GET/api/v1/tasksList all tasks (running, queued, completed)v1.55.0
GET/api/v1/tasks/:idGet single task detailsv1.55.0
GET/api/v1/autopilotAutopilot state and active PRsv1.55.0
GET/api/v1/historyExecution history with metricsv1.55.0
GET/api/v1/metricsToken usage, cost, queue statsv1.55.0
GET/healthHealth 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:

ElementColorHex
Titles/RunningSteel blue#7eb8da
Success/DoneSage green#7ec699
FailedDusty rose#d48a8a
WarningsAmber#d4a054
BordersSlate#3d4450
Dim textMid gray#8b949e