GitHub
v0.51.30 - May 2026

Hermes WebUI Master Guide

The complete end-to-end reference for the browser-based interface to Hermes Agent. From first install to advanced orchestration.

7K+
GitHub Stars
4,288
Tests
164+
Releases
8
Themes
8
Languages

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.

Key Principle: Hermes WebUI is not a replacement for Hermes Agent - it is a surface for it. The WebUI reads your existing ~/.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.

+-------------------------------------------------+ | Hermes WebUI (Python Server) | | +-----------+ +----------+ +--------------+ | | | Routes | | Streaming| | Workspace | | | | (1180L) | | (236L) | | (77L) | | | +-----+-----+ +----+-----+ +------+-------+ | | +-----+-----------+-------------+-----------+ | | | Hermes Agent (In-Process) | | | | config.yaml | state.db | skills | memory | | | +-------------------------------------------+ | +-------------------------------------------------+ | SSE / HTTP +-------------------------------------------------+ | Browser (Vanilla JS) | | ui.js | sessions.js | messages.js | panels.js | | workspace.js | commands.js | boot.js | i18n.js | +-------------------------------------------------+

Backend Structure

FilePurposeLines
api/routes.pyAll GET + POST route handlers~1180
api/config.pyDiscovery, globals, model detection, reloadable config~701
api/streaming.pySSE engine, run_agent, cancel, HERMES_HOME save/restore~236
api/profiles.pyProfile state management, hermes_cli wrapper~246
api/models.pySession model + CRUD, per-session profile tracking~137
api/auth.pyOptional password authentication, signed cookies~149
api/helpers.pyHTTP helpers, safe_resolve, security headers~71
api/workspace.pyFile ops: list_dir, read_file_content, workspace helpers~77
api/upload.pyMultipart parser, file upload handler~78
api/onboarding.pyFirst-run onboarding, provider config writes-

Frontend Structure

FilePurposeLines
static/ui.jsDOM helpers, renderMd, tool cards, model dropdown, file tree~977
static/panels.jsCron, skills, memory, workspace, profiles, todo, settings~974
static/sessions.jsSession CRUD, list rendering, search, SVG icons, dropdowns~533
static/messages.jssend(), SSE event handlers, approval, transcript~297
static/boot.jsEvent wiring, mobile nav, voice input, boot IIFE~338
static/workspace.jsFile preview, file ops, loadDir, clearPreview~185
static/commands.jsSlash command registry, parser, autocomplete~156
static/style.cssAll CSS including mobile responsive~670
Why this matters: Because the WebUI imports Hermes Agent modules in-process, there is zero serialization overhead. The WebUI can read 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.

  1. Clone the repository
    git clone https://github.com/nesquena/hermes-webui.git hermes-webui
    cd hermes-webui
  2. Run the start script
    ./start.sh

    Installs dependencies, checks for Hermes Agent, starts server on http://localhost:8787.

  3. Open in browser

    Navigate to http://localhost:8787. The onboarding wizard guides you through provider setup on first run.

That is it. No build step, no bundler, no framework. If you are on a VPS, see Docker and Remote Access below.

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-mvp state directory if needed
  • Start the server on 127.0.0.1:8787
  • If running over SSH, print the SSH tunnel command automatically
Prerequisites: Python 3.10+, Hermes Agent installed, API keys configured in ~/.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

docker-compose.yml
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.

docker-compose.two-container.yml
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:
Named volumes are critical: The two-container setup uses named Docker volumes by default. Named volumes solve the UID/GID problem automatically. Do not replace them with bind mounts unless you understand the permission implications.

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

  1. Install Tailscale on VPS
    curl -fsSL https://tailscale.com/install.sh | sh
    sudo tailscale up
  2. Install Tailscale on local machine
    curl -fsSL https://tailscale.com/install.sh | sh
    sudo tailscale up
  3. Access via Tailscale IP
    http://<tailscale-ip>:8787

Direct Network Exposure

Security warning: Only expose directly if you set 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 requestAnimationFrame to 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 + /reasoning command

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 ```mermaid blocks
  • 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.yaml at 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.

CommandDescription
/newCreate new session
/compactCompact conversation context
/reasoningSet reasoning effort (low/medium/high)
/themeSwitch themes
/usageToggle token/cost display
/toolsetsOverride tools for this session
/insights [days]Open Insights panel with time filter
/goalTrack multi-turn goals with budget
/profilesSwitch active model profile
/modelsOpen model picker
/settingsOpen Hermes Control Center
/helpShow available commands
Plugin commandsExecute via /api/commands/exec
Plugin commands: Plugin-registered slash commands surface in the WebUI picker and execute through the plugin endpoint, ensuring full CLI parity.

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.

Memory inspectability: Unlike cloud agents, Hermes memory is plain markdown you can read, edit, and audit. You own your memory data.

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 checkpoints
  • GET /api/rollback/diff - Get diff for a checkpoint
  • POST /api/rollback/restore - Restore to a checkpoint

Voice Mode #

Turn-based voice interaction using browser Web Speech API.

  1. Activate: Click voice button in composer
  2. Speak: Browser captures audio via Web Speech API (STT)
  3. Send: Transcribed text sent as message
  4. Listen: Agent response read aloud via TTS
  5. 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-allowed and audio-capture errors with toast
Browser support: Requires Chrome, Edge, or Safari. Firefox does not support SpeechRecognition. Hidden automatically in unsupported browsers.

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

EnglishDefault locale, full coverage
Chinese (Simplified)Full translation
Chinese (Traditional)Full translation
KoreanFull translation
RussianFull translation
SpanishFull translation
GermanFull translation
PortugueseFull translation

Themes

9 built-in themes, switchable via Settings or /theme:

DarkDefault theme
LightFull profile support
SystemFollows OS preference
OLEDPure black for OLED
SiennaWarm brown tones
SlateCool gray palette
Solarized DarkClassic Solarized
MonokaiVibrant dark
NordArctic blue palette

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 #

VariableDescriptionDefault
HERMES_WEBUI_HOSTHTTP server bind address0.0.0.0
HERMES_WEBUI_PORTHTTP server port8787
HERMES_WEBUI_PASSWORDPassword for auth(unset - no auth)
HERMES_WEBUI_STATE_DIRWebUI state directory~/.hermes/webui-mvp
HERMES_WEBUI_ONBOARDING_OPENBypass onboarding IP check0
HERMES_WEBUI_TRUST_PROXYTrust X-Forwarded-For0
HERMES_HOMEHermes Agent home~/.hermes
WANTED_UIDContainer UIDAuto-detected
WANTED_GIDContainer GIDAuto-detected
HERMES_SKIP_CHMODSkip chmod on startup0
HERMES_HOME_MODEFile permission mode0600
HERMES_ALLOW_ROOT_GATEWAYAllow root gateway0
HERMES_DASHBOARDEnable dashboard(unset)
HERMES_DASHBOARD_HOSTDashboard bind0.0.0.0
HERMES_DASHBOARD_PORTDashboard port9119
API_SERVER_ENABLEDEnable OpenAI-compatible APIfalse
API_SERVER_HOSTAPI server bind127.0.0.1
API_SERVER_KEYAPI server key(unset)

API Reference #

Sessions

MethodEndpointDescription
GET/api/sessionsList all sessions
POST/api/session/newCreate session (accepts worktree: true)
GET/api/session/:idGet session details
PUT/api/session/:idUpdate session
DELETE/api/session/:idDelete session

Chat

MethodEndpointDescription
POST/api/chatSend message (SSE streaming)
POST/api/chat/:id/cancelCancel streaming
POST/api/chat/:id/approveApprove/deny command

Workspace

MethodEndpointDescription
GET/api/workspaceList directory
GET/api/workspace/readRead file content
POST/api/workspace/writeWrite file
POST/api/workspace/uploadUpload file

Other Endpoints

MethodEndpointDescription
GET/api/insights?days=30Usage analytics (max 365 days)
GET/api/rollback/listList checkpoints
GET/api/rollback/diffGet checkpoint diff
POST/api/rollback/restoreRestore checkpoint
GET/api/commandsList slash commands
POST/api/commands/execExecute slash command
GET/healthHealth 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.