web-edit 0.1a0:让 AI 代理开一个网页编辑器,手机也能改凭证文件

Simon Willison 的 web-edit 用小工具证明:敏感文件可以绕开 LLM 上下文,由代理起服务、人走 Tailscale 直接改。
web-edit 0.1a0 是 Simon Willison 发布的一个极简 Python Web 文件管理工具,可在指定文件夹内浏览、上传、编辑、下载和删除文件,设计上通过 Tailscale 私有网络从手机访问。它的动机非常具体:在用 Codex Remote 开发时,需要编辑 credentials 文件,但不希望密钥进入 LLM 上下文;于是让代理负责启动服务,人通过独立通道直接读写敏感文件。编辑器选择 CodeMirror 6 而非 VS Code 同款 Monaco,原因是 Monaco 的移动端体验仍不理想。工具界面覆盖文件列表、上传队列、内联预览与编辑,本身只是实验品,但它示范了三个可复用的思路:把敏感数据留在代理视野之外、用网络隔离替代复杂鉴权、把移动端优先落实到具体技术选型。
当你在手机上用 AI 编程代理(coding agent)推进项目时,最尴尬的场景之一是:你想改一个凭证文件,却不想让这串密钥在 LLM 的上下文里来回传一遍。
Simon Willison 为这个问题写了一个小工具——web-edit 0.1a0。它的定位很窄:在一个文件夹里提供一个 Web UI,用来浏览、上传和编辑文件。
它想解决的具体场景
按 Simon 自己的说法,他当时正在手机上用 Codex Remote 开发一个项目。中途需要编辑某个 credentials 文件,但他不希望这些凭证内容被送进 LLM 做"中转"。
于是他的做法是:让 Codex 配合 GPT-6 Astra Extra High 生成一个 Python Web 应用,这个应用提供文件夹内文件的浏览与编辑界面,设计上跑在 Tailscale 网络里——代理把服务启动起来后,他可以直接通过 Tailscale 从手机编辑文件,凭证不经过模型。
这里的关键不是"又一个在线文件管理器",而是代理负责起服务、人来负责改敏感文件这种分工。凭证从人眼到磁盘,中间没有经过模型上下文这一环。
AI 编程代理(coding agent) 指能够自主读写代码文件、运行命令、迭代修改的 LLM 应用,典型代表有 Codex、Claude Code、Cursor Agent 等。它们的共同点是:代理的一切感知与动作都会被序列化进 LLM 的上下文窗口,包括它读到的文件内容、它执行的每条命令。这意味着一旦代理读取了一个含密钥的文件,这些字符就进入了模型推理链路,可能被记录、缓存或出现在日志与后续会话中。因此像 web-edit 这类工具的思路,本质是人为地把「代理可达的文件系统」与「人类可达的文件系统」拆成两条通道,让敏感数据绕开上下文这一环。
Tailscale 是基于 WireGuard 的零配置网状 VPN。它给每台设备分配一个 100.x.y.z 段的私有 IP,并自动完成 NAT 穿透和加密,设备之间像在同一局域网里。对个人开发者来说,它最重要的价值是:不用配置公网端口、TLS 证书和登录系统,就能让手机安全访问家里或云上机器上的服务。这正是 web-edit 敢做成「无鉴权极简工具」的前提——访问控制被委托给了网络层。
界面长得什么样

文件列表页的顶层标题是 "WORKSPACE",下面是 "Files",右上角排着 "Refresh"、"Upload files" 和深绿色的 "New file" 三个按钮。面包屑显示当前路径,表格列出 "Name / Size / Modified",每个文件后面跟 "Download ↓" 和 "Delete"。
表格下方有一句操作提示:小于 2 MB 的图片会内联显示,选中文本文件则进入编辑。再往下是一个 "UPLOAD QUEUE" 面板,带目标文件夹输入框、虚线拖放区,以及上传前需要给每个文件设定路径和文件名的说明。
整体是典型的极简工具风:没有多余的概念,就是浏览、下载、上传、编辑、删除这几件事。
编辑器为什么选 CodeMirror 而不是 Monaco
有经验的开发者第一反应可能是:为什么不用 VS Code 同款的 Monaco?
Simon 的答案很直接:他本来打算用 Monaco,但 Monaco 目前在移动端的体验还不够好。所以他改用 CodeMirror 6。
这个取舍值得记一下。Monaco 桌面端体验强大,但在触屏小屏幕上的可用性一直是短板;CodeMirror 6 更轻,在移动端上更顺手。对于一个"我主要是在手机上用"的工具来说,这个判断比功能清单更重要。
Monaco 是微软从 VS Code 中剥离出来的编辑器内核,功能极完整:智能补全、多光标、内置 diff、语言服务协议接入等。代价是体积大(打包后常在数 MB 量级),且交互大量依赖鼠标悬停、右键菜单和键盘快捷键——这些在触屏上都要靠长按模拟,体验割裂。CodeMirror 6 则是重写后的模块化架构,核心很小,按需引入语言包和扩展,事件模型对触摸、虚拟键盘和 IME 输入更友好,因此被广泛用于移动端与嵌入式代码编辑器。
真正值得记住的不是这两个名字,而是判据:当目标平台是手机时,编辑器的体积、触摸目标尺寸、软键盘行为比功能清单更重要。Monaco 桌面体验更好,但如果用户主要在手机上改几行配置,那么 CodeMirror 的「够用且顺手」就是更优解。
这个工具的启发
web-edit 本身只是一个 0.1a0 版本的实验品,但它的思路值得借鉴:
- 把敏感数据留在代理的视野之外。 代理能启停服务,但读写凭证这一步交给人,通过独立通道(这里是 Tailscale)完成。
- 用网络隔离代替权限系统。 不做复杂的鉴权,直接依赖 Tailscale 这类私有网络作为访问边界,工具因此可以做得非常简单。
- 移动端优先要落到具体技术选型上。 "移动端优先"不是口号,它直接决定了你选 CodeMirror 还是 Monaco。
如果你也在用 AI 代理做远程开发,又经常遇到"不想把密钥喂给模型"的时刻,这类小工具的模式可能比工具本身更有参考价值。
相关推荐

uGAP:统一100+非洲地理数据集的AI平台
uGAP是开普敦大学团队开发的非洲地理空间AI平台,统一120余个非洲数据集并提供Python SDK,支持数据发现、处理与模型训练一站式工作流,已用于气旋洪水制图等实战场景。

Cursor能控制你的电脑了:AI代理可驱动桌面应用测试
Cursor 新增桌面控制能力,AI 代理可驱动 iOS 模拟器等桌面应用测试自己构建的功能。本文分析这一更新对开发工作流的影响、技术实现可能路径及可靠性考量。

Vibecoding自研推理引擎:理想丰满,现实骨感
Reddit开发者分享Vibecoding自研推理引擎的真实经历:用WebGL2和GLSL在浏览器跑GGUF Q4模型,却陷入tokenizer调试地狱。本文分析浏览器端LLM推理的工程难点,以及为何直接clone llama.cpp是更理性的选择。