常见问题

装之前先看看,卡住了再回来

一问两三句答完。怎么装、有哪些配置项看 README,进阶用法看指南,「为什么这么设计」在仓库的 docs/dev 里。

01信任

它跑在哪儿,谁能连上

我的代码会经过别人的服务器吗?

不会。它是一个 Go 二进制,跑在你自己的机器上,网页嵌在这个二进制里面,浏览器直接连它,没有中转服务器,也没有账号。默认只听 127.0.0.1;要从外面连是你自己配隧道或域名,那条路也只在你的机器和你的手机之间。唯一的出站请求是查更新(GitHub Releases),HERDR_WEB_UPDATE_CHECK=0 关掉之后这个进程一个出站请求都没有

把一个终端挂到网上,安全吗?

这东西等于一个 HTTP 上的 shell,门是按这个前提设计的:一台设备配一次,一次性配对码换一份 per-device 凭据,服务端只存 sha256(这台机器上的 agent 天天读不可信内容,凭据文件被读走是日常风险);配对码只能由坐在机器前的人产生,网页上任何路径都不出码;暴露出去又没 TLS 就拒绝启动;猜码指数退避 + 按 IP 封锁。主口(默认 7788)在代码里就只服务本地网络,要走公网得另开一个口。威胁模型和每条为什么这么设计在 SECURITY.md

手机丢了怎么办?

herdr-web revoke,或者在设置 →「设备」里踢掉,下一个请求立刻 401。凭据绑设备、不绑 IP,所以换网换网段都不掉线,撤销也只撤那一台,别的设备不用重配。

开源吗?收费吗?

MIT,代码在 GitHub 上,npm 包是 @bysir/herdr-web。没有云服务,所以既没有账号也没有订阅。

02用起来

第一天最容易卡住的那几件事

为什么手机上看 diff 没有 commit 按钮?

刻意的,网页这边一律只读。会改仓库的事(add / commit / checkout)留在终端里做。出问题时你要看得见输出,而「一个从公网点得到的按钮」和「在终端里敲一行」的风险完全不对称。看 diff 这块存在的理由只有三件终端做不到的事:折行按词高亮按文件分开看,别的都不该往里加。

为什么网页这边只做了这么几块界面?

默认留在终端里。只有当小屏 + 触屏把 TUI 本身弄坏了(长行不能折、要在几十上百个里挑一个、终端里滚一下得等对面重画一整屏),或者那件事根本不在终端里(相机、系统剪贴板,还有语音和系统通知),才在网页这边另做一层。所以有 diff、文件浏览、面板一览和发件箱,而没有网页版的 workspace 管理器。那件事会改状态,而且在电脑前 herdr 自己那套快得多。判据写在 TUI-VS-GUI.md

在手机上复制粘贴怎么是反的?

因为 herdr 复制到的是跑 herdr 那台机器的剪贴板,不是你手机的。你在手机上框选, herdr 弹「copied 84 chars」,那 84 个字进的是那台 Mac,手机上粘出来还是上一次的东西。所以有两个按钮:📋 取(服务端读机器上的剪贴板交给网页)和 📥 粘(读手机剪贴板、按括号粘贴送进终端)。做不成自动同步:浏览器只在用户手势里给读写剪贴板,定时器里偷偷做是不给的。

发件箱是什么?为什么不直接对着终端说?

它是这个项目的主功能:在平板上说一段、说错的字框选重说就改掉、攒够了整段投进 agent 的输入行。直接对着终端说的话,每停一下就发出去一次、改不了字,而 agent 那个输入框在屏幕上是活的(它自己会重画),你打的字和它画的会打架。

agent 干完活怎么告诉我?

它停下来等你回答、或者刚跑完时,右上角弹一张卡片,卡上带它说的那段话,顶栏 ▦ 上点一个红点;点卡片就跳过去,开一次面板一览红点才灭。想在锁屏、切到别的 app 时也收到,就去设置 →「终端」打开系统通知。那一下必须你自己点,浏览器只在用户手势里给权限弹窗。

锁屏回来就断了,能不能一直连着?

留不住:锁屏时系统把整个页面挂起,WebSocket 跟着断,网页里没有任何开关能拦住这件事。所以改成断了自己连(退避 0.4→8 秒、最多 8 次,页面不可见时压根不试)。重连本来也没有代价,pane 都活在 herdr server 里,敲一下 herdr 就 attach 回去,屏幕和断开前一样。

呼输入法时闪一下,底下几行还被键盘盖住?

呼键盘会让视口重排,而一次重排就是清画布 + SIGWINCH + herdr 清屏重画,几十毫秒的黑。现在那一下用一张冻帧盖住,等新画面画上再淡出。代价是键盘升起的那 300~500ms 里终端还是老行数(底下几行被盖着),换来的是只闪一次而不是三次。视口是一格一格变过来的,每一格都够触发一次重排。细节在 MOBILE.md

03装和连

装在哪、怎么连、连不上怎么办

没有公网 IP、也没有域名,能用吗?

能。同一个 Wi-Fi 下,扫启动横幅上那个二维码就进去了。一共四档:只本机、局域网自签 TLS、走隧道到公网,或者自己的域名 + 真证书。各自要准备什么、授权方式有什么不同,在首页那张表 DEPLOY.md 里。

只在局域网里用,也要配 https 吗?

建议配。http 不是 secure context:剪贴板 API 和 OSC 52 在那儿压根不存在(上面那两个复制粘贴按钮直接废掉),passkey 也用不了。局域网直连那条路更硬。https 页面对 http:// 目标的请求算 active mixed content,浏览器无条件拦死。自签就够用;用 DNS-01 签一张真证书最省事,不需要公网可达,只要能改一条 TXT 记录。

passkey 点下去什么都没发生,也不报错?

多半不是你取消了。WebAuthn 规范故意让几乎所有失败都报同一个错(不让网页试探某台设备上有没有某把 passkey),所以「人划掉了」和「浏览器因为这个页面的证书被跳过过而不肯做」在错误对象上一模一样。先用配对码进去,然后把证书修好;HERDR_WEB_TLS=proxy 时证书是前面那一层的事,那一层不对的话域名、RP ID 全对也按不动。

Windows 上怎么装?

没有原生版,在 WSL 里装:浏览器里那个终端需要一个真 PTY,herdr 自己也走 unix socket。WSL 里就是完整的 linux 版,装完在 Windows 的浏览器上开 http://localhost:7788/ 照样用。

一定要装 herdr 吗?

默认一连上就进 herdr,产品的一大半(面板一览、投稿到 agent 的 pane、提示卡)都是围着它转的。不想要就 HERDR_WEB_ONCONNECT= 留在普通 shell 里,那时它就是个在手机上能用的浏览器终端。

它会不会跟正在跑的 agent 抢那台机器?

这条是刻意省着来的:顶栏「改动」那个绿点12 秒一拍、页面不可见时不问,服务端还压了 2 秒缓存;补丁页滚到跟前才读、一次只读一个文件;跑 git 一律带 --no-optional-locks,不然 git status 会去抢 .git/index.lock,而失败落在正在同一个仓库里干活的 agent 头上,这边一点症状都看不到。

合上笔记本出门,agent 就停了?

合盖是一个显式的睡眠请求caffeinate 那种 power assertion 盖不过去。推荐做法(和不装 app 的那条命令、它的四个坑)在这篇里:合上盖子出门,让 Mac 上的 agent 继续跑

没答到你那条,去 issues 提一句。

Render diagnostics