Hermes WebUI Master Guide
The complete end-to-end reference for the browser-based interface to Hermes Agent. From first install to advanced orchestration.
What Is Hermes WebUI? #
Hermes WebUI is a lightweight, dark-themed web application that provides a browser-based interface to the Hermes Agent. It delivers full 1:1 parity with the CLI experience - everything you can do from a terminal, you can do from this UI. Built with Python and vanilla JavaScript, it requires no build step, no framework, and no bundler.
Three-Panel Layout
Left sidebar for sessions, center for chat, right for workspace file browsing. Modeled on the Claude-style interface.
Zero Extra Setup
Uses your existing Hermes Agent and configured models. No additional services needed.
Mobile-First
Responsive SPA designed for phone browsers. Hamburger nav, touch-friendly targets, full-height chat.
Docker Ready
Pre-built multi-arch images (amd64 + arm64) on GHCR. Single, two, or three-container setups.
Secure by Default
Optional password auth, signed HMAC cookies, SRI-pinned CDN resources, security headers.
Internationalized
8 locales: English, Chinese (Simplified and Traditional), Korean, Russian, Spanish, German, Portuguese.
~/.hermes directory, shares the same config, sessions, skills, and memory. Nothing is duplicated or proxied.Architecture #
Hermes WebUI is a single-process Python application that imports Hermes Agent modules directly - there is no HTTP communication between separate services.
Backend Structure
| File | Purpose | Lines |
|---|---|---|
api/routes.py | All GET + POST route handlers | ~1180 |
api/config.py | Discovery, globals, model detection, reloadable config | ~701 |
api/streaming.py | SSE engine, run_agent, cancel, HERMES_HOME save/restore | ~236 |
api/profiles.py | Profile state management, hermes_cli wrapper | ~246 |
api/models.py | Session model + CRUD, per-session profile tracking | ~137 |
api/auth.py | Optional password authentication, signed cookies | ~149 |
api/helpers.py | HTTP helpers, safe_resolve, security headers | ~71 |
api/workspace.py | File ops: list_dir, read_file_content, workspace helpers | ~77 |
api/upload.py | Multipart parser, file upload handler | ~78 |
api/onboarding.py | First-run onboarding, provider config writes | - |
Frontend Structure
| File | Purpose | Lines |
|---|---|---|
static/ui.js | DOM helpers, renderMd, tool cards, model dropdown, file tree | ~977 |
static/panels.js | Cron, skills, memory, workspace, profiles, todo, settings | ~974 |
static/sessions.js | Session CRUD, list rendering, search, SVG icons, dropdowns | ~533 |
static/messages.js | send(), SSE event handlers, approval, transcript | ~297 |
static/boot.js | Event wiring, mobile nav, voice input, boot IIFE | ~338 |
static/workspace.js | File preview, file ops, loadDir, clearPreview | ~185 |
static/commands.js | Slash command registry, parser, autocomplete | ~156 |
static/style.css | All CSS including mobile responsive | ~670 |
state.db, config.yaml, skills, memory files, and session data directly. This is why features like the CLI session bridge work.Quick Start #
Get Hermes WebUI running in under 2 minutes.
- Clone the repository
git clone https://github.com/nesquena/hermes-webui.git hermes-webui cd hermes-webui - Run the start script
./start.shInstalls dependencies, checks for Hermes Agent, starts server on
http://localhost:8787. - Open in browser
Navigate to
http://localhost:8787. The onboarding wizard guides you through provider setup on first run.
Installation Methods #
Local Installation via start.sh
git clone https://github.com/nesquena/hermes-webui.git hermes-webui
cd hermes-webui
./start.sh
The script will:
- Check for Python 3.10+ and install dependencies via
pip - Verify Hermes Agent is installed and accessible
- Create
~/.hermes/webui-mvpstate directory if needed - Start the server on
127.0.0.1:8787 - If running over SSH, print the SSH tunnel command automatically
~/.hermes/.env or ~/.hermes/config.yaml.Docker Installation (Recommended for VPS)
docker pull ghcr.io/nesquena/hermes-webui:latest
docker run -d \
-e WANTED_UID=$(id -u) -e WANTED_GID=$(id -g) \
-v ~/.hermes:/home/hermeswebui/.hermes \
-v ~/workspace:/workspace \
-p 127.0.0.1:8787:8787 \
ghcr.io/nesquena/hermes-webui:latest
See Docker Setup for full details.
Manual Setup
git clone https://github.com/nesquena/hermes-webui.git
cd hermes-webui
mkdir -p ~/.hermes/webui-mvp
pip install -r requirements.txt
export HERMES_WEBUI_HOST=0.0.0.0
export HERMES_WEBUI_PORT=8787
python -m uvicorn api.main:app --host 0.0.0.0 --port 8787
Docker Setup #
Docker is the recommended deployment method for VPS. Three compose configurations:
Single-Container
Recommended. WebUI runs agent in-process. Simplest setup. Uses docker-compose.yml
Two-Container
Agent and WebUI separate. Isolation between gateway and chat UI. Uses docker-compose.two-container.yml
Three-Container
Agent + Dashboard + WebUI. Full monitoring stack. Uses docker-compose.three-container.yml
Single-Container Setup
version: '3.8'
services:
hermes-webui:
image: ghcr.io/nesquena/hermes-webui:latest
container_name: hermes-webui
ports:
- "127.0.0.1:8787:8787"
volumes:
- hermes-home:/home/hermeswebui/.hermes
- ~/workspace:/workspace
environment:
- WANTED_UID=${UID:-1000}
- WANTED_GID=${GID:-1000}
- HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui-mvp
restart: unless-stopped
volumes:
hermes-home:
Quick start:
git clone https://github.com/nesquena/hermes-webui
cd hermes-webui
cp .env.docker.example .env
docker compose up -d
Two-Container Setup
Use when you run Hermes Agent separately (for Telegram/Discord/CLI) and want WebUI as an additional surface.
version: '3.8'
services:
hermes-agent:
image: nousresearch/hermes-agent:latest
container_name: hermes-agent
volumes:
- hermes-home:/root/.hermes
- hermes-agent-src:/opt/hermes
environment:
- HERMES_HOME=/root/.hermes
restart: unless-stopped
hermes-webui:
image: ghcr.io/nesquena/hermes-webui:latest
container_name: hermes-webui
depends_on:
- hermes-agent
ports:
- "127.0.0.1:8787:8787"
volumes:
- hermes-home:/home/hermeswebui/.hermes
- hermes-agent-src:/home/hermeswebui/.hermes/hermes-agent
- ~/workspace:/workspace
environment:
- HERMES_WEBUI_HOST=0.0.0.0
- HERMES_WEBUI_PORT=8787
- HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui-mvp
- WANTED_UID=${UID:-1000}
- WANTED_GID=${GID:-1000}
restart: unless-stopped
volumes:
hermes-home:
hermes-agent-src:
UID/GID Configuration
The container auto-detects your host user UID/GID. Set explicitly if needed:
id -u # e.g., 1000
id -g # e.g., 1000
# Set in .env: UID=1000, GID=1000
Bind-Mount Migration (Advanced)
volumes:
hermes-home:
driver: local
driver_opts:
type: none
o: bind
device: /home/youruser/.hermes
Requirements: Host directory must be readable by container UID. All containers sharing the volume must run as the SAME UID/GID. If host .env is mode 0640, set HERMES_SKIP_CHMOD=1.
Dependency Installation
At startup, the init script runs:
uv pip install /home/hermeswebui/.hermes/hermes-agent
This installs Hermes Agent and all dependencies into the WebUI Python environment on first boot. Takes 1-2 minutes.
Remote Access #
SSH Tunnel (Recommended)
Safest method. No ports exposed to the internet.
ssh -N -L 8787:127.0.0.1:8787 user@your-server.com
Then open http://localhost:8787. The start.sh script prints this command automatically when it detects SSH.
Tailscale / ZeroTier
- Install Tailscale on VPS
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up - Install Tailscale on local machine
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up - Access via Tailscale IP
http://<tailscale-ip>:8787
Direct Network Exposure
HERMES_WEBUI_PASSWORD. Without a password, anyone who can reach the port has full access to your agent.# In docker-compose.yml:
ports:
- "8787:8787"
environment:
- HERMES_WEBUI_PASSWORD=your-strong-password
Reverse Proxy (Caddy)
hermes-webui.yourdomain.com {
reverse_proxy localhost:8787
}
Caddy auto-provisions Let's Encrypt certificates.
Onboarding Behind Reverse Proxy
If behind nginx/Caddy/Traefik or SSH tunnel, the onboarding IP check may block you. Fixed in v0.50.22+. For older versions:
# Option 1: Set env var
HERMES_WEBUI_ONBOARDING_OPEN=1
# Option 2: Set password before first run
HERMES_WEBUI_PASSWORD=your-password
# Option 3: Upgrade to v0.50.22+
Chat and Streaming #
The chat interface is the core of Hermes WebUI. Every CLI workflow has a web equivalent.
Sending Messages
Type in the composer and press Enter. Messages are sent via SSE (Server-Sent Events) for real-time streaming.
Streaming Behavior
- rAF-throttled rendering: Token rendering throttled via
requestAnimationFrameto prevent UI jank - SSE auto-reconnect: If connection drops (common with SSH tunnels), stream automatically reconnects
- Send while streaming: Queue next message while agent responds - sent inline after current response
Model Selection
The composer footer includes a model picker showing all providers from your config.yaml:
- Multi-provider: OpenAI, Anthropic, Google, OpenRouter, xAI, GLM, DeepSeek, Mistral, MiniMax, Kimi, Nous Portal, custom OpenAI-compatible
- Dynamic discovery: Ollama, LM Studio, vLLM models discovered live via
/v1/models - Free-form OpenRouter: Type any model name with autocomplete
- Per-conversation: Each session can use a different model
- LM Studio first-class: Dedicated provider with live discovery even without env vars injected
Reasoning Display
- Claude thinking blocks: Rendered inline with expand/collapse
- o3 reasoning blocks: Distinct styling
- Reasoning effort selector: low/medium/high +
/reasoningcommand
Rich Content Rendering
- Markdown: Full CommonMark with GFM extensions
- Code blocks: Prism.js syntax highlighting (Python, JS, bash, JSON, SQL, etc.). Copy button with "Copied!" feedback
- Mermaid diagrams: Rendered inline from
```mermaidblocks - KaTeX math: Inline
$...$and block$$...$$rendering
Cancel and Retry
- Stop button: Cancel streaming at any time
- Retry: Delete last assistant message and resend with one click
Context Usage Indicator
Circular ring badge in composer footer shows input tokens, output tokens, estimated cost, and context fill percentage. Toggleable in Settings or via /usage.
File Attachments
- Drag-and-drop or click to attach
- Persist across page reloads
- Images displayed inline
Session Management #
Basic Operations
- Create: Click "+" in sidebar or use
/new - Rename: Double-click title (Escape cancels) or use
...dropdown - Delete: Use
...dropdown - Delete - Duplicate: Fork a session to create a new branch with same history
- LLM-generated titles: First message triggers automatic title generation
Organization
Tags
Add #tag to session titles for colored chips. Click chips to filter. Tags extracted automatically from title text.
Projects
Named folders with colors. Sessions assigned to projects via ... dropdown. Sidebar shows chip filter bar including "Unassigned" filter.
Date Grouping
Grouped by: Today, Yesterday, Last Week, Last Month, Earlier. Collapsible groups.
Pin and Archive
Star sessions to pin to top. Archive sessions to hide from main list; "Show N archived" toggle reveals them.
Search
- Title search: Filter by title in sidebar search box
- Content search: Full-text search across all session messages
Batch Operations
Multi-select sessions, then bulk delete, move to project, or archive.
Import/Export
- Export JSON: Full messages + metadata
- Import JSON: Restore sessions from export
- Download Markdown: Transcript for sharing or archiving
CLI Session Bridge
Unique to Hermes WebUI: CLI sessions from hermes-agent SQLite store appear in sidebar with gold "cli" badge. Click to import with full history, then reply normally.
Subagent Session Tree
Sessions with parent_session_id grouped under parent in sidebar with expand/collapse chevrons and child count badges. Collapse state persists in localStorage.
Per-Session Configuration
- Per-session profile: Different model profile per session
- Per-session toolset: Override tools via
/toolsets - Per-session model: Composer-scoped model picker
Session Navigation
Opt-in in Appearance settings:
- Jump buttons: Sticky "Start" pill (loads full history) and "End" pill
- Endless scroll: Auto-prefetches older transcript with 1.5x viewport prefetch
- Viewport preservation: Loading older history anchors at current viewport
Sessions persist across page reloads and SSH tunnel disconnections. Browser tab title reflects active session name.
Workspace and File Browser #
File Tree
- Directory tree: Expandable/collapsible folders
- Drag-resizable panel: Resize by dragging edge
- Git detection: Branch name in header, dirty file count badge
File Preview
- Text/Code: Syntax-highlighted (Prism.js) - Python, JS, bash, JSON, SQL
- Markdown: Rendered preview
- Images: Inline preview
- Binary files: Auto-detected from MIME type, downloadable
File Operations
- Create: New file or folder from toolbar
- Edit: Inline editing with unsaved-change guard
- Delete/Rename: Files and folders
- Download: Any file to local machine
Workspace Allowlist
Paths validated against workspaces.json. _resolve_workspace prevents directory traversal attacks.
Auto-Close
File preview auto-closes on directory navigation, with unsaved-edit guard.
Profiles and Models #
Profiles are named configurations bundling model selection, provider settings, and agent behavior.
Profile Management
- Create: Define named profiles with model/provider combinations
- Clone: Clone config from existing profile
- Edit/Delete: Modify or remove profiles
Provider Configuration
- Provider: OpenRouter, Anthropic, OpenAI, Google, or custom
- Custom endpoint: Base URL, API key, model name
- API key: Written into
config.yamlat creation
Seamless Switching
No server restart needed. WebUI tracks which profile each session uses. Each session records which profile was used.
Tools and Command Approval #
Tool Call Cards
- Tool name: Displayed prominently
- Arguments: Expandable section
- Result snippet: Preview of output
- Expand/collapse all: Toggle for multi-tool turns
Command Approval
When agent attempts dangerous shell commands, an approval card appears:
- Allow once: Single execution
- Allow for session: All similar commands this session
- Allow always: Permanently allow this pattern
- Deny: Block execution
Approval polling is SSE-pushed - card updates in real-time.
Hermes Detection
Hermes detects destructive commands (rm -rf, drop table, etc.) and requires approval. Default is fail-closed - if unsure, it stops.
Sandbox Backends
Six sandbox backends: Docker, SSH, Singularity, Modal, and more. Configured via config.yaml.
Slash Commands #
Type / in the composer for autocomplete picker.
| Command | Description |
|---|---|
/new | Create new session |
/compact | Compact conversation context |
/reasoning | Set reasoning effort (low/medium/high) |
/theme | Switch themes |
/usage | Toggle token/cost display |
/toolsets | Override tools for this session |
/insights [days] | Open Insights panel with time filter |
/goal | Track multi-turn goals with budget |
/profiles | Switch active model profile |
/models | Open model picker |
/settings | Open Hermes Control Center |
/help | Show available commands |
| Plugin commands | Execute via /api/commands/exec |
Skills and Memory #
Skills System
Hermes Agent has a self-improving skills system that auto-generates reusable skills from complex tasks. WebUI provides full CRUD:
- Browse: View all skills in Control Center
- Create/Edit/Delete: Full skill management
Skills stored as markdown in ~/.hermes/skills/, directly editable.
Memory System
Hermes retains context across sessions via:
- User profile: Persistent preferences and identity
- Agent notes: Manually written or auto-generated notes
- Self-improving skills: Skills that evolve from experience
Memory files stored in ~/.hermes/memory/ as editable markdown. WebUI provides memory write surface in Control Center.
Cron and Scheduled Jobs #
Self-hosted scheduling that fires while you are offline and delivers results to multiple platforms.
Creating Cron Jobs
- CRUD: Create, view, switch, edit, delete from Control Center
- Cron expressions: Standard cron syntax
- Delivery targets: Telegram, Discord, Slack, Signal, email, and more
How It Works
Cron jobs managed by Hermes Agent scheduler. Execution happens in the agent process. Jobs fire even when WebUI is closed, as long as agent is running.
Use Cases
- Daily data aggregation and report generation
- Weekly file organization and cleanup
- Scheduled reminders and notifications
- Periodic web scraping and data collection
MCP Integration #
Model Context Protocol allows Hermes Agent to use external tools and services.
MCP Server UI
- View MCP servers: See configured servers and status
- Configure: Add, edit, remove MCP server configurations
- Tool discovery: MCP tools appear alongside native Hermes tools
MCP server rewritten in v0.51.28 for better reliability, tool discovery, error handling, and connection management.
Subagents and Delegation #
Subagent Delegation Cards
- Distinct icon: Child agent tasks shown with unique icon
- Streaming display: Real-time progress of subagent execution
- Status tracking: See when subagents start, complete, or fail
Session Tree
Sessions spawned by subagents linked via parent_session_id:
- Expand/collapse chevrons: Show/hide child sessions
- Child count badges: See how many children a parent has
- localStorage persistence: Collapse state survives page reload
Insights and Analytics #
Usage analytics across all sessions.
Overview Cards
- Token total: Aggregate input + output tokens
- Cost total: Estimated spending
- Session count: Total conversations in period
- Active days: Days with activity
Model Usage Table
Breakdown by model: name, sessions, tokens, cost.
Top Tools
Ranked list with usage bars.
Activity Heatmap
- Day-of-week bars: Activity by Mon-Sun
- Top hours: When you are most active
Notable Sessions
Links to actual sessions - click to load in chat view.
Days Selector
Filter by 7 / 30 / 90 / All days.
Backend
GET /api/insights?days=30 instantiates InsightsEngine from agent/insights.py. Capped at 365 days. Guarded by sync_to_insights setting.
Rollback and Checkpoints #
Hermes Agent maintains workspace checkpoints via shadow git repos.
Checkpoint List
View all checkpoints in workspace detail panel with timestamp and description.
Diff Viewer
Modal diff viewer shows changes between current state and any checkpoint. Syntax-highlighted, side-by-side.
Restore
Restore with confirmation dialog. Reads shadow git repos directly.
API Endpoints
GET /api/rollback/list- List all checkpointsGET /api/rollback/diff- Get diff for a checkpointPOST /api/rollback/restore- Restore to a checkpoint
Voice Mode #
Turn-based voice interaction using browser Web Speech API.
- Activate: Click voice button in composer
- Speak: Browser captures audio via Web Speech API (STT)
- Send: Transcribed text sent as message
- Listen: Agent response read aloud via TTS
- Loop: Auto-resumes listening after response completes
Features
- Progressive enhancement: Hidden if Web Speech API unsupported
- Pulsing indicator: Visual feedback when listening
- TTS settings: Respects existing voice/rate/pitch config
- Error handling: Bail-out on
not-allowedandaudio-captureerrors with toast
Git Worktrees #
Create isolated git worktrees for sessions, enabling parallel development branches.
Creating Worktree Sessions
POST /api/session/new accepts worktree: true flag:
- Creates isolated worktree at
<repo>/.worktrees/<session>-XXXX - Persists
worktree_path,worktree_branch,worktree_root,worktree_commit - Worktree indicator shown in sidebar
Worktree Behavior
- Empty worktree sessions stay visible in sidebar
- Filter at
/worktrees/to see uncommitted edits - Default branch is master
Internationalization and Themes #
Supported Languages
Themes
9 built-in themes, switchable via Settings or /theme:
Security and Authentication #
Password Authentication
HERMES_WEBUI_PASSWORD=your-secret-password
Uses signed HMAC HTTP-only cookies. Cookie not accessible via JavaScript, preventing XSS session hijacking.
Rate Limiting
Login rate limiting persists across restarts. Failed attempts stored in STATE_DIR/.login_attempts with atomic writes and 0600 permissions. Buckets prune on load.
Security Headers
All responses include security headers. CDN resources SRI-pinned to prevent supply chain attacks.
API Redaction
API keys redacted by default. Self-hosted users can disable via Settings toggle. Lazy check at call-time, default ON for safety.
Workspace Allowlist
Paths validated against workspaces.json. Directory traversal prevented by _resolve_workspace.
Offline Recovery
When browser cannot reach Hermes, high-contrast offline banner appears. App probes /health automatically and refreshes on reconnection. Stream errors deferred while offline.
PWA Security
Service-worker shell assets use network-first strategy (with cache fallback). PWA install + offline launch preserved via install-time pre-caching.
PWA and Mobile #
Mobile Experience
Designed mobile-first:
- Hamburger sidebar: Collapsible navigation on small screens
- Touch-friendly targets: 44px minimum touch targets
- Full-height chat: Chat takes full viewport on phones
- Slide-overs: Panels slide over content on mobile
- Responsive breakpoints: Works at all screen sizes
Tailscale Access
Access via Tailscale for native app-like mobile experience. No port forwarding, no public exposure.
PWA Features
- Service worker: Network-first caching for shell assets
- Offline recovery: Banner + auto-reconnect
- Install prompt: Add to home screen on supported browsers
- Stream error deferral: Brief network drops do not surface terminal errors
Environment Variables #
| Variable | Description | Default |
|---|---|---|
HERMES_WEBUI_HOST | HTTP server bind address | 0.0.0.0 |
HERMES_WEBUI_PORT | HTTP server port | 8787 |
HERMES_WEBUI_PASSWORD | Password for auth | (unset - no auth) |
HERMES_WEBUI_STATE_DIR | WebUI state directory | ~/.hermes/webui-mvp |
HERMES_WEBUI_ONBOARDING_OPEN | Bypass onboarding IP check | 0 |
HERMES_WEBUI_TRUST_PROXY | Trust X-Forwarded-For | 0 |
HERMES_HOME | Hermes Agent home | ~/.hermes |
WANTED_UID | Container UID | Auto-detected |
WANTED_GID | Container GID | Auto-detected |
HERMES_SKIP_CHMOD | Skip chmod on startup | 0 |
HERMES_HOME_MODE | File permission mode | 0600 |
HERMES_ALLOW_ROOT_GATEWAY | Allow root gateway | 0 |
HERMES_DASHBOARD | Enable dashboard | (unset) |
HERMES_DASHBOARD_HOST | Dashboard bind | 0.0.0.0 |
HERMES_DASHBOARD_PORT | Dashboard port | 9119 |
API_SERVER_ENABLED | Enable OpenAI-compatible API | false |
API_SERVER_HOST | API server bind | 127.0.0.1 |
API_SERVER_KEY | API server key | (unset) |
API Reference #
Sessions
| Method | Endpoint | Description |
|---|---|---|
GET | /api/sessions | List all sessions |
POST | /api/session/new | Create session (accepts worktree: true) |
GET | /api/session/:id | Get session details |
PUT | /api/session/:id | Update session |
DELETE | /api/session/:id | Delete session |
Chat
| Method | Endpoint | Description |
|---|---|---|
POST | /api/chat | Send message (SSE streaming) |
POST | /api/chat/:id/cancel | Cancel streaming |
POST | /api/chat/:id/approve | Approve/deny command |
Workspace
| Method | Endpoint | Description |
|---|---|---|
GET | /api/workspace | List directory |
GET | /api/workspace/read | Read file content |
POST | /api/workspace/write | Write file |
POST | /api/workspace/upload | Upload file |
Other Endpoints
| Method | Endpoint | Description |
|---|---|---|
GET | /api/insights?days=30 | Usage analytics (max 365 days) |
GET | /api/rollback/list | List checkpoints |
GET | /api/rollback/diff | Get checkpoint diff |
POST | /api/rollback/restore | Restore checkpoint |
GET | /api/commands | List slash commands |
POST | /api/commands/exec | Execute slash command |
GET | /health | Health check |
Troubleshooting #
Onboarding blocked behind reverse proxy
Fix: Upgrade to v0.50.22+, or set HERMES_WEBUI_ONBOARDING_OPEN=1, or set HERMES_WEBUI_PASSWORD before first run.
Container permission issues
Fix: Set WANTED_UID and WANTED_GID to match host user. Use id -u and id -g.
Agent dependencies not installed
Fix: Check hermes-agent-src volume is mounted correctly. Check container logs for uv pip install output.
SSH tunnel connection drops
Fix: SSE auto-reconnect handles this. Add ServerAliveInterval 60 to SSH config if persistent.
Docker port binding - cannot access from other machines
Fix: Change port to "8787:8787" in docker-compose.yml and set HERMES_WEBUI_PASSWORD.
Two-container agent resolution
Fix: Use named volumes from docker-compose.two-container.yml. Do not replace with bind mounts.
Podman compatibility
Fix: Upgrade to Podman 4+, or use single-container setup, or use community image sunnysktsang/hermes-suite.
Workspace not in allowlist
Fix: Ensure workspace path is in workspaces.json.
Offline banner will not disappear
Fix: Check network connection and that Hermes server is running. Banner appears when navigator.onLine === false or /health probe fails.
Stream errors on page load
Fix: Normal if previous session was streaming when page closed. Click different session and back, or refresh.
Frequently Asked Questions #
General
Hermes WebUI is a lightweight, dark-themed web application providing a browser-based interface to Hermes Agent. Full 1:1 CLI parity. Built with Python and vanilla JS, no build step.
In single-container Docker mode, no - the WebUI installs agent dependencies at startup. In local install, yes - agent must be installed. WebUI imports agent modules in-process.
Yes, MIT License. Self-host on your own hardware.
WebUI is a full chat interface with CLI parity. Dashboard is a monitoring/status panel. They can run side-by-side (three-container setup).
Yes! They share the same ~/.hermes directory. CLI sessions appear with a gold 'cli' badge.
Deployment
Recommended: Docker + SSH tunnel.
On VPS: docker run with -p 127.0.0.1:8787:8787 and HERMES_WEBUI_PASSWORD.
Locally: ssh -N -L 8787:127.0.0.1:8787 user@vps
Then open http://localhost:8787
Yes, but MUST set HERMES_WEBUI_PASSWORD. Also recommended: reverse proxy with TLS (Caddy, nginx).
Yes. Pre-built Docker images for amd64 and arm64.
Docker: docker pull + docker compose down + docker compose up -d
Local: git pull + ./start.sh
Chat and Models
Any provider in config.yaml: OpenAI, Anthropic, Google, OpenRouter, xAI, GLM, DeepSeek, Mistral, MiniMax, Kimi, Nous Portal, custom OpenAI-compatible. Ollama, LM Studio, vLLM discovered live.
Yes. Composer footer has model picker. Each session can use a different model.
Configure provider in config.yaml with local endpoint URL. WebUI discovers models via /v1/models. LM Studio has first-class support.
Context ring shows fill percentage. Use /compact to compact context. Agent handles compaction automatically.
Yes. Next message is queued and sent inline after current response completes.
Sessions
In Hermes Agent state.db SQLite in ~/.hermes/. WebUI reads/writes same database as CLI.
Backup entire ~/.hermes/ directory. In Docker, backup named volume or bind mount.
Yes. Use ... dropdown to export as JSON or download as Markdown transcript.
Named folders with colors for organizing sessions. Assign via ... dropdown. Sidebar shows chip filter bar.
CLI sessions from agent SQLite appear in sidebar with gold 'cli' badge. Click to import with full history.
Workspace and Files
Mount as /workspace in Docker, or configure in config.yaml. Path must be in workspaces.json.
Yes. Create, edit, delete, rename with unsaved-change guard.
Yes. Branch name and dirty file count badge in workspace header.
Profiles and Skills
Named configurations bundling model, provider, and agent behavior. Create in Control Center, switch per session.
Reusable capabilities stored as markdown in ~/.hermes/skills/. WebUI provides full CRUD. Skills can be auto-generated by agent.
Yes. Stored as editable markdown in ~/.hermes/memory/. WebUI has memory write surface. Also editable on disk.
Cron and Scheduling
Yes. Managed by Hermes Agent scheduler. Jobs fire as long as agent is running.
Delivered to configured targets: Telegram, Discord, Slack, Signal, email, etc.
Security
All data stored locally in ~/.hermes/. Nothing uploaded externally. Self-hosted. API keys redacted by default.
Set HERMES_WEBUI_PASSWORD env var. Uses signed HMAC HTTP-only cookies.
Yes. Settings toggle. Default ON for safety.
Mobile and PWA
Yes. Mobile-first with hamburger sidebar, 44px touch targets, full-height chat, slide-over panels.
Yes. Service worker with network-first caching. 'Add to Home Screen' on Chrome/Edge/Safari. Works offline with auto-recovery.
Advanced
Create session with worktree flag. WebUI calls _setup_worktree() for isolated git worktree.
Tracks multi-turn goals with budget enforcement. SQLite-backed per profile.
Agent maintains shadow git repos. WebUI shows checkpoint list, diff viewer, restore with confirmation.
WebUI is for single Hermes Agent. For multi-agent, consider Aion UI which supports 20+ agents including Hermes.
GitHub: nesquena/hermes-webui. 41+ contributors, 164+ releases, 4,288 tests. Fork and submit PR.
4,288 tests across 53 files. Run: pytest tests/
File GitHub issue with: version, deployment method, steps to reproduce, expected vs actual, browser/OS, logs.