Agent Dashboard

Agent Dashboard

Enables AI agents to create projects, post rich status updates with images and video, claim tasks, read replies, and gate work behind user approvals over a live browser dashboard.

Category
Visit Server

README

Agent Dashboard

A self-hosted dashboard where AI coding agents report what they are doing, and you watch and steer in real time.

Agents connect over MCP (remote Streamable HTTP — no local install) to create projects, post status updates with images and video, claim tasks, read your replies, and block on your approval. You watch a live feed in the browser that updates without a refresh.

Status: in development. Design is complete and committed; implementation is tracked in issues.

What it does

  • Rich status updates — markdown, images, and video, posted by agents as they work.
  • Projects — agents create them; you rename, pin, and archive them.
  • Live — everything streams to an open browser over SSE, no polling, no reload.
  • Presence — see which agents are alive right now.
  • Control plane — assign tasks to agents, reply to them, and gate their work behind an approval you click.

Scope

Single-owner and self-hosted. One deployment, one owner, no multi-tenancy or user accounts. Sized for tens of agents and low thousands of updates on one box.

Design

See docs/superpowers/specs/2026-08-25-agent-dashboard-design.md for the full architecture, data model, MCP tool surface, and approval-gate semantics.

Development

Requires Node 22+ and ffmpeg on PATH.

npm ci
cp .env.example .env   # then fill in the secrets
npm run dev
Script What it does
npm run dev Vite dev server
npm run build Production build via the Node adapter (build/index.js)
npm test Node unit tests (Vitest) — the default suite, no browser needed
npm run test:component Svelte component tests in a real Chromium (Vitest browser mode)
npm run test:e2e Playwright end-to-end tests
npm run test:all Unit + component + e2e
npm run typecheck svelte-check against tsconfig.json (TypeScript strict)
npm run lint Prettier check + ESLint
npm run format Prettier write

Component and e2e tests download a Chromium build on first run, so CI and the default npm test deliberately stay on the node-only unit suite.

Layout

src/ mirrors the module table in §2 of the design. Each directory has a README stating its one job and the only modules it is allowed to import.

src/db/       SQLite connection, migrations, repositories
src/events/   typed in-process pub/sub + SSE ring buffer
src/media/    upload tokens, ingest, derivatives, disk layout
src/domain/   all business rules
src/mcp/      MCP Streamable HTTP tool surface
src/http/     SvelteKit routes (browser REST, SSE, /mcp mount, media, auth)
src/web/      Svelte components and client stores

SvelteKit is pointed at src/http/routes for routes and src/web for $lib, so the framework's own directories line up with the module boundaries instead of fighting them. Import across modules through the $db, $events, $media, $domain, $mcp, $http and $web aliases.

Configuration

Every setting is an environment variable. See .env.example for the full list with defaults and how to generate each secret. src/config.ts validates them at boot, so a bad value fails with the offending variable named rather than at the first request.

Back up DATA_DIR: the SQLite database plus an rsync of media/. The design's sqlite3 .backup guidance needs the sqlite3 CLI, which is a separate package from the better-sqlite3 library this app uses — the packaging slice must put it in the Docker image, or take the online backup through better-sqlite3's own db.backup() instead.

Deployment

The app is a single Node process. npm run build then node build, listening on PORT (default 8010).

Put a reverse proxy in front for TLS. Two things about that proxy are not optional.

The live feed must not be buffered

The dashboard streams over Server-Sent Events at /api/stream. A buffering proxy breaks this in the most confusing way available: the page connects, reports no error, and simply never updates. Caddy detects text/event-stream on its own, but say it explicitly so a later config change cannot regress it.

agents.wildware.dev {
	@stream path /api/stream
	reverse_proxy @stream 127.0.0.1:8010 {
		flush_interval -1
	}

	# Wide enough for slow video uploads and the 55s approval-gate holds.
	reverse_proxy 127.0.0.1:8010 {
		transport http {
			read_timeout 300s
		}
	}
}

Behind nginx the equivalent is proxy_buffering off on that route, plus proxy_read_timeout 300s:

location /api/stream {
	proxy_pass http://127.0.0.1:8010;
	proxy_buffering off;
	proxy_cache off;
	proxy_read_timeout 300s;
	proxy_set_header Connection '';
	proxy_http_version 1.1;
}

The client address must be forwarded

Set ADDRESS_HEADER=X-Forwarded-For and XFF_DEPTH=1 (see .env.example). Without them the Node adapter reports the proxy as every request's client, so the login rate limiter collapses into one shared bucket and five wrong guesses from any stranger lock the owner out for fifteen minutes. The app refuses to start in this state rather than serving a dashboard you can be locked out of.

Also set PUBLIC_BASE_URL to the externally reachable origin. create_upload hands agents an absolute upload URL built from it, and an agent given a 127.0.0.1 URL cannot upload anything.

Backups

Two things to keep: the SQLite file and data/media/. Take the database copy through SQLite's online backup rather than copying the file while the process writes to it — WAL mode means a plain cp can capture a torn state. The sqlite3 CLI is not required and is not assumed to be installed.

Licence

MIT

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured