MCPcopy
hub / github.com/nesquena/hermes-webui

github.com/nesquena/hermes-webui @v0.51.834 sqlite

repository ↗ · DeepWiki ↗ · release v0.51.834 ↗
22,103 symbols 67,713 edges 1,242 files 8,306 documented · 38%
README

Hermes Web UI

Hermes Agent is a sophisticated autonomous agent that lives on your server, accessed via a terminal or messaging apps, that remembers what it learns and gets more capable the longer it runs.

Hermes WebUI is a lightweight, dark-themed web app interface in your browser for Hermes Agent. Full parity with the CLI experience - everything you can do from a terminal, you can do from this UI. No build step, no framework, no bundler. Just Python and vanilla JS.

Layout: three-panel. Left sidebar for sessions and navigation, center for chat, right for workspace file browsing. Model, profile, and workspace controls live in the composer footer — always visible while composing. A circular context ring shows token usage at a glance. All settings and session tools are in the Hermes Control Center (launcher at the sidebar bottom).

Hermes Web UI — three-panel layout

Light mode with full profile support Light mode with full profile support Customize your settings, configure a password Customize your settings, configure a password
Workspace file browser with inline preview Workspace file browser with inline preview Session projects, tags, and tool call cards Session projects, tags, and tool call cards

This gives you nearly 1:1 parity with Hermes CLI from a convenient web UI which you can access securely through an SSH tunnel from your Hermes setup. Single command to start this up, and a single command to SSH tunnel for access on your computer. Every single part of the web UI uses your existing Hermes agent and existing models, without requiring any additional setup.


Contents


Why Hermes

Most AI tools reset every session. They don't know who you are, what you worked on, or what conventions your project follows. You re-explain yourself every time.

Hermes retains context across sessions, runs scheduled jobs while you're offline, and gets smarter about your environment the longer it runs. It uses your existing Hermes agent setup, your existing models, and requires no additional configuration to start.

What makes it different from other agentic tools:

  • Persistent memory — user profile, agent notes, and a skills system that saves reusable procedures; Hermes learns your environment and does not have to relearn it
  • Self-hosted scheduling — cron jobs that fire while you're offline and deliver results to Telegram, Discord, Slack, Signal, email, and more
  • 10+ messaging platforms — the same agent available in the terminal is reachable from your phone
  • Self-improving skills — Hermes writes and saves its own skills automatically from experience; no marketplace to browse, no plugins to install
  • Provider-agnostic — OpenAI, Anthropic, Google, DeepSeek, OpenRouter, and more
  • Orchestrates other agents — can spawn Claude Code or Codex for heavy coding tasks and bring the results back into its own memory
  • Self-hosted — your conversations, your memory, your hardware

vs. the field (landscape is actively shifting — see docs/why-hermes.md for the full breakdown):

OpenClaw Claude Code Codex CLI OpenCode Hermes
Persistent memory (auto) Yes Partial† Partial Partial Yes
Scheduled jobs (self-hosted) Yes No‡ No No Yes
Messaging app access Yes (15+ platforms) Partial (Telegram/Discord preview) No No Yes (10+)
Web UI (self-hosted) Dashboard only No No Yes Yes
Self-improving skills Partial No No No Yes
Python / ML ecosystem No (Node.js) No No No Yes
Provider-agnostic Yes No (Claude only) Yes Yes Yes
Open source Yes (MIT) No Yes Yes Yes

† Claude Code has CLAUDE.md / MEMORY.md project context and rolling auto-memory, but not full automatic cross-session recall
‡ Claude Code has cloud-managed scheduling (Anthropic infrastructure) and session-scoped /loop; no self-hosted cron

The closest competitor is OpenClaw — both are always-on, self-hosted, open-source agents with memory, cron, and messaging. The key differences: Hermes writes and saves its own skills automatically as a core behavior (OpenClaw's skill system centers on a community marketplace); Hermes is more stable across updates (OpenClaw has documented release regressions and ClawHub has had security incidents involving malicious skills); and Hermes runs natively in the Python ecosystem. See docs/why-hermes.md for the full side-by-side.


Quick start

Run the repo bootstrap:

git clone https://github.com/nesquena/hermes-webui.git hermes-webui
cd hermes-webui
python3 bootstrap.py

Or keep using the shell launcher:

./start.sh

For self-hosted VM or homelab installs, ctl.sh wraps the common daemon lifecycle commands without requiring fuser or pkill:

./ctl.sh start              # background daemon, PID at ~/.hermes/webui.pid
./ctl.sh status             # PID, uptime, bound host/port, log path, /health
./ctl.sh logs --lines 100   # tail ~/.hermes/webui.log
./ctl.sh restart
./ctl.sh stop

ctl.sh start runs the bootstrap in foreground/no-browser mode behind the daemon wrapper, writes logs to ~/.hermes/webui.log, and respects .env plus inline overrides such as HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start.

Stopping the server. Each launch method has its own stop path because only ctl.sh start writes a PID file (~/.hermes/webui.pid):

Launch method How to stop
python3 bootstrap.py Ctrl-C in the terminal (runs in the foreground)
./ctl.sh start ./ctl.sh stop (sends SIGTERM, waits, then SIGKILL)
Detached bootstrap.py (no --foreground) or ./start.sh Find the PID via lsof -i :8787 (or ss -tlnp) and kill it

./ctl.sh stop cannot stop a server launched by bootstrap.py or start.sh directly — it only manages processes it started itself.

How chat runs by default. WebUI runs the Hermes agent in-process, reading your HERMES_HOME config directly. It does not connect to an external Hermes/agent OpenAI-compatible API server to run chat. HERMES_API_URL is only read by the Tasks/cron health probe and does not route chat.

Two options if you run an external endpoint:

  1. Use its models as a chat provider (supported today): add it in Settings → Providers as a custom OpenAI-compatible provider with base_url = http://127.0.0.1:8642/v1 and your bearer token.
  2. Route chat through a Hermes Gateway API server (supported today via HERMES_WEBUI_CHAT_BACKEND=gateway): see docs/advanced-chat-setup.md. Full agent-loop delegation is not yet shipped; tracked in #1925.

Advanced: dynamic recall prefill & Gateway-backed chat

Two optional, self-hosted-deployment features — attaching dynamic session-recall prefill to browser turns (Joplin/Obsidian/Notion/llm-wiki routers), and routing browser chat through a running Hermes Gateway — are documented in docs/advanced-chat-setup.md. Most users need neither.

The bootstrap will:

  1. Detect Hermes Agent and, if missing, attempt the official installer (curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash).
  2. Find or create a Python environment with the WebUI dependencies.
  3. Start the web server and wait for /health.
  4. Open the browser unless you pass --no-browser.
  5. Drop you into a first-run onboarding wizard inside the WebUI.

Native Windows is not supported for this bootstrap yet. Use Linux, macOS, or WSL2. For Windows / WSL auto-start at login, see docs/wsl-autostart.md.

A community-maintained native Windows setup is documented at @markwang2658/hermes-windows-native-guide (companion setup repo: @markwang2658/hermes-windows-native). Notes from the community report in #1952:

  • Memory: community-measured ~330 MB native vs ~1080 MB with WSL2+Docker (varies by configuration).
  • What works: chat, workspace browser, session management, all themes.
  • Known limitations: some POSIX-style file paths surface in the workspace browser; bash-assuming agent tools may not work natively.
  • Native Windows setup: install Python 3.11+, then from the hermes-agent root in PowerShell: python -m venv venvpip install -r requirements.txtpwsh .\start.ps1 (it auto-discovers venv\Scripts\python.exe).
  • WSL2 relationship: not a prerequisite — a WSL2-built venv (venv/bin/python, ELF) isn't invokable by native Windows Python, so use the native setup above. WSL2 stays useful as a parallel install if you want the full bootstrap.py + Linux runtime.

If provider setup is still incomplete after install, the onboarding wizard will point you to finish it with hermes model instead of trying to replicate the full CLI setup in-browser. For a step-by-step walkthrough of the wizard, provider choices, local model server Base URLs, and safe re-runs, see docs/onboarding.md. If an AI assistant is helping with install, reinstall, bootstrap, provider setup, or first-run support, have it read docs/onboarding-agent-checklist.md before running commands or inspecting logs.


Features

Chat and agent

  • Streaming responses via SSE (tokens appear as they are generated)
  • Multi-provider model support -- any Hermes API provider (OpenAI, Anthropic, Google, DeepSeek, Nous Portal, OpenRouter, MiniMax, Xiaomi MiMo, Z.AI); dynamic model dropdown populated from configured keys
  • Send a message while one is processing -- it queues automatically
  • Edit any past user message inline and regenerate from that point
  • Retry the last assistant response with one click
  • Cancel a running task directly from the composer footer (Stop button next to Send)
  • Tool call cards inline -- each shows the tool name, args, and result snippet; expand/collapse all toggle for multi-tool turns
  • Subagent delegation cards -- child agent activity shown with distinct icon and indented border
  • Mermaid diagram rendering inline (flowcharts, sequence diagrams, gantt charts)
  • Thinking/reasoning display -- collapsible gold-themed cards for Claude extended thinking and o3 reasoning blocks
  • Approval card for dangerous shell commands (allow once / session / always / deny)
  • SSE auto-reconnect on network blips (SSH tunnel resilience)
  • File attachments persist across page reloads and are stored outside the active workspace by default (~/.hermes/webui/attachments/<session_id>/, or HERMES_WEBUI_ATTACHMENT_DIR/<session_id>/ when configured)
  • Message timestamps (HH:MM next to each message, full date on hover)
  • Code block copy button with "Copied!" feedback
  • Syntax highlighting via Prism.js (Python, JS, bash, JSON, SQL, and more)
  • Safe HTML rendering in AI responses (bold, italic, code converted to markdown)
  • rAF-throttled token streaming for smoother rendering during long responses
  • Context usage indicator in composer footer -- token count, cost, and fill bar (model-aware)

Sessions

  • Create, rename, duplicate, delete, search by title and message content
  • Session actions via dropdown per session — pin, move to project, archive, duplicate, delete
  • Pin/star sessions to the top of the sidebar (gold indicator)
  • Archive sessions (hide without deleting, toggle to show)
  • Session projects -- named groups with colors for organizing sessions
  • Session tags -- add #tag to titles for colored chips and click-to-filter
  • Grouped by Today / Yesterday / Earlier in the sidebar (collapsible date groups)
  • Download as Markdown transcript, full JSON export, or import from JSON
  • Sessions persist across page reloads and SSH tunnel reconnects
  • Browser tab title reflects the active session name
  • CLI session bridge -- CLI sessions from hermes-agent's SQLite store appear in the sidebar with a gold "cli" badge; click to import with full history and reply normally
  • Token/cost display -- input tokens, output tokens, estimated cost shown per conversation (toggle in Settings or /usage command)

Workspace file browser

  • Directory tree with expand/c

Core symbols most depended-on inside this repo

t
called by 1441
static/i18n.js
$
called by 1194
static/ui.js
esc
called by 874
static/ui.js
bad
called by 530
api/helpers.py
showToast
called by 432
static/ui.js
j
called by 405
api/helpers.py
set
called by 374
static/panels.js
api
called by 325
static/workspace.js

Shape

Function 15,249
Method 5,506
Class 1,305
Route 43

Languages

Python87%
TypeScript13%

Modules by API surface

static/ui.js882 symbols
api/routes.py639 symbols
static/panels.js560 symbols
static/sessions.js373 symbols
static/messages.js353 symbols
api/streaming.py243 symbols
api/models.py195 symbols
api/config.py187 symbols
tests/test_update_banner_fixes.py151 symbols
static/boot.js144 symbols
tests/test_kanban_bridge.py109 symbols
tests/test_workspace_git.py102 symbols

Dependencies from manifests, versioned

eslint10.4.0 · 1×
cryptography42.0 · 1×
pyyaml6.0 · 1×

Datastores touched

(mysql)Database · 1 repos
(mongodb)Database · 1 repos
secretDatabase · 1 repos

For agents

$ claude mcp add hermes-webui \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact