在地铁上也能指挥你的 Agent:社区 WebUI 上手记

你在回家的地铁上,突然想起早上那个定时任务到底跑没跑成。掏出手机,翻邮箱没有、翻 Telegram 也没配,只能等回家开电脑。等真的坐到书桌前,那点想确认的念头早被晚饭冲散了。
问题不在于 Hermes 不能远程用——而是「远程」这件事,大多数人懒得为它折腾一套隧道加前端。社区里有个项目把这步压到了三条命令:Hermes WebUI,约 1.8 万 star,Python 后端加原生 JS 前端,没有构建步骤、没有打包器,用你已有的 Hermes 配置和模型就能跑。
它是什么,为什么值得装
打开之后是经典的三栏:左边是会话列表和导航,中间是聊天,右边是工作区文件浏览器。模型、profile、工作区这些开关常驻在输入框下方,一个圆环实时显示上下文占用。所有设置和会话工具收在侧边栏底部的「控制中心」里。
它最大的特点是与 CLI 尽量 1:1:终端里能做的事,界面里基本都有。会话的置顶、归档、项目分组,技能列表的搜索/预览/编辑,Memory(MEMORY.md、USER.md)在线改,定时任务的创建、暂停、运行历史和完成提醒,多 profile 的切换与克隆,还有 /compress、/model、/new、/theme 这类斜杠命令的自动补全。
手机上做了响应式:小屏时侧边栏变成抽屉,触控目标不小于 44 像素,文件浏览从右侧滑出。它还是个可以安装的 PWA——加到主屏之后,用起来更像一个 App 而不是一个网页。
三条命令装起来,先在本机跑通
git clone https://github.com/nesquena/hermes-webui.git hermes-webui
cd hermes-webui
python3 bootstrap.py
bootstrap.py 会自己找活干:检测本机有没有 Hermes,没有就调官方安装脚本;准备一个带依赖的 Python 环境;启动服务并等 /health 通过;然后打开浏览器,把你带进首次使用的向导。不想它开浏览器就加 --no-browser。
如果你更习惯用脚本管理守护进程,仓库里还有 ctl.sh——它对自托管的虚拟机最友好,因为不依赖 fuser 或 pkill:
./ctl.sh start # 后台守护进程,PID 写到 ~/.hermes/webui.pid
./ctl.sh status # PID、运行时长、绑定的 host/port、日志路径、/health
./ctl.sh logs --lines 100 # 看 ~/.hermes/webui.log
./ctl.sh restart
./ctl.sh stop
服务默认监听 127.0.0.1:8787,也就是说:先在本机把会话跑通,再去想远程。健康检查随时可以手验:
curl http://127.0.0.1:8787/health
远程和手机:两条路,都不需要你开放端口
最稳的是 SSH 隧道。 服务只绑本机,你在外面通过隧道访问:
ssh -N -L 8787:127.0.0.1:8787 user@your-server
之后在本地浏览器打开 http://127.0.0.1:8787 就行。你甚至不需要装 SSH 客户端在手机上——很多手机上的终端 App 也能建隧道。
更省事的是 Tailscale。 把服务器和手机加进同一个 Tailscale 网络,再让服务监听全部地址:
HERMES_WEBUI_HOST=0.0.0.0 HERMES_WEBUI_PASSWORD='换成你自己的密码' ./ctl.sh start
然后手机浏览器访问 http://<服务器的-tailscale-IP>:8787。注意后半句的两个条件:必须同时设密码,而且这台机器的 8787 端口只应该存在于 Tailscale 网络里,不要顺手在云厂商安全组里放行。
安全:默认对局域网零摩擦,远程则要自己上锁
这个项目的安全设计思路很诚实:密码认证默认是关闭的,因为本机访问本来就不需要。要远程用,自己打开:
HERMES_WEBUI_PASSWORD环境变量,或在设置面板里设;- 支持 passkey / WebAuthn:先用密码登录,然后在设置里注册通行密钥;注册至少一个之后,就可以把密码删掉,改成纯 passkey 登录(密码保留为恢复路径);
- 支持 OIDC 单点登录:
webui_oidc.issuer、client_id、allow_claim、allow_values四个都配齐才会启用,配置残缺时启动会打印警告; - 登录后是 HMAC 签名的 HTTP-only cookie,24 小时过期;响应带安全头;限制 20MB 请求体;外链资源带 SRI 校验。
有一点值得单独提醒:如果你用反向代理,不要用代理的 basic auth。PWA 更新时要抓 service worker,代理认证会把它拦掉,安装过的应用更新后会白屏。作者在文档里给了恢复步骤——这也是为什么他们更推荐 Tailscale 或隧道。
顺带一提,如果你本来就在折腾远程访问,OAuth 走 SSH 那次踩坑记录可能会帮你省几十分钟。
边界在哪里
Windows 原生不支持 bootstrap。用 Linux、macOS 或 WSL2;社区有人整理过 Windows 原生的替代方案,但那条路要自己承担。
聊天默认不走外部 API server。WebUI 是在自己的进程里直接跑 Hermes agent,读你的 HERMES_HOME 配置。如果你已经有别的 OpenAI 兼容端点,有两种用法:一是把它当成自定义 provider 加进设置里(base_url 指向它,带 token);二是通过 HERMES_WEBUI_CHAT_BACKEND=gateway 把聊天转到 Hermes Gateway 的 API server。第二种目前还没做到完整的 agent-loop 委派,仓库里还挂着对应的 issue——也就是说它能用,但别指望和本地跑的体验完全一致。
手机客户端的替代品还早。社区里确实有别的路子:只有规格文档、还没实现的手机 App(hermes-lens 这个仓库 9 月 19 日才建、目前只有 PRD),也有 Android 客户端的早期尝试。相比之下,WebUI 是眼下成熟度最高、维护最活跃的那条。我们站内的生态条目里也记了它的基本信息。
一个半小时之后
回到那个地铁上的场景:装上 WebUI、开好 Tailscale、把 PWA 加到主屏。下次你想确认定时任务时,掏出手机点一下就行——还能顺手在手机上让它「把失败的构建日志整理成三条结论发我」。
要先把 Hermes 本身配起来,看安装指南;想让桌面端和远程客户端接上同一个后端,看 gateway 命令参考。远程用 agent,本来就该是件随手的事。