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 --gatewayOpen 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:
| Column | Description |
|---|---|
| ID | Session UUID (click to inspect) |
| Title | Auto-generated from first message |
| Channel | Where the session originated (CLI, Telegram, Web UI, etc.) |
| Messages | Total message count |
| Cost | Total token cost |
| Last Activity | Timestamp of last interaction |
| Status | Active / 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:
| Role | Dashboard | Chat | Settings |
|---|---|---|---|
viewer | View metrics and sessions | Read-only | View (redacted) |
operator | Full view | Send messages | View |
admin | Full view | Send messages | Edit |
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:
- Use API key authentication
- Consider a reverse proxy (nginx/caddy) with TLS
- Restrict access with a firewall if on a public network :::
Next Steps
- Advanced Features — Viking browser, audit viewer, command palette
- Webhooks & Gateway — The REST API behind the Web UI
- Configuration — Gateway config options