⌕ ESC
↑↓ 选择↵ 打开esc 关闭⌘K 唤起
← 主页 NO.148
专栏 · Agent 工程手艺 ›
第 148 期 · AGENT 工程 · 收录于 2026 年 8 月 16 日

Gadgets:真正安全的个人应用 vibe coding——Kenton Varda(Cloudflare)

KV
Kenton Varda · AI Engineer
Agent 工程AI 产品
视频 18:53 原文约 1.6 万字 预计阅读 15 分钟 来源视频 ↗ 中英对照全文
原平台热度 YouTube ↗
4,785观看
96赞
2.0%点赞率
11评论
62.7万频道订阅
数据截至 8 月 27 日
TL;DR · 三句话
  1. 一核心论点:个人化的 AI codegen 会打破传统云基础设施。今天的软件是"开发者在象牙塔里做好、往下发给所有人跑同一份钦定版本",用户的功能请求被产品经理"一股脑丢进 Jira,从此再没人见过它们";要让每个人当场把 app 改成自己要的样子,这套底座必须换掉。 → 详细
  2. 二他的答案叫 Gadgets——不是"把 app 部署成网页",而是一套像 Google Docs 的办公套件:里面装的不是文档而是 gadget,每个 gadget 是一个带代码的应用实例,可以 vibe code 出来、可以导出成 blueprint 分享;分享与权限由平台统一实现,"让 gadget 自己根本没机会把这块做错"。 → 详细
  3. 三标题里的 "actually safe" 来自把 AI 写的代码彻底关起来:前端跑在 null origin iframe 沙箱 + 内容安全策略里,唯一出口是向父窗口 postMessage;后端是沙箱化 worker 里的 durable object,两头都不能跟外界通信——所以哪怕真有 XSS 也泄不出东西,"基本上,这段代码里你不可能写出一个有杀伤力的安全漏洞"。 → 详细
01

真正的敌人:用户的功能请求死在 Jira 里

  • 讲者开场就把今天的软件生产链画成一张图:一个坐在象牙塔里的开发者做出 app,往下发给用户;很多人满意,但总有人说"这个 app 得再加几个功能才够我用"。用户去求开发者——"伟大的开发者啊,求你把我这个需求做了吧,没有它你这 app 简直没法用"——然后开发者的代言人、产品经理收下这些需求,"一股脑丢进 Jira,从此再没人见过它们"。这是全场第一个笑点,也是整场演讲的出发点。 → 详细
  • 偶尔需求会被捞出来:产品经理看到某条说"哎,这个我也想要",于是它进了路线图,开发者动手做。但结果同样不好——开发者实现了一堆"每个只有一小撮用户在用"的功能,每个都往代码里塞一堆 if 判断,代码库越来越乱,而且这些功能做起来"都特别无聊"。 → 详细
  • 这是个双输结构:用户拿不到功能,开发者做着不想做的功能还把代码搞脏。讲者的矛头不指向流程或优先级排得不好,而指向更底下那个前提——一份代码要同时服务所有人。 → 详细
02

plugin 系统的经典死循环:为了以后能快,先停三年

  • 开发者的标准解法是"重写":搞一套带 plugin(插件,即把非核心功能做成可插拔的小模块)系统的新架构,这样每个功能都能干净地挂上去,内核保持清爽。听上去无懈可击。 → 详细
  • 于是新需求一律被挡回:"这些功能现在还做不了,得等 plugin 系统。有了 plugin 系统之后做起来会容易得多,现在硬做只会拖慢进度,反正后面还得重做一遍。"这套说辞在任何产品团队都成立——这正是它危险的地方。 → 详细
  • 结局:"几年过去了,新架构还没就绪,功能一个都没实现",用户开始问"他们到底在干嘛?这开发者是不是把自己的产品放弃了?"——所有人都很沮丧。本来是逃生舱的重构,先把船凿沉了。 → 详细
03

AI 给的另一条路:功能由用户当场生成,而不是排队等

  • 替代方案很简单:开发者只做出 app 的第一版交给用户;用户需要新功能时,"可以直接让自己的 AI agent 单独为自己写这个功能、加进 app 里"。 → 详细
  • 三方同时受益:"每个人都能拿到自己需要的功能,谁也不用被别人的功能拖累,开发者还能把核心 app 保持得干净漂亮。"换句话说,长尾需求不再挤进同一份代码,而是各自留在各自的实例里——这就把"排优先级"这件事从根上绕过去了。 → 详细
04

为什么今天做不到(一):Apple/Google 的门,和 Web 这个后门

  • 过去 15 年 Apple 和 Google 把自家系统封得死死的,"封到现在几乎只剩五家公司还能做移动 app"。他调侃"在美国,买把枪都比让自己的手机装个未签名的软件容易",还编了段 Google 客服式对白:"你看着情绪不太对,先回家冷静冷静,要是 24 小时之后你还想装那个未签名的软件,再回来找我们聊。" → 详细
  • 绕过去的办法是 Web:人人都能做自己想做的东西,"而且事实证明并没出什么事——并不是 Apple 和 Google 天天吓唬我们的那种安全大灾难"。这是他后面整套安全论证的前提:开放不必然等于危险。 → 详细
05

为什么今天做不到(二):云架构朝错的方向跑了 25 年

  • "过去 25 年的云架构,我们一直在朝错的方向狂奔。"你分发一个 Web app,是把它跑在自己的服务器上,用户发请求过来,"那唯一一份、被『钦定』的版本,为每一个用户运行"。 → 详细
  • 这个设计对开发者极方便——能确保所有人都在最新版、都在同一个版本上;代价是"用户没法定制自己的 app"。在这套架构里,可控与可定制天然对立。 → 详细
  • 去年 vibe coding(用自然语言让 AI 直接生成能跑的应用)火起来,冒出一大堆平台,绝大多数瞄准 Web app,"因为这是最好做的";但"它们瞄准的都是现有的这套基础设施,而这条路其实根本不对"。这就是开场那句核心论点的落点。 → 详细
06

讲者是谁:Cloudflare Workers 的作者

  • Kenton Varda,2017 年加入 Cloudflare 时启动了 Workers 项目,"到今天我还是主力工程师"。Workers 现在是一个 serverless(无服务器,即开发者只写代码、不管机器和扩容)应用托管平台,"有数百万开发者,每天处理数万亿次请求"。今天讲的是他在 Workers 之上做的一个副项目。 → 详细
07

Gadgets 是什么:不是部署网页,是一套"办公套件"

Gadgets 现场演示:创建一个 gadget ▲ 图注:现场演示:在 Gadgets 里新建一个小应用的界面。(本片除开场那张幻灯片外全是屏幕演示,360p 截帧只能看清版式、看不清小字,细节请看原片。)

  • 关键类比:别把它想成"把 app 部署成一个网页"的 vibe coding 环境,要想成 Google Docs——你打开,里面有几百上千个文档,打开一个、编辑、分享给别人。"这里是同一回事,只不过里面装的不是文档,而是 gadget。每个 gadget 都是一个带代码的应用,代码可以各不相同。" → 详细
  • 他自己在用的三个真实 gadget:一个协同白板 app("这是一次 prompt 出来的");一个筛西班牙语邮件的小工具("我会收到很多西班牙语邮件,说来话长,我不懂西班牙语");一个帮他整理 GitHub 上待他 review 的 pull request 的工具。全是从零 vibe code 出来的私人小工具,不是给别人用的产品。 → 详细
  • blueprint 机制:有人做了个 gadget 觉得有用,就给它做一份 blueprint——"其实就是把代码导出来、不带数据"——分享出去,别人从这份 blueprint 实例化出自己的 gadget。代码可传播、数据不跟着走,这条线划出了"分享一个应用"和"分享一份文档"的区别。 → 详细
  • 平台里已有的办公类 app:文档编辑器、看板、幻灯片工具。幻灯片工具是 Cloudflare 的产品经理同事 Philip 做的,讲者说他记得对方"一个下午就 vibe 出来了",顺口调侃了一句"当然,现在的产品经理个个也都是高产工程师"。 → 详细
08

一个实例=一份文档:把分享和权限从 app 手里收走

  • 反直觉的切法:实例化幻灯片 app 得到的不是"一个幻灯片工具",而是一份 deck;"如果我要多份 deck,就实例化多个 gadget,一份一个"。 → 详细
  • 为什么要这么切?因为所有 gadget 都可分享、可协作,而"分享模型是由平台实现的,不是由 app 自己实现的"——点开就是一个很像 Google Docs 的分享框,可以生成分享链接发给别人。 → 详细
  • 收益写在他这句话里:"正因为每个 gadget 就只是你想分享的那一样东西,平台才能统一实现分享模型和访问控制,让 gadget 自己根本没机会把这块做错。"权限是 AI 生成的代码最容易写错、也最致命的一块;这里的解法不是要求 AI 写得更小心,而是让它压根碰不到这块。 → 详细
09

现场最硬的一幕:Claude 为了做 slides,给幻灯片 app 加了三个功能

Claude 现场给幻灯片应用加功能 ▲ 图注:现场演示中的幻灯片应用——正是这一段里 Claude 因为缺删除线、缺文字居中、缺能吃原始 SVG 的框,直接给应用本身加上了这三个功能。

  • 做法:他给 Claude 一个 Google doc 链接,里面写了这场演讲想要哪些 slides,然后加了关键一句——"如果为了做出某几页 slides,你需要给这个幻灯片 app 本身加新功能,那就尽管加"。"它真加了。"这个平台上"每一个 app 都自动接上了 agent",所以 agent 既能改内容,也能改承载内容的那个应用。 → 详细
  • Claude"把 app 的代码全读了一遍,又读了我的文档",然后逐条认领:第 3 页需要删除线格式,"这个还没实现,我们可以加上";还有几页要求文字居中——"我猜 Philip 的设计品味太好了,看不上居中;但我这种更接地气的品味就是要居中。没关系,Claude 可以加。" → 详细
  • 第 5、6 页最有意思:他要一张"画得很糙的云的示意图",而这个 app 只支持方框加箭头那种图,"不支持像这样随便画的东西"。Claude 的处理不是画不出来就算了,而是给 app 加了一个能粘贴一段 SVG 的框(SVG=用文本描述矢量图形的格式),贴进去就变成幻灯片的一部分——然后它自己把 SVG 生成了出来。 → 详细
  • 这个细节值得停一下。讲者自己点破:"这个功能对人类来说没什么用,但对 Claude 特别好用。"也就是说,当扩展应用的人变成 agent,功能该长什么样会跟着变——一个人类嫌麻烦的"贴原始代码的框",对 agent 反而是最顺手的接口。产品的可扩展点,第一次有了非人类的使用者。 → 详细
10

"安全"到底安全在哪:四层隔离,让漏洞无处可去

  • 先接住那个必然的质疑:SVG 里可以塞 JavaScript,让 AI 生成的代码把任意 SVG 贴进页面,第一反应就是"这不 XSS 了吗?"(XSS=跨站脚本攻击,攻击者把恶意脚本塞进页面,借你的登录身份偷数据或替你操作)。他的回答是:"其实无所谓,因为这个环境的搭法就决定了它无所谓。" → 详细
  • 第一层:前端关进 null origin 的 iframe sandbox。iframe 是页面里嵌的一个独立小页面;"null origin"意思是这个小页面不属于任何域名,浏览器的同源规则会把它当彻底的外人——它拿不到主站的 cookie,也读不了主站的数据。 → 详细
  • 第二层:配上 content security policy(CSP,内容安全策略)。这是一份"这个页面允许往哪儿发请求、允许加载哪些脚本"的白名单,被收紧到"基本上它跟外面任何东西都通不了信,拿不到任何 cookie 之类的"。关键在于:即使恶意脚本真跑起来了,它也没有出口把偷到的东西发出去。 → 详细
  • 第三层:唯一的对外通道是 postMessage。postMessage 是浏览器里子页面向父页面递消息的一个窄口子。他们在这条通道上建了一个 Cap'n Web RPC 会话(RPC=远程过程调用,让一边像调本地函数一样调另一边的函数),把调用一路转发到服务端。一条被明确定义、只能走特定调用的窄通道,比"什么都能往外发"安全一个量级。 → 详细
  • 第四层:服务端同样被关起来。gadget 的服务端代码写成 Cloudflare Workers 上的一个 durable object(持久对象,可以理解成一个自带存储、独占一份状态的小服务实例——它既是这块逻辑,也是这份数据的唯一入口),跑在服务端的 dynamic worker sandbox(动态 worker 沙箱,即临时起一个受限的代码执行环境)里,"同样被禁止跟外部世界通信"。 → 详细
  • 合起来的效果:"客户端是 vibe code 出来的,服务端也是 vibe code 出来的……它们只能互相通信,然后把 UI 呈现给用户。所以就算你有 XSS 漏洞,最后也无所谓,因为它们什么都泄不出去——这条路被堵死了。"他给出的最强表述是:"基本上,这段代码里你不可能写出一个有杀伤力的安全漏洞。这就让你可以放心大胆地去折腾。" → 详细
  • 要看懂的是这个逻辑转向:他不是想办法让 AI 写出更安全的代码,而是把"这段代码可能造成的最大破坏"预先压到接近零——数据出不去、外部服务连不上、别人的东西碰不到。安全性来自环境的形状,不来自代码的质量。这才是标题里 "actually safe" 的含义。 → 详细
  • 唯一留白:怎么让这些 app 以安全的方式跟外部服务通信,他们"做了一整套机制",但这场没时间讲——"光这个我就能再讲两场"。 → 详细
11

技术栈:没有容器、没有数据库、能整套跑在笔记本上

  • 除 LLM 之外,"你们看到的这一切,全都建在 Cloudflare Workers 上"——没有用任何容器(container,把应用连运行环境一起打包的虚拟化单元),只有 dynamic workers;也没有用任何数据库,只用 durable objects。他顺带纠正一个误解:"很多人不知道,其实你是可以在 Workers 上构建复杂应用的。" → 详细
  • 整场演示跑在他的笔记本上(所以现场断网也不影响),底层是 Cloudflare 开源的 Workers 运行时 workerd,可以自己部署。他兴奋的点很具体:平台里已有 Home Assistant 连接器和 Spotify 连接器,"我想把这套东西跑在我家地下室,用它来做家庭自动化"。 → 详细
12

说好的开源,被 CTO 当场拦下了

  • 几个月前投稿时这还是业余项目,计划是讲完直接把代码"甩"到 GitHub 上让大家下载来玩。最近几周 Cloudflare 内部对它非常兴奋,项目升格;上周四 CTO Dane 把他叫进房间:"Kenton,我觉得你不该就这么甩出去。我觉得这东西不是『随手一甩』的料。我觉得我们得更谨慎、更有章法、更有意识地去规划怎么发布它。所以,先压几周再说。" → 详细
  • 他在演讲摘要里承诺过开源,只能当场道歉:"今天不行了。不过很快就会开源的。"(背景补注,非演讲内容:本场录制于 Cloudflare OS 发布前约一个月。) → 详细
13

现场翻车与花絮

演示中的「What are we working on?」界面 ▲ 图注:演示里的入口界面「What are we working on?」——一个实例就是一份文档,分享与权限由平台管,不再由每个应用各写一套。

  • 开场演示输入"做一个傻乎乎的计数器 app,傻到极致",直接报错——"网络不通"。他一句"这不是我演讲里最重要的部分"带过,结尾又惋惜了一次:"我真希望那个傻乎乎的计数器能用起来,因为 GPT 做的计数器还挺逗的。" → 详细
  • 他 slides 里"breaks"这个词时不时在抖,是 Claude 自己加的强调效果,"蠢得我实在舍不得删"——"标红我懂,下划线我懂,但抖……我觉得这不是人类会干的事。我认为这是 AI 原创。"(台下笑,他补一句:"这就是 ASI 啊,各位。") → 详细
  • 他原本为这场演讲写的那版 slides,"昨天我觉得这些 slides 太烂了,全扔了重写",还特意澄清"烂完全是我的锅,不怪 Philip,也不怪软件"——结果那版废稿反倒成了现场演示"agent 怎么改 app"的样本。 → 详细
14

闪电问答 / 收尾

(本期无)——AI Engineer 大会单人演讲,没有闪电问答环节;结尾那段"说好的开源被 CTO 拦下"的收尾已并入主题十二。

15

联系方式

(本期无)——演讲全程未给出个人联系方式或项目链接;Gadgets 的代码当日未开源,只承诺"很快"。演讲中被点名可查的东西只有两个:Cloudflare Workers 的开源运行时 workerd,以及 Workers 平台本身。

接着读