DocsWeb UIWeb UI Dashboard

Ryvos includes an embedded Web UI served directly from the binary. No separate frontend deployment needed — the Svelte app is compiled and embedded via rust-embed.

Accessing the Dashboard

Start the gateway:

ryvos serve
# or
ryvos daemon --gateway

Open your browser to:

http://localhost:18789

If you configured API key authentication, you will be prompted to log in.

Dashboard Pages

Home / Metrics

The home page displays key metrics at a glance:

  • Active Sessions — Currently running agent sessions
  • Total Messages — Messages processed today / this week / this month
  • Cost Summary — Token costs for the current period
  • Tool Usage — Most-used tools with success rates
  • Model Performance — Response times and error rates per provider

Activity Feed

A real-time stream of all system events, powered by the WebSocket connection:

14:32:07  [session: a1b2c3d4]  RunStarted — "Check disk usage"
14:32:08  [session: a1b2c3d4]  ToolStart — bash
14:32:08  [session: a1b2c3d4]  ToolEnd — bash (127ms, success)
14:32:09  [session: a1b2c3d4]  RunComplete — 2 turns, $0.008
14:35:00  [cron]               CronFired — hourly-health
14:35:12  [heartbeat]          HeartbeatOk — "All systems normal" (suppressed)

Events are color-coded by type:

  • Green: successful completions
  • Yellow: warnings (budget, guardian hints)
  • Red: errors and failures
  • Blue: informational (cron, heartbeat)

Sessions

Browse and inspect all sessions:

ColumnDescription
IDSession UUID (click to inspect)
TitleAuto-generated from first message
ChannelWhere the session originated (CLI, Telegram, Web UI, etc.)
MessagesTotal message count
CostTotal token cost
Last ActivityTimestamp of last interaction
StatusActive / Complete / Error

Click a session to see the full conversation history, tool calls, and events.

Chat

The chat interface provides a browser-based conversation with the agent:

  • Real-time streaming — Responses stream in word-by-word via WebSocket
  • Tool execution display — See tool calls as they happen with expandable input/output
  • Session management — Create new sessions or continue existing ones
  • Markdown rendering — Code blocks, tables, and formatting rendered properly
┌─────────────────────────────────────────────┐
│  Session: a1b2c3d4                    [New] │
├─────────────────────────────────────────────┤
│                                              │
│  You: Check the status of all services       │
│                                              │
│  Agent: I'll check each service...           │
│                                              │
│  ┌─ Tool: bash ────────────────────────────┐│
│  │ Input: systemctl list-units --state=... ││
│  │ Output: nginx.service    active running ││
│  │         postgres.service active running ││
│  └─────────────────────────────────────────┘│
│                                              │
│  All 3 services are running:                 │
│  • nginx — active (running)                  │
│  • postgres — active (running)               │
│  • redis — active (running)                  │
│                                              │
├─────────────────────────────────────────────┤
│  Type a message...                    [Send] │
└─────────────────────────────────────────────┘

Costs

Detailed cost tracking with breakdowns:

  • Daily chart — Cost per day over the last 30 days
  • By model — Which models cost the most
  • By channel — Cost per channel (CLI vs Telegram vs Slack, etc.)
  • By session — Most expensive sessions
  • Budget status — Progress toward monthly and per-run limits

Settings

View and manage the current configuration:

  • Provider status — Which LLM providers are configured and connected
  • Channel status — Which channels are active
  • MCP servers — Connected MCP servers and their tools
  • Cron jobs — Scheduled tasks with next fire times
  • Budget — Current spending vs limits

Authentication

The Web UI uses the same API key system as the REST API:

[[gateway.api_keys]]
key = "${RYVOS_ADMIN_KEY}"
role = "admin"
 
[[gateway.api_keys]]
key = "${RYVOS_VIEWER_KEY}"
role = "viewer"

On first visit, you will see a login page. Enter your API key. The role determines what you can do:

RoleDashboardChatSettings
viewerView metrics and sessionsRead-onlyView (redacted)
operatorFull viewSend messagesView
adminFull viewSend messagesEdit

Real-Time Updates

The Web UI maintains a WebSocket connection to the gateway. All events are pushed in real time — no polling. This means:

  • Chat responses stream instantly
  • The activity feed updates live
  • Metric counters update in real time
  • Session status changes appear immediately

Technology Stack

The Web UI is built with:

  • Svelte — Reactive UI framework (small bundle size)
  • Tailwind CSS — Utility-first styling with dark theme
  • rust-embed — Compiled into the Ryvos binary (no separate deployment)
  • Indigo accent — Dark mode with indigo color accents

The built Web UI assets are ~30 KB gzipped and served directly from the binary's memory.

Network Security

The gateway binds to 127.0.0.1 by default (localhost only). To access from other machines:

[gateway]
bind = "0.0.0.0:18789"             # Listen on all interfaces

:::caution When binding to 0.0.0.0, the Web UI is accessible from the network. Always:

  1. Use API key authentication
  2. Consider a reverse proxy (nginx/caddy) with TLS
  3. Restrict access with a firewall if on a public network :::

Next Steps