nesquena/hermes-webui
Hermes WebUI 是访问 Hermes Agent 的 self-hosted browser interface,使用 Python 和 vanilla JS,无 build step,提供三栏布局、chat、sessions、workspace、profiles、tasks、skills、memory、themes、password auth、SSE streaming、mobile responsive 等功能。支持 CLI session bridge、Docker/GHCR、SSH tunnel、Tailscale 访问,默认端口 8787,测试数 3309。项目截至 v0.50.245 有 66 位 contributors。
Hermes Web UI
Hermes Agent 是一个运行在你服务器上的高级 autonomous agent,可通过 terminal 或 messaging apps 访问;它会记住所学内容,并且运行时间越长,能力越强。
Hermes WebUI 是一个轻量级、深色主题的浏览器 web app interface,用于访问 Hermes Agent。 它与 CLI 体验完全对等——你能在 terminal 中完成的所有操作, 都可以在这个 UI 中完成。无需 build step、无需 framework、无需 bundler。只有 Python 和 vanilla JS。
布局:三栏。左侧 sidebar 用于 sessions 和导航,中间用于 chat, 右侧用于 workspace 文件浏览。Model、profile 和 workspace 控件位于 composer footer 中——在编写时始终可见。圆形 context ring 可让你一眼查看 token usage。所有 settings 和 session tools 都在 Hermes Control Center 中(launcher 位于 sidebar 底部)。
这让你几乎获得 Hermes CLI 与便捷 web UI 的 1:1 对等体验,你可以从 Hermes 环境通过 SSH tunnel 安全访问。启动只需一条命令,在你的电脑上通过 SSH tunnel 访问也只需一条命令。Web UI 的每个部分都使用你现有的 Hermes agent 和现有 models,不需要任何额外设置。
为什么选择 Hermes
大多数 AI tools 每个 session 都会重置。它们不知道你是谁、做过什么、项目遵循什么 约定。你每次都要重新解释。
Hermes 会跨 sessions 保留 context,在你离线时运行 scheduled jobs,并且随着运行时间变长, 更了解你的环境。它使用你现有的 Hermes agent setup、 现有 models,并且启动不需要额外配置。
它与其他 agentic tools 的不同之处:
- Persistent memory — user profile、agent notes,以及保存可复用 procedures 的 skills system;Hermes 会学习你的环境,不必反复学习
- Self-hosted scheduling — cron jobs 会在你离线时触发,并将结果发送到 Telegram、Discord、Slack、Signal、email 等
- 10+ messaging platforms — terminal 中可用的同一个 agent,也可以从手机访问
- Self-improving skills — Hermes 会根据经验自动编写并保存自己的 skills; 不需要浏览 marketplace,也不需要安装 plugins
- Provider-agnostic — OpenAI、Anthropic、Google、DeepSeek、OpenRouter 等
- Orchestrates other agents — 可生成 Claude Code 或 Codex 处理重型 coding tasks,并将 结果带回自身 memory
- Self-hosted — 你的 conversations、你的 memory、你的 hardware
与同类工具相比 (生态仍在快速变化——完整拆解见 HERMES.md):
| OpenClaw | Claude Code | Codex CLI | OpenCode | Hermes | |
|---|---|---|---|---|---|
| Persistent memory(自动) | 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 | 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) | Yes | Yes | Yes |
| Open source | Yes(MIT) | No | Yes | Yes | Yes |
† Claude Code 有 CLAUDE.md / MEMORY.md project context 和 rolling auto-memory,但没有完整的自动跨 session recall
‡ Claude Code 有 cloud-managed scheduling(Anthropic infrastructure)和 session-scoped /loop;没有 self-hosted cron
最接近的竞争者是 OpenClaw——两者都是 always-on、self-hosted、open-source agents, 具备 memory、cron 和 messaging。关键差异:Hermes 会把自动编写和保存自身 skills 作为核心行为(OpenClaw 的 skill system 以 community marketplace 为中心); Hermes 在更新之间更稳定(OpenClaw 有记录在案的 release regressions,ClawHub 也发生过涉及恶意 skills 的安全事件);并且 Hermes 原生运行在 Python ecosystem 中。完整逐项对比见 HERMES.md。
Quick start
运行 repo bootstrap:
git clone https://github.com/nesquena/hermes-webui.git hermes-webui
cd hermes-webui
python3 bootstrap.py
或者继续使用 shell launcher:
./start.sh
对于 self-hosted VM 或 homelab 安装,ctl.sh 封装了常见 daemon lifecycle commands,无需 fuser 或 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 会在 daemon wrapper 后以 foreground/no-browser mode 运行 bootstrap,将 logs 写入 ~/.hermes/webui.log,并遵守 .env 以及 inline overrides,例如 HERMES_WEBUI_HOST=0.0.0.0 ./ctl.sh start。
Bootstrap 将会:
- 检测 Hermes Agent;如果缺失,尝试使用官方 installer(
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash)。 - 查找或创建带有 WebUI dependencies 的 Python environment。
- 启动 web server 并等待
/health。 - 除非传入
--no-browser,否则打开浏览器。 - 在 WebUI 中进入 first-run onboarding wizard。
此 bootstrap 目前尚不支持 native Windows。请使用 Linux、macOS 或 WSL2。 Windows / WSL 登录时自动启动请见
docs/wsl-autostart.md。
如果安装后 provider setup 仍未完成,onboarding wizard 会引导你使用 hermes model 完成,而不是试图在浏览器内复刻完整 CLI setup。
Docker
Pre-built images(amd64 + arm64)会在每次 release 时发布到 GHCR。
如需覆盖全部 3 个 compose files、常见 failure modes 和 bind-mount migration 的完整 setup guide,请见 docs/docker.md。README 覆盖 5 分钟 happy path。
5 分钟 quickstart(single container)
最简单的设置:一个 WebUI container,在进程内运行 agent。
git clone https://github.com/nesquena/hermes-webui
cd hermes-webui
cp .env.docker.example .env
# Edit .env if your host UID isn't 1000 (e.g. macOS where UIDs start at 501)
docker compose up -d
# Open http://localhost:8787
Container 会从挂载的 ~/.hermes volume 自动检测你的 UID/GID,因此 agent 写入的文件在 host 上仍可由你读取。
启用 password protection(如果将端口暴露到 127.0.0.1 之外则必须启用):
echo "HERMES_WEBUI_PASSWORD=change-me-to-something-strong" >> .env
docker compose up -d --force-recreate
手动 docker run(不使用 compose)
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 \
-e HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui \
-v ~/workspace:/workspace \
-p 127.0.0.1:8787:8787 \
ghcr.io/nesquena/hermes-webui:latest
本地构建
docker build -t hermes-webui .
docker run -d \
-e WANTED_UID=$(id -u) -e WANTED_GID=$(id -g) \
-v ~/.hermes:/home/hermeswebui/.hermes \
-e HERMES_WEBUI_STATE_DIR=/home/hermeswebui/.hermes/webui \
-v ~/workspace:/workspace \
-p 127.0.0.1:8787:8787 \
hermes-webui
Multi-container setups
如果你希望 agent 和 WebUI 位于不同 containers 中(为了隔离,或因为你已经在其他地方运行 agent gateway):
# Agent + WebUI
docker compose -f docker-compose.two-container.yml up -d
# Agent + Dashboard + WebUI
docker compose -f docker-compose.three-container.yml up -d
两个 compose files 默认都使用 named Docker volumes,这从结构上解决了 UID/GID 问题。如果你需要 bind mounts 来共享现有 host directory,请参阅 docs/docker.md 获取完整 migration recipe。
已知限制(#681):在 two-container setup 中,从 WebUI 触发的 tools 会在 WebUI container 中运行,而不是 agent container。如果你需要在 WebUI 的 filesystem 上使用 git/node/etc.,请使用 single-container setup、扩展 WebUI Dockerfile,或使用 community all-in-one image。
常见 failure modes
| Symptom | Likely cause | Fix |
|---|---|---|
启动时出现 PermissionError |
bind mount 上 UID 不匹配 | 在 .env 中设置 UID=$(id -u) |
.env: permission denied(#1389) |
fix_credential_permissions() 强制 0600 |
在 .env 中设置 HERMES_SKIP_CHMOD=1 |
| Workspace 显示为空 | /workspace mount 上 UID 不匹配 |
在 .env 中设置 UID=$(id -u) |
chat 中出现 git: command not found |
Two-container architectural limit(#681) | 使用 single-container 或扩展 Dockerfile |
| WebUI 找不到 agent source | hermes-agent-src volume 配置错误 |
按 compose files 原样使用 named volumes |
Podman 共享 .hermes 失败 |
Podman 3.4 keep-id 限制 |
使用 Podman 4+ 或 single-container |
关于每项的深入说明见 docs/docker.md。
Note: 默认情况下,Docker Compose 绑定到
127.0.0.1(仅 localhost)。 如需暴露到网络,请在docker-compose.yml中将端口改为"8787:8787", 并设置HERMES_WEBUI_PASSWORD以启用 authentication。
start.sh 会自动发现什么
| Thing | How it finds it |
|---|---|
| Hermes agent dir | HERMES_WEBUI_AGENT_DIR env,然后是 ~/.hermes/hermes-agent,然后是 sibling ../hermes-agent |
| Python executable | 先使用 agent venv,然后是此 repo 中的 .venv,然后是 system python3 |
| State directory | HERMES_WEBUI_STATE_DIR env,然后是 ~/.hermes/webui-mvp |
| Default workspace | HERMES_WEBUI_DEFAULT_WORKSPACE env,然后是 ~/workspace,然后是 state dir |
| Port | HERMES_WEBUI_PORT env 或第一个参数,默认 8787 |
如果 discovery 找到所有内容,就不需要其他配置。
Overrides(仅当 auto-detection 未命中时需要)
export HERMES_WEBUI_AGENT_DIR=/path/to/hermes-agent
export HERMES_WEBUI_PYTHON=/path/to/python
export HERMES_WEBUI_PORT=9000
export HERMES_WEBUI_AUTO_INSTALL=1 # enable auto-install of agent deps (disabled by default)
./start.sh
或 inline:
HERMES_WEBUI_AGENT_DIR=/custom/path ./start.sh 9000
完整 environment variables 列表:
| Variable | Default | Description |
|---|---|---|
HERMES_WEBUI_AGENT_DIR |
auto-discovered | hermes-agent checkout 的路径 |
HERMES_WEBUI_PYTHON |
auto-discovered | Python executable |
HERMES_WEBUI_HOST |
127.0.0.1 |
Bind address |
HERMES_WEBUI_PORT |
8787 |
Port |
HERMES_WEBUI_STATE_DIR |
~/.hermes/webui-mvp |
Sessions 和 state 的存储位置 |
HERMES_WEBUI_DEFAULT_WORKSPACE |
~/workspace |
Default workspace |
HERMES_WEBUI_DEFAULT_MODEL |
openai/gpt-5.4-mini |
Default model |
HERMES_WEBUI_PASSWORD |
(unset) | 设置后启用 password authentication |
HERMES_WEBUI_EXTENSION_DIR |
(unset) | 可选 local directory,服务于 /extensions/;必须指向现有目录,extension injection 才会启用 |
HERMES_WEBUI_EXTENSION_SCRIPT_URLS |
(unset) | 可选 comma-separated same-origin script URLs,用于注入;见 WebUI Extensions |
HERMES_WEBUI_EXTENSION_STYLESHEET_URLS |
(unset) | 可选 comma-separated same-origin stylesheet URLs,用于注入;见 WebUI Extensions |
HERMES_HOME |
~/.hermes |
Hermes state 的 base directory(影响所有路径) |
HERMES_CONFIG_PATH |
~/.hermes/config.yaml |
Hermes config file 的路径 |
从远程机器访问
Server 默认绑定到 127.0.0.1(仅 loopback)。如果你在 VPS 或远程 server 上运行
Hermes,请从本地机器使用 SSH tunnel:
ssh -N -L <local-port>:127.0.0.1:<remote-port> <user>@<server-host>
示例:
ssh -N -L 8787:127.0.0.1:8787 user@your.server.com
然后在本地浏览器打开 http://localhost:8787。
当 start.sh 检测到你正在通过 SSH 运行时,会自动为你打印此命令。
使用 Tailscale 在手机上访问
Tailscale 是基于 WireGuard 的零配置 mesh VPN。将其安装到你的 server 和手机上,它们就会加入同一个 private network——无需 port forwarding、无需 SSH tunnels、无需 public exposure。
Hermes Web UI 完全 responsive,并带有面向 mobile 优化的布局 (hamburger sidebar、drawer 中的 sidebar top tabs、touch-friendly controls), 因此很适合作为手机上的日常 agent interface。
Setup:
- 在你的 server 和 iPhone/Android 上安装 Tailscale。
- 启动 WebUI,使其监听所有 interfaces,并启用 password auth:
HERMES_WEBUI_HOST=0.0.0.0 HERMES_WEBUI_PASSWORD=your-secret ./start.sh
- 在手机浏览器中打开
http://<server-tailscale-ip>:8787(可在 Tailscale app 中找到 server 的 Tailscale IP,或在 server 上运行tailscale ip -4)。
就是这样。Traffic 由 WireGuard 端到端加密,password auth 在 application level 保护 UI。你可以将它添加到 home screen, 获得类似 app 的体验。
Tip: 如果使用 Docker,请在你的
docker-compose.ymlenvironment 中设置HERMES_WEBUI_HOST=0.0.0.0(这已经是默认值),并设置HERMES_WEBUI_PASSWORD。
手动启动(不使用 start.sh)
如果你更愿意直接启动 server:
cd /path/to/hermes-agent # or wherever sys.path can find Hermes modules
HERMES_WEBUI_PORT=8787 venv/bin/python /path/to/hermes-webui/server.py
注意:请使用 agent venv Python(或任何已安装 Hermes agent dependencies 的 Python environment)。System Python 会缺少 openai、httpx 和其他 required packages。
Health check:
curl http://127.0.0.1:8787/health
运行 tests
Tests 会动态发现 repo 和 Hermes agent——没有 hardcoded paths。
cd hermes-webui
pytest tests/ -v --timeout=60
或显式使用 agent venv:
/path/to/hermes-agent/venv/bin/python -m pytest tests/ -v
Tests 会在 port 8788 上针对 isolated server 运行,并使用单独的 state directory。 Production data 和真实 cron jobs 永远不会被触碰。当前数量:3309 tests, 分布在 100+ test files 中。
Features
Chat 和 agent
- 通过 SSE 实现 streaming responses(tokens 会在生成时出现)
- Multi-provider model support——支持任何 Hermes API provider(OpenAI、Anthropic、Google、DeepSeek、Nous Portal、OpenRouter、MiniMax、Z.AI);dynamic model dropdown 会根据已配置 keys 填充
- 可在一条 message 正在处理时发送另一条——它会自动排队
- 可 inline 编辑任何过去的 user message,并从该点重新生成
- 一键 retry 最后一条 assistant response
- 可直接从 composer footer 取消正在运行的 task(Send 旁边的 Stop button)
- Inline tool call cards——每张显示 tool name、args 和 result snippet;multi-tool turns 支持 expand/collapse all toggle
- Subagent delegation cards——child agent activity 使用不同 icon 和缩进 border 展示
- Inline 渲染 Mermaid diagrams(flowcharts、sequence diagrams、gantt charts)
- Thinking/reasoning display——用于 Claude extended thinking 和 o3 reasoning blocks 的可折叠金色主题 cards
- Dangerous shell commands 的 approval card(allow once / session / always / deny)
- 网络抖动时 SSE auto-reconnect(SSH tunnel resilience)
- File attachments 在 page reloads 后仍会保留
- Message timestamps(每条 message 旁显示 HH:MM,hover 显示 full date)
- Code block copy button,带 "Copied!" feedback
- 通过 Prism.js 实现 syntax highlighting(Python、JS、bash、JSON、SQL 等)
- AI responses 中的 safe HTML rendering(bold、italic、code 转换为 markdown)
- rAF-throttled token streaming,让长 responses 渲染更平滑
- Composer footer 中的 context usage indicator——token count、cost 和 fill bar(model-aware)
Sessions
- 创建、重命名、duplicate、删除,并按 title 和 message content 搜索
- 每个 session 通过
⋯dropdown 执行 session actions——pin、move to project、archive、duplicate、delete - 将 sessions pin/star 到 sidebar 顶部(金色 indicator)
- Archive sessions(隐藏但不删除,可切换显示)
- Session projects——带颜色的命名 groups,用于组织 sessions
- Session tags——在 titles 中添加 #tag 以生成 colored chips,并可点击过滤
- Sidebar 中按 Today / Yesterday / Earlier 分组(可折叠 date groups)
- 下载为 Markdown transcript、完整 JSON export,或从 JSON import
- Sessions 在 page reloads 和 SSH tunnel reconnects 后仍会保留
- Browser tab title 会反映 active session name
- CLI session bridge——hermes-agent 的 SQLite store 中的 CLI sessions 会显示在 sidebar,并带有金色 "cli" badge;点击可导入完整 history 并正常回复
- Token/cost display——按 conversation 显示 input tokens、output tokens、estimated cost(可在 Settings 或
/usagecommand 中切换)
Workspace file browser
- 带 expand/collapse 的 directory tree(single-click toggles,double-click navigates)
- Breadcrumb navigation,路径段可点击
- Inline preview text、code、Markdown(rendered)和 images
- 编辑、创建、删除和重命名 files;创建 folders
- Binary file download(由 server 自动检测)
- Directory navigation 时 file preview 自动关闭(带 unsaved-edit guard)
- Git detection——workspace header 中显示 branch name 和 dirty file count badge
- 右侧 panel 可拖拽调整大小
- Syntax highlighted code preview(Prism.js)
Voice input
- Composer 中的 microphone button(Web Speech API)
- 点击开始录音,再次点击或发送时停止
- Live interim transcription 会显示在 textarea 中
- 静音约 2 秒后自动停止
- 追加到现有 textarea content(不会替换)
- 当浏览器不支持 Web Speech API 时隐藏(Chrome、Edge、Safari)
Profiles
- composer footer 中的 profile chip——dropdown 显示所有 profiles 及 gateway status 和 model info
- Gateway status dots(green = running)、model info、每个 profile 的 skill count
- Profiles management panel——从 sidebar 创建、切换和删除 profiles
- 创建时从 active profile clone config
- 创建时可选 custom endpoint fields——Base URL 和 API key 会写入 profile 的
config.yaml,因此 Ollama、LMStudio 和其他 local endpoints 无需手动编辑文件即可配置 - Seamless switching——无需 server restart;会重新加载 config、skills、memory、cron、models
- Per-session profile tracking(记录创建时 active 的 profile)
Authentication 和 security
- 可选 password auth——默认关闭,localhost 零摩擦
- 通过
HERMES_WEBUI_PASSWORDenv var 或 Settings panel 启用 - Signed HMAC HTTP-only cookie,24h TTL
/login上的简洁深色主题 login page- 所有 responses 都带 security headers(X-Content-Type-Options、X-Frame-Options、Referrer-Policy)
- 20MB POST body size limit
- CDN resources 使用 SRI integrity hashes 固定
Themes
- 7 个 built-in themes:Dark(默认)、Light、Slate、Solarized Dark、Monokai、Nord、OLED
- 通过 Settings panel dropdown(即时 live preview)或
/themecommand 切换 - 跨 reloads 持久化(server-side 存于 settings.json + localStorage 用于无闪烁加载)
- Custom themes:定义一个
:root[data-theme="name"]CSS block 即可使用——见 THEMES.md
Settings 和 configuration
- Hermes Control Center(sidebar launcher button)——Conversation tab(export/import/clear)、Preferences tab(model、send key、theme、language、所有 toggles)、System tab(version、password)
- Send key:Enter(默认)或 Ctrl/Cmd+Enter
- Show/hide CLI sessions toggle(默认启用)
- Token usage display toggle(默认关闭,也可通过
/usagecommand) - Control Center 始终打开在 Conversation tab;关闭时 reset
- Unsaved changes guard——存在未持久化 changes 时关闭会提示 discard/save
- Cron completion alerts——toast notifications 和 Tasks tab 上的 unread badge
- Background agent error alerts——非 active session 遇到 error 时显示 banner
Slash commands
- 在 composer 中输入
/会出现 autocomplete dropdown - Built-in:
/help、/clear、/compress [focus topic]、/compact(alias)、/model <name>、/workspace <name>、/new、/usage、/theme - Arrow keys 导航,Tab/Enter 选择,Escape 关闭
- 无法识别的 commands 会透传给 agent
Panels
- Chat——session list、search、pin、archive、projects、new conversation
- Tasks——查看、创建、编辑、运行、pause/resume、删除 cron jobs;run history;completion alerts
- Skills——按 category 列出所有 skills,search、preview、create/edit/delete;linked files viewer
- Memory——inline 查看和编辑 MEMORY.md 与 USER.md
- Profiles——创建、切换、删除 agent profiles;clone config
- Todos——来自当前 session 的 live task list
- Spaces——添加、重命名、移除 workspaces;从 topbar 快速切换
Mobile responsive
- Hamburger sidebar——mobile(<640px)上的 slide-in overlay
- Sidebar top tabs 在 mobile 上仍可用;没有占用 chat height 的 fixed bottom nav
- Files 从右侧边缘以 slide-over panel 形式出现
- 所有 interactive elements 的 touch targets 最小 44px
- 手机上 chat/composer 使用 full-height,不保留 bottom-nav spacing
- Desktop layout 完全不变
Architecture
server.py HTTP routing shell + auth middleware (~154 lines)
api/
auth.py Optional password authentication, signed cookies (~201 lines)
config.py Discovery, globals, model detection, reloadable config (~1110 lines)
helpers.py HTTP helpers, security headers (~175 lines)
models.py Session model + CRUD + CLI bridge (~377 lines)
onboarding.py First-run onboarding wizard, OAuth provider support (~507 lines)
profiles.py Profile state management, hermes_cli wrapper (~411 lines)
routes.py All GET + POST route handlers (~2250 lines)
state_sync.py /insights sync — message_count to state.db (~113 lines)
streaming.py SSE engine, run_agent, cancel support (~660 lines)
updates.py Self-update check and release notes (~257 lines)
upload.py Multipart parser, file upload handler (~82 lines)
workspace.py File ops, workspace helpers, git detection (~288 lines)
static/
index.html HTML template (~600 lines)
style.css All CSS incl. mobile responsive, themes (~1050 lines)
ui.js DOM helpers, renderMd, tool cards, context indicator (~1740 lines)
workspace.js File preview, file ops, git badge (~286 lines)
sessions.js Session CRUD, collapsible groups, search, reload recovery (~800 lines)
messages.js send(), SSE handlers, live streaming, session recovery (~655 lines)
panels.js Cron, skills, memory, profiles, settings (~1438 lines)
commands.js Slash command autocomplete (~267 lines)
boot.js Mobile nav, voice input, boot IIFE (~524 lines)
tests/
conftest.py Isolated test server (port 8788)
61 test files 961 test functions
Dockerfile python:3.12-slim container image
docker-compose.yml Compose with named volume and optional auth
.github/workflows/ CI: multi-arch Docker build + GitHub Release on tag
State 默认位于 repo 外部的 ~/.hermes/webui-mvp/
(sessions、workspaces、settings、projects、last_workspace)。可用 HERMES_WEBUI_STATE_DIR 覆盖。
Docs
HERMES.md——为什么选择 Hermes、mental model,以及与 Claude Code / Codex / OpenCode / Cursor 的详细比较ROADMAP.md——feature roadmap 和 sprint historyARCHITECTURE.md——system design、所有 API endpoints、implementation notesTESTING.md——manual browser test plan 和 automated coverage referenceCHANGELOG.md——每个 sprint 的 release notesSPRINTS.md——带 CLI + Claude parity targets 的 forward sprint planTHEMES.md——theme system documentation、custom theme guidedocs/troubleshooting.md——常见 failures 的 diagnostic flows(例如 "AIAgent not available")
Contributors
Hermes WebUI 在 open-source community 的帮助下构建。每个 PR——无论是直接 merge,还是通过 batch release 纳入——都会塑造这个项目,我们感谢每一位花时间贡献的人。
截至 v0.50.245,已有 66 位 contributors 提交的代码进入了 release tag。完整致谢名单见 CONTRIBUTORS.md。重点如下:
Top contributors(按 merged-PR 数量)
| # | Contributor | PRs | First → latest release |
|---|---|---|---|
| 1 | @franksong2702 | 22 | v0.50.49 → v0.50.245 |
| 2 | @bergeouss | 18 | v0.50.49 → v0.50.240 |
| 3 | @aronprins | 8 | v0.47.0 → v0.50.77 |
| 4 | @iRonin | 6 | v0.41.0 |
| 5 | @24601 | 6 | v0.50.201 |
| 6 | @KingBoyAndGirl | 4 | v0.50.232 → v0.50.237 |
| 7 | @renheqiang | 4 | v0.50.93 |
| 8 | @ccqqlo | 3 | v0.50.83 → v0.50.207 |
| 9 | @deboste | 3 | v0.16.1 |
| 10 | @frap129 | 3 | v0.50.157 → v0.50.166 |
完整排名见 CONTRIBUTORS.md,其中包含全部 66 位 contributors,包括有一两个 merged PR 的每个人,以及 design 和 architectural contributions 的特别致谢名单。
Notable contributions
@aronprins——v0.50.0 UI overhaul(PR #242)
项目中最大的单项贡献:完整的 UI redesign,将 model/profile/workspace controls 移到 composer footer,用 Hermes Control Center(tabbed modal)替代 gear-icon settings panel,移除 activity bar 改为 inline composer status,重新设计带 ⋯ action dropdown 的 session list,并添加 workspace panel state machine。26 个 commits,经过充分设计,并在多轮 review 中迭代。
@iRonin——Security hardening sprint(PRs #196–#204) 连续 6 个 security 和 reliability PR:session memory leak fix(expired token pruning)、Content-Security-Policy + Permissions-Policy headers、30 秒 slow-client connection timeout、通过 environment variables 支持 optional HTTPS/TLS、self-update 的 upstream branch tracking fix,以及 file browser API 中的 CLI session support。这种聚焦且高质量的 security work,让 self-hosted tool 更可信。
@DavidSchuchert——German translation(PR #190)
完整 German locale(de),覆盖所有 UI strings、settings labels、commands 和 system messages;同时也对 i18n system 进行了压力测试,暴露出若干尚不可翻译的 elements,并在同一个 PR 中修复。
@Jordan-SkyLF——Live streaming、session recovery、workspace fallback(PRs #366, #367)
三个相互配合的改进:workspace fallback resolution,使 server 在 configured workspace 被删除或不可用时能够 graceful recovery;live reasoning cards,把通用 thinking spinner 升级为 model 思考时的 real-time reasoning display;以及通过 localStorage 实现 durable session state recovery,让 in-flight tool cards、partial assistant output 和 live SSE stream 都能在 full page reload 或 session switch 后保留。
Feature contributions
@gabogabucho——Spanish locale + onboarding wizard(PRs #275, #285)
完整 Spanish(es)locale,覆盖全部 175 个 UI strings,加上 one-shot bootstrap onboarding wizard,在首次启动时引导新用户完成 provider setup——这是最能帮助新用户真正上手的 feature。
@bergeouss——Provider management UI + gateway sync + Docker hardening(18 PRs,v0.50.49 → v0.50.240)
Real-time gateway session sync(Telegram/Discord/Slack 通过 SSE 进入 WebUI sidebar)、用于从 Settings 添加/编辑 custom providers 的 provider management UI、two-container Docker setup docs、OAuth provider status detection、profile isolation hardening(per-profile .env secrets),以及用户在 Settings → Providers 中看到的大部分内容。
@ccqqlo——Terminal approval UX + custom model discovery + mobile close button(PRs #224, #225, #238, #333) 一系列聚焦的 quality-of-life improvements:terminal tool approval prompts 会保持足够长时间以便实际阅读,恢复 custom model API key discovery,并修复 redundant mobile close button,这个问题此前在窄屏上会让用户困惑。
@kevin-ho——OLED theme(PR #168) 添加第 7 个 built-in theme:纯黑背景配暖色 accents,旨在降低 burn-in 风险。改动小,但对 OLED display 用户影响大。
@Bobby9228——Mobile Profiles button + Android Chrome fixes(PRs #253, #263, #265) 将 Profiles entry 添加到 mobile navigation flow,让手机上也能访问 profile switching,并提供一组针对 Android Chrome 的 profile dropdown fixes。
@franksong2702——最活跃的外部 contributor(22 PRs,v0.50.49 → v0.50.245)
Session title guard、breadcrumb workspace navigation、mobile workspace panel sliver fix(#1300)、composer footer container queries、streaming session sidebar exemption(#1327)、session sidecar repair、cron output preservation(#1295)、profile default workspace persistence,以及围绕 session sidebar、mobile responsive layout 和 workspace state machine 的大量 polish。
@betamod——Security hardening(PR #171) 一个全面的 security audit PR,覆盖 CSRF protection、SSRF guards、XSS escaping improvements,以及 concurrent agent sessions 之间的 env race condition——这是 v0.39.0 中发布的基础 security work。
@TaraTheStar——Bot name + thinking blocks + login refactor(PRs #132, #176, #181) 让 assistant display name 在整个 UI 中可配置,在 chat 中添加 thinking/reasoning block display,并将 login page 重构为使用 template variables,而不是 inline string replacement。
@thadreber-web——CLI session bridge(PR #56) 最初的 CLI session bridge:从 agent 的 SQLite state store 读取 CLI sessions,并在 WebUI sidebar 中展示。这是 CLI 与 WebUI session 世界之间的第一个桥梁。
@deboste——Reverse proxy auth + mobile responsive layout + model routing(PRs #3, #4, #5) 最早的三个 community PR:修复 EventSource/fetch,使其在 reverse proxy setups 中使用 URL origin;修正从 config 进行的 model provider routing;并添加带 dvh viewport fix 的 mobile responsive layout。早期基础工作。
Bug fix 和 security contributions
@Hinotoi-agent——Profile .env secret isolation(PR #351)
修复切换 profile 时 API key 泄漏——从带 OPENAI_API_KEY 的 profile 切换到不带该 key 的 profile 时,key 会在 session 期间残留在 process environment 中,实际上泄露了 credentials。这是一个细微但重要的 security fix。
@lawrencel1ng——Bandit security fixes B310/B324/B110 + QuietHTTPServer(PR #354)
系统性 bandit security scan fixes:urlopen 前进行 URL scheme validation、MD5 usedforsecurity=False,以及将 40+ 个裸 except: pass blocks 替换为 proper logging——并添加 QuietHTTPServer,避免 SSE streams 的 client-disconnect log spam。
@lx3133584——非标准端口 reverse proxy 的 CSRF fix(PR #360) 修复部署在 Nginx Proxy Manager 或类似系统后、且使用非标准端口时的 CSRF rejection——这是任何不使用 80/443 端口托管的人都会遇到的现实 blocker。
@DelightRun——WebUI sessions 的 session_search fix(PR #356)
session_search tool 在每个 WebUI session 中都会静默返回 "Session database not available"。定位到 streaming path 中缺少 SessionDB injection,并完成修复。
@shaoxianbilly——Unicode filename downloads(PR #378)
修复下载带中文、日文或其他 non-ASCII 名称的 workspace files 时出现的 UnicodeEncodeError crashes。实现了符合 RFC 5987 的 proper Content-Disposition header,使用 filename*=UTF-8''... encoding。
@huangzt——Cancel interrupts agent(PR #244) 让 Cancel button 真正中断正在运行的 agent 并清理 UI state,而不只是隐藏 button、同时 agent 继续运行。
@tgaalman——Thinking card fix(PR #169) 修复 thinking card display 中遗漏 top-level reasoning fields 的问题——这是 Claude extended thinking blocks 在 API response 中呈现方式的一个 edge case。
@smurmann——Custom provider routing fix(PR #189) 修复 slash-prefixed custom provider models 的 model routing,这类 models 在 model selector 中会被错误路由。针对 multi-provider setups 中真实 edge case 的精确修复。
@jeffscottward——Claude Haiku model ID fix(PR #145)
在 Anthropic release 后立即发现并修正 Claude Haiku model ID(3-5 → 4-5)——这种社区快速修正能保持 model dropdown 准确。
@kcclaw001——API responses 中的 credential redaction(PR #243) 为所有 API response paths 添加 credential redaction,使 session data 或 error messages 中的 API keys、tokens 和其他 secrets 在到达 browser 前被 masked。
@mbac——Phantom "Custom" provider group fix(PR #191) 移除 model dropdown 中即使没有配置 custom provider 也会出现的 phantom "Custom" optgroup——这是一个虽小但持续让人困惑的 UI noise 问题。
@andrewy-wizard——Chinese localization(PR #177)
为 WebUI 添加 Simplified Chinese(zh)locale。它是最早的非英语 locales 之一,也是 codebase 中使用最多的非英语 locale。
@mmartial——Docker UID/GID matching(PR #237) 添加 Docker 支持,使其可作为匹配 host user 的任意 UID/GID 运行,从而消除 bind-mounted volumes 的 permission issues——对于 host user 不是 UID 1000 的 Docker deployments 至关重要。
@vCillusion——pip package resolution fix(PR #76) 修复 agent dependency resolution,使其优先使用 venv 的 site-packages 中的 packages,而不是 agent directory 本身,避免本地开发时的 shadowing bugs。
@carlytwozero——非 Anthropic providers 的 API key pass-through(PR #78)
修复非 Anthropic /anthropic providers 未将 api_key 传给 AIAgent 的问题——这是一个会静默破坏任何 non-default provider 的隐性 regression。
@mangodxd——Type hints cleanup(PR #115) 在 10 个 files 中添加缺失的 type hints,并修正 9 个不准确的现有 type hints——这类 maintenance work 让 codebase 更容易理解。
@Argonaut790——HTML entity decode + Traditional Chinese locale(PR #239)
修复 renderMd() 中 HTML entities 被 double-escaping 的问题——LLM output 中包含 <code> 时会被再次 escaping,导致渲染为 literal text,而不是预期的 markdown。同一个 PR 还补全了 Simplified Chinese translation(40+ missing keys),并添加完整 Traditional Chinese(zh-Hant)locale。
@indigokarasu——Visual redesign proposal:icon rail + design token system + 7 themes(PR #213)
一个仅 CSS 的完整 UI redesign——proper design tokens(--bg-primary、--text-info、spacing scale)、用 icon rail sidebar 替代 emoji tab strip、一致的 form cards、breadcrumb nav,以及作为 custom properties 的 7 个 built-in themes。该 PR 没有原样 merge,但直接塑造了 v0.50.0 中发布的 design language 和 theme architecture。
@zenc-cp——ReAct loop 的 anti-hallucination guard(PR #133)
向 streaming.py 添加 streaming token buffer 和 post-run message scrub,用于检测并剥离较弱 models 在 inline 中写出的 fake tool execution JSON,而不是正确调用 tools。三层方法:ephemeral anti-hallucination prompt、live token filtering 和 session history cleanup。这个模式影响了后续 streaming.py improvements。
想贡献?代码库布局见 ARCHITECTURE.md,如何运行 test suite 见 TESTING.md。最好的贡献是聚焦、经过充分测试,并解决真实问题——正如此列表中的每个人所做的那样。
Repo
git@github.com:nesquena/hermes-webui.git