对着 agent 说话,
平板也是生产力
不用装 app。安卓、苹果、平板,扫个码就连上。
不另做一个手机版:网页里是整个 TUI,键盘那套操作一个字都没变。 补的只是手指够得着的那一层 —— 一个真正的输入框、一排自己排的键、 一块能挪开输入法的面板。
npm i -g @bysir/herdr-web需要一个已经在跑的 herdr。MIT,源码在 GitHub。
Cloudflare Tunnel、Tailscale、frp —— 穿透搭得越好,安全风险就越大。
穿透只负责把包送到,不做鉴权 —— 连上来的是谁,它不问。
浏览器历史、一张截图、一份 frp 配置、tailnet 里任何一个节点。泄露之后,没有任何一步会再拦你。
所有设备共用一份凭据,就没法只踢那一台。
所以鉴权这一层 herdr-web 自己做,按「这条路可能已经不安全」来做:
一次性配对码换一份 per-device 凭据,放 HttpOnly cookie。URL 里不留秘密。
磁盘上没有任何能直接登录的明文 —— 防止坏 agent 把你的凭证发出去。
一条命令踢掉一台设备,下一个请求就 401。

为什么推荐使用 passkey
- 凭据就是一份 cookie —— 谁拿到,谁就是你
- 泄露之后一直有效,直到你想起来撤销
- 没有任何一步会再问一次「还是你吗」
- 私钥锁在设备里出不来,服务端只存公钥 —— 被读也没用
- 默认每 24 小时重验一次,cookie 就算泄露,窗口最多一天
- 签名绑着 origin,钓鱼站点拿不到能用的那一份
所以框里那段和终端的输入行是双向的:终端那边多出来的字,框里跟着有。 框本身也是终端给不了的东西 —— 终端是字节流,没有选区,输入法只能一路往里灌字符; 落在一个真正的可编辑框里,才能说完一整段再投,说错的字框选重说就改掉。

默认跟着 herdr 当前 pane,也能在下拉里钉死一个。
先清空远端输入行再提交。Enter 只换行 —— 说到一半不会被回车打断。
把远端输入框里已有的内容抓回来编辑,默认 500ms 一拍。
存到跑 herdr 那台机器上,把绝对路径插进提示词,agent 自己去读。
herdr 的快捷键全靠 ^B 前缀,所以键做成一条自己排的横条 —— 排什么、排几个都归你。 按键存在服务端,手机 / 平板 / 电脑共用一份,网页上改完三台一起变。
ctrl+b c 一下点出来。具名键、组合键、原样文本都行。
点一下亮起,再敲个字母就发出组合键 —— 手机 keydown 不可靠,这层做在数据流上。
关 pane、关标签、/clear 默认就带。软键条上键挨得近,误触没法撤销。
一键灌进「我的按键」,之后每个都能改名字、改谱、改宽度。
herdr 复制到的是跑 herdr 那台机器的剪贴板,手机上哪儿都粘不出来。📋 取把它拿到手机剪贴板,📥 粘反过来 —— 浏览器只在点击里给剪贴板,所以只能是两个键。

软键条发的是按键,而按键只会说「下一个 tab」。 想直接跳到 w5:p3,说不出来,只能一步步走过去 —— 中间每一屏, 正好是手机上根本读不了的那个平铺状态。

电脑上你习惯分屏 —— 一屏铺四个 pane,扫一眼就知道哪个在干什么。 同一个会话切到手机上,那四格每格只剩巴掌大:字看不清,更别说在里面操作。 所以点面板里那一行,跳过去的同时就把它铺满整屏,不用你再手动放大一次。
等你回答 > 跑完了 > 在跑 > 闲着。红点=等你,绿=跑完了,黄=在跑,闲着不上色。
卡上带 agent 说的那段话 —— herdr 的接口里没有这个字段,是读屏抽出来的。点一下跳过去。
顶栏和软键条那个键上各一个,写着还有几条没看。开一次面板就算看过,刷新页面不丢。还能发系统通知,页面切到后台也收得到。
一个 tab 分成两个 pane 时,两行的标签和路径一模一样,只有 id 不同。
点完看的还是同一个 herdr 终端,键盘那套操作一个字都没变。 这张表只管带你过去,不在上面改东西。
agent 说「图生成在 /tmp/plot-3.png」—— 终端里那行路径就是个链接,点一下图就开了。 想翻文档、翻别的图,点顶栏的 📁。


能打开这页的人已经有一个登录 shell,白名单挡不住他、只会天天挡路(agent 往 /tmp、~/Downloads 写东西是常态)。要边界就配 FILE_ROOTS。
按魔数认类型,改后缀骗不过去。
SVG 是能跑脚本的图片。放进 <img> 就落进规范的 secure static mode —— 脚本不跑、外部资源不加载,而且这条不看任何响应头,前面的代理把 CSP 剥了也还在。
同源的 HTML 就是一个能调接口的跳板:agent 写个 html,你点开就把 herdr 交出去了。
把绝对路径插进发件箱,和传图完全同一个模型 —— 让它自己去读那个文件。
为了适配平板,软键条做成能拖的 —— 配系统的悬浮键盘正好, 横屏竖屏都好用。

平板横过来是一种用法,竖过来是另一种。两套分开存,调横屏那套不会动到竖屏那套。
把系统键盘捏成悬浮那种(游戏键盘),挪到顺手的一边,中间让给终端。软键条照常在 —— 打字、语音、Ctrl / Esc / 方向键,三样同时在手边。
能滚、能点、能拖 pane
| 单指滑动 | 按行高换算成滚轮上报发给程序 |
| 单击 | 发一次鼠标点击(点 pane、点 tab 都好使),当场就发、不弹键盘 |
| 长按拖动 pane | 抓住不松手(≈380ms),之后滑动就是拖 —— pane 边框靠这条挪。 |
不用域名、不用公网,同一个 Wi-Fi 下就能连
代价只是每台设备第一次点一下「继续访问」。嫌这一下麻烦, 加个域名走 C;出了门也想连,再加个公网入口走 D。 要手机连就必须有 TLS,herdr-web 已内置 ACME 走 DNS-01 认证 —— Cloudflare、AWS Route53、阿里云、腾讯云、华为云、DigitalOcean 六家都能签。 所以 NAT 后面、域名指到内网地址,照样签得出受信任证书。
| 档 | 场景 | 怎么用 | 要准备什么 | 授权方式 |
|---|---|---|---|---|
| A | 只本机 | 访问 127.0.0.1 | 不用准备什么 | 配对码(IP 下没有 passkey) |
| B | 局域网 · 用 IP | 访问局域网 IP | 不用准备什么,第一次点一下「继续访问」 | 配对码(IP 下没有 passkey) |
| C | 局域网 · 用域名 | 访问域名 | 一个域名 + DNS 的 API token | 第一次配对码,后续 passkey |
| D | 公网 | 在哪儿都访问域名 | 域名 + DNS token,外加 Cloudflare Tunnel / Tailscale / frp 之一 | 第一次配对码,后续 passkey |
看证书、点一下续期、出配对码、踢设备,全在一个公网上不存在的口上。
从公网那个地址进来时,网页探一下能不能直接连到这台机器 —— 能就切过去,按键不再绕一趟 VPS。交接走的是单独的一次性短令牌(60 秒、只能在直连口兑),踢掉上级会级联撤销。
手机切前后台、地铁里断一下,回来自己接上,不用去点那个「连接」。
为了安全,默认不开启公网访问,需要显式设置 HERDR_WEB_EXPOSED=1。
安装并使用
npm i -g @bysir/herdr-web
herdr-web只听 127.0.0.1:7788,连上自动敲 herdr。管理页在 7789。
curl -fsSL https://raw.githubusercontent.com/zbysir/herdr-web/master/install.sh | sh装到 ~/.local/bin。强制校验 sha256 —— 这东西后面挂着一个登录 shell。
HERDR_WEB_HOST=0.0.0.0 herdr-web自动自签证书,终端里画一个二维码给手机扫。
herdr-web service install
herdr-web updateuser 级:macOS launchd / Linux systemd。配置是装那一刻从 shell 抄进去的 —— 改完要重新 install(幂等,覆盖 + 重启)。
地址栏里加一段路径就是另一个 herdr session(/work、/scratch)—— 存两个书签就是两套工作现场,关掉浏览器再回来还在。
Windows 没有原生版,在 WSL 里装 —— 浏览器里那个终端要一个真 PTY。 全部配置项(只认环境变量)看 README。