Dashboard & Desktop
InitRunner ships with a web dashboard for browser-based management and a native desktop app that wraps the same UI in a standalone window. Both provide real-time visibility into agents, flow pipelines, teams, audit logs, and ingestion.
Web Dashboard
The dashboard is a SvelteKit frontend backed by FastAPI API routers. It uses the "Electric Charcoal" design system, a dark-only theme with OKLCH colors, Space Grotesk and IBM Plex Mono typography, and a lime accent.
Installation
pip install initrunner[dashboard]Requires fastapi and uvicorn.
Launch
initrunner dashboard
initrunner dashboard --expose --port 9000| Flag | Default | Description |
|---|---|---|
--port | 8100 | Port to listen on |
--expose | off | Bind to 0.0.0.0 instead of localhost. Since v2026.6.1, exposing without an --api-key generates and prints a one-time key rather than serving open (see Security & exposure) |
--no-open | off | Don't auto-open the browser |
--roles-dir | none | Extra directory to scan for roles (repeatable) |
--api-key | none | API key for login authentication. Enables a login page with cookie-based sessions |
Security & exposure
Since v2026.6.1, the dashboard fails closed when bound off-host. Binding to a non-loopback host (--expose) without an --api-key no longer serves unauthenticated; a one-time key is generated and printed to the console at startup, and that key is the only way in. Loopback binds (the default) may still run keyless for local dev. The same fail-closed posture covers the MCP gateway and A2A server. To require a key on the API server, pass --api-key. See Security for the full authentication model.
Also since v2026.6.1, the localhost dashboard rejects any request whose Host header is not localhost or 127.0.0.1 (Starlette TrustedHostMiddleware), so a malicious page cannot drive the local dashboard through a DNS-rebinding hostname. The session cookie's Secure flag is derived from the connection scheme rather than a client-spoofable header, so it is set only over HTTPS.
Telemetry
Since v2026.6.2 the dashboard can report anonymous usage via posthog-js, and since v2026.6.3 it is opt-in. On first load the dashboard shows a one-time consent banner with Enable and No thanks; posthog-js is deferred until you accept, and nothing is sent before then. When enabled it runs with no autocapture and no session recording, and it stays inert when the browser sets Do Not Track. See Telemetry.
Pages
| Page | Description |
|---|---|
| Launchpad | Overview with total runs, success rate, token usage, average duration. Top agents by runs, recent activity, flows, and teams at a glance. On fresh installs, shows a zero-state view with a provider status banner, starter template cards (helpdesk, librarian, memory, telegram, discord, mail), capability chips, and quickstart links |
| Agents | SvelteFlow canvas view with draggable node graph. Auto-categorization (Reactive, Intelligence, Connected, Skilled, Cognitive, Equipped), auto-layout, minimap, search with / shortcut, and capability filters (tools, triggers, ingest, memory, sinks, skills, reasoning, autonomy). Agents without a pinned model show an auto pill badge. Auto-switches to list view on mobile |
| Flow | Visual editor with SvelteFlow graph for flow pipelines. Agent nodes, visual connections, and pattern templates (pipeline, fan-out, route). Tabbed detail view with YAML editor, events stream, and config panel |
| Teams | Team builder with structured persona configuration (sequential, parallel, debate), SvelteFlow pipeline visualization with debate round nodes and synthesis step, run panel with streaming output, memory and ingest tabs for managing team-level memory and shared documents |
| MCP Hub | Four-tab management center for MCP servers: Servers (aggregated health and tool introspection), Discover (curated registry with one-click install), Playground (execute tools without an LLM), Canvas (@xyflow/svelte topology visualization). Sidebar badge shows red dot when any server is unhealthy |
| Cost | Per-agent, per-model, and per-day cost breakdowns with summary strip, spend chart, and period selector. The per-agent and per-model tables also show thinking and reasoning token totals. See Cost Tracking |
| Audit | Searchable, paginated audit log with export to CSV/JSON. Includes a per-run cost column and thinking and reasoning token counts. Click a row to open the run detail drawer |
| Approvals | Queue of paused runs awaiting a human decision. Keyboard navigation, bulk approve/deny, multi-call drawer. Sidebar badge surfaces the pending count. Since v2026.4.17 (see Approvals queue below). |
| System | System health, doctor checks, provider status with inline API key configuration, default model configuration (provider/model picker, saves to run.yaml, shows provenance), and embedding provider health |
Key Features
| Feature | Description |
|---|---|
| Agent builder | Multi-turn LLM-powered wizard for drafting and refining agent roles |
| Flow visual editor | SvelteFlow graph for flow pipelines with agent nodes and pattern templates |
| Team builder | Persona configuration with pipeline visualization, streaming output, and debate strategy support (configurable rounds and synthesis) |
| Ingestion management | Upload files, add URLs, re-ingest with SSE progress streaming, per-document delete. Summary cards showing document count, chunk count, last ingested timestamp |
| ModelCombobox | Enhanced model selector with search filtering, keyboard navigation, custom model entry, and provider-specific presets |
| Confirm delete | Type-to-confirm deletion for agents, teams, and flow pipelines |
| Starter examples | 10 curated examples (helpdesk, mail, librarian, memory, telegram, discord, reviewer team, debate team, triage flow, pipeline flow) shown as interactive cards on the launchpad zero-state with capability chips and quickstart links. Starter packs work across agent, team, and flow builders. Link directly to a starter with ?starter={slug} on the creation page |
| Provider setup | Configure API keys for standard providers and OpenRouter directly from the dashboard, available on the launchpad zero-state, agent creation page, and System page. Supports optional key validation for OpenAI and Anthropic |
| Team ingest/memory tabs | Manage team-level memory configuration and shared documents: upload files, add URLs, re-ingest with SSE progress streaming, per-document deletion, and ingestion summary with document/chunk counts |
| Embedding warning banner | Agent builder warns when generated YAML needs embeddings but the effective provider is unusable, with selectable provider chips (openai/google/ollama) and inline key configuration |
| Clustered avatars | Debate rounds show clustered spinning avatar spheres for all concurrent personas. Flow runs show a pipeline stepper with spinning agent avatars |
| MCP Hub | Aggregated MCP server health monitoring, curated server discovery with copy-to-clipboard YAML snippets, single-tool playground with auto-generated forms, and @xyflow/svelte topology canvas showing server-to-agent relationships |
| Live tool activity | Real-time tool call events streamed via SSE in agent, flow, and team run views. Each tool call shows start/complete lifecycle with status dots, tool names, durations, and error summaries |
| Token/cost meter | Horizontal bar below tool activity showing budget frame before streaming, exact token counts and USD cost estimate (via genai-prices) on completion. Progress bar when guardrails set a token limit |
| Timeline view | Gantt-style chart on a Timeline tab showing runs over the last 24 hours. Available on agents (with triggers), flows, and teams. Swim lanes with color-coded outcome bars, hover tooltips, stats strip with run count/success rate/total cost, auto-refreshes every 30s |
| Quick-run drawer | Play button on agent list rows and flow canvas nodes opens a slide-over drawer for running agents without leaving the page |
| Cost analytics | Dedicated /cost page with per-agent, per-model, and per-day sortable tables, summary strip, and daily spend chart. See Cost Tracking |
| Unified bottom panel | Agent, flow, and team run views share one bottom panel showing token counts, cost, and tool activity |
| Cognition panel | Visual editor for reasoning and autonomy. Configure patterns (react, todo_driven, plan_execute, reflexion), think/todo tools, tool search, and autonomy limits without editing YAML |
| Thinking effort selector | Builder control that sets native extended thinking on the model. Choices come from the builder options endpoint (minimal, low, medium, high, xhigh) plus an option to leave it unset. Applies only to reasoning-capable OpenAI models. See Thinking effort |
Approvals queue
Since v2026.4.17, the dashboard surfaces human-in-the-loop approvals in two places:
Inline in RunPanel. When a run kicked off from the agent detail page pauses, the approval_required SSE event slots an ApprovalCardGroup into the run panel in place of the "thinking" state. Each pending call renders with a 2px left state bar (muted = unset, lime = approved, red = denied), a tool-templated argument preview (e.g. rm -rf /tmp/cache instead of raw JSON), and an Approve/Deny pair with <kbd> chip hints. Submit fires only once every card has a decision; if the model re-pauses, the group updates in place.
Queue view (/approvals). Reviewers see every paused run across the daemon, API, and other sessions, grouped by run_id. Single-call runs have inline Approve/Deny; multi-call runs open a right-side ApprovalDrawer with the originating prompt and per-call controls. A sidebar badge under Operate shows the pending count in tabular-nums, polled every 20s and bumped immediately by SSE. A ? shortcut overlay documents the keyboard grammar:
| Keys | Action |
|---|---|
j / k | Navigate between pending cards |
A / D | Approve / deny the focused card |
⇧ A / ⇧ D | Bulk approve / deny everything visible |
↵ | Submit decisions |
Esc | Close drawer or overlay |
Absent-Kicker toasts. A session-local registry of run_ids you kicked off diffs against each poll; if a run you started shows up while you're on a different page, a toast links you back to /approvals/{run_id}. Runs other operators started get only the badge, so there is no noise for work you didn't trigger.
The queue is backed by a new /api/approvals/* router that calls services.execution.resume_run_sync in-process, so approvals always resume in the same daemon that hosts the paused run.
Run detail drawer
Since v2026.5.5, clicking a row in the audit table opens a per-run detail drawer backed by GET /api/audit/{run_id}. The drawer pulls one run apart into three panels.
Run record. The full record for the run, including the model, provider, prompt, output, per-run cost, and token counts. Token counts now include thinking and reasoning tokens alongside the input, output, and total counts.
Event timeline. A per-run timeline of the run's thinking deltas, tool calls, and tool results, in the order they happened. Live streaming runs record it from their stream events; other runs (the buffered path and non-streaming CLI runs) reconstruct the same entries from the final message history, so both produce a timeline whenever audit logging is on. Each entry is secret-scrubbed and free-text values are truncated. The timeline is best-effort: a run with no thinking, tool calls, or tool results (for example a plain text answer that used no tools) has nothing to show, and runs recorded before this column existed have no stored timeline. In either case the drawer omits the panel.
Judge verdicts. For runs that used the reflexion reasoning pattern with success criteria configured, the drawer lists each verification round with its overall pass or fail and the per-criterion results. Runs that did not run reflexion, or ran it without success criteria, have no verdicts and the panel is omitted.
Thinking effort
Since v2026.5.5, the agent builder exposes a thinking-effort selector that sets native extended thinking on the model. The choices come from the builder options endpoint, so they always match the valid config values: minimal, low, medium, high, and xhigh, plus an option to leave thinking unset and use the provider default.
Picking a level writes spec.model.thinking in the generated YAML:
spec:
model:
provider: openai
name: gpt-5
thinking: mediumThis setting applies only to reasoning-capable OpenAI models (the o-series and the gpt-5 family, except gpt-5-chat). Setting it on any other provider or model is rejected when the role is validated. It is distinct from the reasoning patterns configured in the Cognition panel, which control InitRunner's cross-turn reasoning (spec.reasoning) rather than the model's own thinking.
Desktop App
The desktop command launches the dashboard in a native window via pywebview. No browser required.
Installation
pip install initrunner[desktop]Adds pywebview on top of the dashboard dependencies.
Launch
initrunner desktop
initrunner desktop --port 8100 --roles-dir ./extra-roles/| Flag | Default | Description |
|---|---|---|
--port | 8100 | Port for the embedded FastAPI backend |
--roles-dir | none | Extra directory to scan for roles (repeatable) |
How It Works
- Starts an embedded FastAPI backend in a background thread
- Opens a native window (1280×800, minimum 900×600)
- Polls
/api/healthuntil the backend is ready (30-second timeout) - Uses GTK/WebKit on Linux, Cocoa on macOS, WebView2 on Windows
On Linux, if GTK or WebKit is missing, the command prints distro-specific install hints (Ubuntu, Fedora, Arch).
Choosing an Interface
| CLI | Web Dashboard | Desktop App | |
|---|---|---|---|
| Requires browser | No | Yes | No |
| Remote access | No | Yes (bind to 0.0.0.0) | No (local only) |
| Real-time streaming | Yes | Yes | Yes |
| Chat | Yes (REPL) | Yes | Yes |
| Visual editors | No | Yes (SvelteFlow) | Yes (SvelteFlow) |
| Multiple users | No | Yes | No |
| File attachments | --attach flag | Upload button / drag-and-drop | Upload button / drag-and-drop |
| Install size | None | Moderate (fastapi, uvicorn) | Moderate + pywebview |
Cloud Hosting
The web dashboard can be deployed to a cloud platform for always-on remote access. Each platform builds from the same Dockerfile and seeds example roles on first boot.
| Platform | Deploy method | Persistent storage | Notes |
|---|---|---|---|
| Railway | One-click button | Manual volume at /data | Builds from railway.json |
| Render | One-click button | 1 GB disk via Blueprint | Auto-provisioned by render.yaml |
| Fly.io | CLI (fly deploy) | Volume via fly volumes create | Uses deploy/fly.toml |
Tip: Set
INITRUNNER_DASHBOARD_API_KEYto password-protect the dashboard when exposing it on a public URL.
See Cloud Deploy for step-by-step instructions for each platform.