让 Claude Code 在家跑,我在外面用手机盯着:做一个开源工具踩过的几个坑

标签:人工智能、Rust、AI编程、开源 分类:人工智能

起因

用 Claude Code、Codex 跑大一点的任务,最烦的不是它慢,而是它跑到一半停下来问你一句:要不要执行这条命令?选方案 A 还是 B?你不在电脑前,它就一直等着。出门吃个饭回来,发现它二十分钟前就停在那儿了。

SSH + tmux + 组网能解决,但手机上敲 SSH 实在难受:没有 Esc、Ctrl 不好按,Claude Code 的界面一重绘就满屏乱跳。

所以我做了看看(Looklook) :装在自己电脑上的一个后台服务,把这台电脑上的终端和 AI 会话放进一个网页,手机浏览器打开就能看进度、回一句话、贴张截图。客户端完整开源(AGPL-3.0)+端到端加密+所有数据存本地:github.com/imythu/look...

先说怎么用

bash 复制代码
curl -fsSL https://looklook.dev/install.sh | sh

装好后在本机打开 http://127.0.0.1:1234,不用注册。在"访问控制"里开启局域网访问,同一 Wi‑Fi 下手机也能打开。Windows、macOS 有桌面版。

它工作在终端这一层:Claude Code、Codex、Gemini CLI、OpenCode、Kimi、Qwen Code,或者 htop、vim,只要能在终端里跑就行。它不碰 AI 助手的登录,订阅、API Key、国产 Coding Plan 都照常用。

在手机上能做的事:

  • 完整终端,带 Esc / Tab / Ctrl / 方向键按键栏
  • Claude Code、Codex 的输出整理成对话卡片,等你确认时点按钮就行
  • AI 停下来等你时,推到飞书、企业微信、钉钉、Bark、ntfy
  • 粘贴截图直接发给 AI
  • 终端跑在内置 tmux 里,关网页、断网、重启应用,会话都还在

下面讲几个做的过程中踩过、比较有意思的坑。

坑 1:ttyd 自带的前端,Claude Code 一重绘就闪

终端网页最早直接用的是 ttyd 自带的页面。问题是 ttyd 上游还停在 xterm.js 5.5,不支持同步输出(DEC 2026)。Claude Code、Codex 这类 TUI 每次重绘都是"清屏 + 重画",没有同步输出,浏览器就会把中间状态画出来,于是满屏闪。DOM 渲染器在手机上也慢。

最后把 ttyd 的前端移植了一份出来,升到 xterm.js 6:

  • 打开 WebGL 渲染,WebGL 上下文丢了就自动退回 DOM 渲染器
  • tmux 配置里打开 terminal-features xterm*:sync,让同步输出能穿过 tmux
  • 顺手支持了 OSC 9;4 进度条和 OSC 8 超链接

还有个小坑:xterm 6 的 .xterm-viewport 背景写死成 #000,浅色主题下终端外面会多一圈黑框,只能用 MutationObserver 把内层背景色同步过去。

坑 2:tmux 会吞掉 ZMODEM,rz/sz 用不了

很多人习惯用 rz / sz 传文件。可是会话放进 tmux 以后,ZMODEM 的控制字符 \x18 会被 tmux 过滤掉,传输根本开始不了。

解法是不走 ZMODEM:前端识别终端里 rz / sz 打出来的提示,弹出自己的上传/下载面板,文件走 HTTP 传到终端当前所在的目录。上传按 8 MiB 分片,避开中转的超时和单请求大小限制。另外内置了 trzsz(trz / tsz),它本来就是为了穿过 tmux 设计的。

坑 3:远程连接用 WebRTC,但 libjuice 不支持 ICE 重启

在外面访问时,浏览器和电脑之间建一条 WebRTC 加密通道:能直连就直连,不行再经 TURN 转发,中转只能看到密文。客户端用的是 libdatachannel 的 Rust 绑定。

手机网络很不稳定:切 Wi‑Fi / 4G、锁屏、切后台都会断。标准做法是 ICE restart,但 libdatachannel 底下的 libjuice 直接不支持 ICE restart(源码里写着 "ICE restart is not supported")。

最后换了个思路,在应用层做续传:

  • 连接断了,客户端把终端会话挂起 60 秒,不关
  • 浏览器重新建一条 WebRTC 连接,带上会话 key 和"我已经收到第几个字节"
  • 客户端从这个位置把没发的输出补上,用户看起来就是卡了一下

另外两个网络坑:

  • 有的网络把 UDP 全封了,WebRTC 连不上,就在本地起一个 UDP→TCP 的转发,走 TURN over TCP
  • libjuice 的 ICE 角色冲突处理有 bug,导致浏览器经 TURN/TCP 时连不上,给它打了补丁

坑 4:把 AI 的 TUI 读成对话卡片

手机上看终端还是累,所以做了对话界面:把 Claude Code、Codex 的回复整理成卡片,等你确认时直接给按钮。

难点在"现在 AI 处于什么状态":在干活?在等你输入?弹了选择框?一开始用"底部横线下面不超过 4 行"这类规则判断,结果 Claude Code 新版本把后台 agent 列在输入框下面,一开 3 个以上 agent 就判断错了。

现在的做法:

  • 只认输入框的形状 :上横线、❯ 开头的输入行、下横线,下面有什么都不管
  • 读不懂的界面不乱猜:画面连续 10 秒不变,就只给一个轻提示,不推送"等你选择"
  • Codex 的历史消息里也可能出现 › 1. ...,只认最后一行,避免当成选择框

还有个时序坑:Codex 的 app-server 收到消息后,大约 10 秒才把用户消息写进记录(在等 MCP 启动之类的事)。于是用户发完消息,界面上 10 秒什么都看不到,以为没发出去。最后前端先把消息显示出来,等真正的记录到了再换掉。

客户端代码都在仓库里,安装包由仓库里的 GitHub Actions 构建,带 SHA256 校验。

最后

这个项目基本是我一个人加 Claude Code 写出来的:开源这一个月发了九十多个版本,很多功能是用户在群里提了,当天就加上。

如果你也经常让 AI 跑任务、自己却得出门,欢迎试试,有问题直接提 issue,或者加 QQ 群 1029871265 交流。觉得有用的话点个 ⭐,这是别人发现它的主要途径。

GitHub:github.com/imythu/look...

相关推荐
躺柒32 分钟前
读数据安全架构设计与实践20安全政策文件体系(上)
大数据·人工智能·安全·数据安全·安全架构·安全体系
用户3025147280641 分钟前
从对话到行动:用 AIUI 构建「意图驱动」的隐形界面——「言值」AI 表达教练开发实录
人工智能
武子康1 小时前
工作流 JSON 没变,为什么 ComfyUI 更新后仍可能跑出不同结果?
人工智能·agent
海螺_AIHCC1 小时前
Agent 能自己调工具之后,安全就不该写在提示词里:一个 200 行拦截器的工程实践
人工智能
艾迪的技术之路1 小时前
16k 条慢查询,128 张分表,我这么解决
后端·github
加宝的起点雷达1 小时前
三个定时任务被删那天,系统一声不吭
人工智能·后端
用户321757668341 小时前
ComfyUI AI 漫剧本地量产流水线搭建教程|8G 显存本地部署、分镜生成、角色一致性、视频生成
人工智能
荆棘宠物1 小时前
大模型 API 流式输出的工程细节:SSE 分帧、中断与重试边界
人工智能
神鹰手哥_起飞版1 小时前
别让大模型写 HTML:一个省 token 的分工实验
人工智能