Local-First

Tonk:面向小型软件的本地优先系统

Eileen Wagner · 2026-10-09 · 中文逐字稿

中文逐字稿(英文发言已翻译)。根据 2026 年 10 月 9 日的演讲与问答整理,保留发言顺序、例子、限定条件和交流承接,校订口头重复、断句与明显识别错误。产品状态和后续计划以分享时点为准。时间对应交付视频。

Tonk:面向小型软件的本地优先系统 — Eileen Wagner
在 YouTube 观看完整演讲与问答 · 57:24
阅读目录
  1. 分享者介绍
  2. 什么是小型软件
  3. 从互联网到自动化编程
  4. 家常软件与本地优先
  5. 数据由自己掌握,软件随时可改
  6. 现场演示:让 Claude 搭建留言板
  7. 狗狗相册、四重唱和协作音效板
  8. 分享应用与安排聚会
  9. 底层架构:Dialog 与 UCAN
  10. Tonk 与其他本地优先方案
  11. 一起试用现场生成的留言板
  12. 三种用法:应用、知识库、数据容器
  13. 问答:界面在哪里运行,Windows 怎么用
  14. 问答:Tonk 比直接写 Web 应用多了什么
  15. 问答:桌面应用与浏览器数据丢失
  16. 问答:智能体、CLI 与浏览器怎样同步
  17. 问答:框架选择与自托管
  18. 问答:本地服务、remote 与可替换的前端
  19. 问答:怎样做出真正有用的软件

分享者介绍

00:00:00 · Eileen Wagner

大家好,很荣幸来到这里。我是艾琳。刚才说过,我可以用中文回答问题,但解释这些专业术语时,我觉得英文更合适。这样你们也可以看到我们用的是哪些词,再考虑怎么译成中文。之后有问题,中文、英文都可以,德文也可以。我是来自柏林的设计师。接下来切换成英文,因为后面的幻灯片都是英文的。

00:00:35 · Eileen Wagner

我是一名关注隐私与去中心化的用户体验设计师。我参与的很多开源项目都关心用户隐私,以及如何分散计算和权力。我住在柏林,也参与组织了柏林的 Local-First Conf。

00:00:57 · Eileen Wagner

第一届我去参加了,第二届做了分享,第三届成了共同组织者。谁知道明年我会做什么呢?

00:01:05 · Eileen Wagner

我也活跃在一些社区,比如 Open Source Design,这是一个关心设计与开源的小团体;还有 Decent Patterns,是我多年前发起的一个模式库,收集去中心化项目中的设计模式。这些我也可以多讲一点。另外还有 DWeb 等社区。

分享者介绍 · 画面 00:01:20
分享者介绍 · 画面 00:01:20

00:01:35 · Eileen Wagner

不过,我现在主要专注于做产品。我是一家小型初创公司 Tonk 的产品负责人,今天想和大家聊的就是它。那么,Tonk 是什么?

什么是小型软件

00:01:49 · Eileen Wagner

Tonk 是一个把你所有的小型软件放在一起的统一系统。这是我们想介绍的基本想法。一会儿我会解释为什么来本地优先这个系列分享;先把它理解为一个围绕小型软件的系统。我们所说的小型软件,就是容易构建、也容易修改的软件。

小型软件 · 画面 00:02:20
小型软件 · 画面 00:02:20

00:02:15 · Eileen Wagner

我想读一下这段话,因为我很喜欢:我们梦想着一个社会计算的时代,有小型软件、朋友之间相互分享的软件,还有为我们量身定制的软件。它可能是你和妈妈共享的有声书库,是团队投票决定什么时候、去哪里吃午饭的应用,也可能是你与其他组织者共享的知识库。这就是小而个人化的软件。

00:02:44 · Eileen Wagner

这样的事情是最近才变得可行的。这里有一个稍微宏观一点的想法,我保证不会讲得太深:可以把小型软件的发展,与新闻媒体的变化放在一起看。

从互联网到自动化编程

00:03:02 · Eileen Wagner

互联网出现以前,新闻媒体主要是大机构,比如《纽约时报》和各类杂志。再往小一些、更个人化的方向走,可能有 Rocky Mountain News、地方期刊、Louisville Herald。这些例子很美国化,抱歉,但意思是规模越来越小,服务范围越来越本地。到了长尾的最末端,基本上就没有东西了:没有一家新闻杂志恰好只服务于你和你的朋友、家人。

互联网前后 · 画面 00:03:20
互联网前后 · 画面 00:03:20

00:03:36 · Eileen Wagner

互联网出现后,各种满足个人处境和需求的媒体大量涌现,比如播客、Substack、社交媒体上的帖子。你可以挑选真正适合自己、符合自己需要的内容。可以说,这是互联网给媒体带来的变化。

自动化编程前后 · 画面 00:04:20
自动化编程前后 · 画面 00:04:20

00:04:03 · Eileen Wagner

我觉得编程现在也在发生类似的事情。在 AI 辅助的自动化编程出现以前,我们有 Google、Facebook 这样的大型科技公司,也有人为特定目标开发软件,比如帮助产品团队协作,或者用 Calendly 安排日程。你可能还会用一些积木式工具搭建个人网站。这些都是面向某类用途的软件。

00:04:39 · Eileen Wagner

但在长尾的另一端,没有太多钱可赚,所以人们很少能得到完全为自己定制的软件。如果你真的想要一个只供自己和朋友使用的东西,通常得自己写。你得是开发者,或者认识一位愿意替你动手的好心开发者。这大致是自动化编程以前的状况。

00:05:06 · Eileen Wagner

现在,我们看到各种不同的想法不断涌现。有人为彼此制作很漂亮、很有个人特色的创意工具;有人随手做出小团队内部需要的工具。有时只是花五分钟做个好玩的东西:我想到一个有趣的点子,把它做出来,它就成了一个梗,整个过程也就五分钟。

00:05:34 · Eileen Wagner

再想想智能体的使用场景,还会有即时生成的软件:只为眼前的情境写一个脚本,用完五分钟后就丢掉,不再需要它。软件不一定要存在很久。现在这一类东西正在大量出现。这是 Tonk 感兴趣的方向,也是我们所说的小型软件。

家常软件与本地优先

00:06:03 · Eileen Wagner

这个想法并不新。Maggie Appleton 在 2022 年的一场演讲《Home-Cooked Software and Barefoot Developers》中就谈过。这是对小型软件的另一种表述:像在家做饭一样,自己做应用。

Home-cooked-apps · 画面 00:06:20
Home-cooked-apps · 画面 00:06:20

00:06:23 · Eileen Wagner

我为什么要讲这些自己做的应用?我们已经知道 AI 辅助编程的一些特点。大语言模型喜欢在本地工作,编程助手只要能访问命令行,就能做很多事情:获取工具,直接操作各种数据。

00:06:45 · Eileen Wagner

我们还看到了新一批创作者。这里指的是以前可能没写过代码,现在开始对制作小工具感兴趣的人。AI 可以替他们写代码,他们未必理解代码底下的所有东西,却很乐意使用,而且很喜欢为自己、也为彼此做东西。

00:07:12 · Eileen Wagner

与一般开发者相比,他们可能更擅长设计,或者在想法上更有创意。我们越来越常见到这样的创作者,他们能很快做出这些小软件。

本地模型与本地优先 · 画面 00:07:20
本地模型与本地优先 · 画面 00:07:20

00:07:27 · Eileen Wagner

这里的想法就是:大家已经听了不少本地优先基础设施的分享,我们能不能做一种本地优先的基础设施,既帮助人们制作小型软件,也帮助他们分发它?这就是 Tonk 想做的事情。

数据由自己掌握,软件随时可改

00:07:48 · Eileen Wagner

如果我们想要的世界是人们相互分享小软件,那就按照我们喜欢的方式来做。其中一个想法是“后平台”:你真正拥有自己的数据,工具来到你这里,你可以使用自己的智能体,不必绑定在大型云服务商那里,也不需要让平台锁住数据。数据在你本地,控制权在你手里。

00:08:18 · Eileen Wagner

它应该是本地的、私密的。我们把好的密码学技术用于去中心化身份,而不是在某个中心化登记处保存所有人的资料。你们已经在用 DID key 了,对吧?核心想法就是:身份可以由你自己生成、控制和管理。

00:08:43 · Eileen Wagner

它也应该开源,数据可以检查。AI 写入的东西不该只是一个黑箱,你可以真正看到里面是什么。

00:08:55 · Eileen Wagner

我们希望使用能长期保存的格式。哪怕二十年后,有人从沙子里挖出一块硬盘,上面的数据格式仍然可以被使用、理解和再次利用。

开放格式 · 画面 00:09:20
开放格式 · 画面 00:09:20

00:09:14 · Eileen Wagner

还有可塑性,这是我们正在探索的一个有意思的方向。我不认为它一定是所有设计都必须遵循的约束,但现在它变得可行了:你可以先做出一个东西,下次再修改,也可以在使用过程中不断改变它。这很值得探索。

00:09:39 · Eileen Wagner

继续讲之前,我们先做个演示,让大家看到我在说什么。我会直接给你们看看我的 Tonk、我每天用它做的事情。刚才在这里,好,我们来看看 Tonk。

现场演示:让 Claude 搭建留言板

00:10:05 · Eileen Wagner

Tonk 现在有一个首页,这里是我拥有的各个空间。我会怎么做呢?先新建一个空间,叫作“hello 本地优先”。你们不说英文的 local-first,而是说“本地优先”。创建会花一点时间,但此时它基本上就是一块空白画布,我想做什么都可以。

00:10:40 · Eileen Wagner

这里有一条可以放到顶部的小菜单栏,我可以复制一个智能体链接。它生成的其实是一个 UCAN 委托:拥有这个链接的人,就获得了对这个空间进行读写的能力。

00:11:00 · Eileen Wagner

接下来,我复制链接,来到 Claude 这里,对它说:“连接到这个空间。这是空间链接。我们做点什么呢?给我正在进行的这场活动做一个留言板,活动现在就在进行。”

00:11:33 · Eileen Wagner

我还可以给它一个参考设计。我这里有没有静态链接?没有,那就先给这个链接,让它按照这里的设计来做。这就是我的制作流程:我有一个链接、一个位置,再把想法作为提示词交给编程智能体,它就开始工作了。

00:12:03 · Eileen Wagner

我把它设为自动模式。它最近表现不错,所以这次就信任它。Claude 开始工作,也给出提示,说智能体已经连接。我先让它继续。

狗狗相册、四重唱和协作音效板

00:12:17 · Eileen Wagner

我可以先给大家看看已经做好的几个应用。这个是为我和朋友做的。我有一只狗,经常轮流由朋友照顾,我们想看看它最近在做什么。这里收集了我的狗 Bernie 的照片,还有一本小手册,记录它什么时候吃饭、睡觉,有哪些规则和指令,这样照顾它的人就知道该怎么做了。

00:12:56 · Eileen Wagner

我把它分享给朋友后,有人说,如果能用小贴纸当头像就好了。于是我加了贴纸功能:从手机复制一张照片,放进来,就能做成你和狗的贴纸,用作头像。这就是个人软件、小型软件。

与朋友分享的狗狗相册 · 画面 00:13:20
与朋友分享的狗狗相册 · 画面 00:13:20

00:13:22 · Eileen Wagner

这是我做的另一个东西。我空闲时很喜欢唱歌。有一次我们想召集大约二十个人一起唱,然后随机分成四重唱小组。我们要把人加进来,填上名字、各自唱什么声部,再生成组合。这里有个演示:假设我输入了很多人的名字,就可以生成四重唱组合。

00:14:00 · Eileen Wagner

这种软件不会有人专门在市场上卖给你,没有什么钱可赚。一个好的开发者可能需要半天,才能把各种限制条件和测试都做完整。现在我可以直接把它做出来。它看起来确实很粗糙,但生成它大约只花了五分钟,这很棒。

随机四重唱分组 · 画面 00:14:20
随机四重唱分组 · 画面 00:14:20

00:14:28 · Eileen Wagner

我还有另一个。Gavin 在通话里吗?我看一下。

00:14:36 · Gavin Owens

我在。

00:14:37 · Eileen Wagner

嗨,Gavin!好,他也在。这是 Gavin 做的一个音频库,里面有各种声音可以玩。我不确定这里有没有共享声音,大家之后可以自己试:找一些声音,重新混音,或者同时播放。这有点像一个可以协作的音效板,而且就是 Gavin 喜欢的样子。

协作音效板 · 画面 00:15:20
协作音效板 · 画面 00:15:20

00:15:11 · Eileen Wagner

不同的人可以做自己的应用,带着自己的风格和偏好,完全按自己想要的方式工作。这就是 Tonk 现在的样子:一块空白画布,你想怎么画都可以。

00:15:31 · Eileen Wagner

我看看刚才的任务怎么样了。有什么吗?哦,已经有东西了。它还在继续,我想现在是在下载字体。

分享应用与安排聚会

00:15:45 · Eileen Wagner

有意思的不只是你能做自己想要的东西,也能看看其他人在做什么。这里有一个列表,列出大家制作并选择公开的应用。比如这个叫 Canoodle 的小应用,可以帮大家找一个合适的时间安排活动。和朋友、同事约时间时,我们应该都见过类似的东西。

一起选择聚会时间 · 画面 00:16:20
一起选择聚会时间 · 画面 00:16:20

00:16:28 · Eileen Wagner

这里也一样,只是我可以复制分享链接,发给任何人。他们马上就能获得这个空间的读写权限,填入自己的时间,所有数据汇合到一起,我们就能决定什么时候见面。这就是 Tonk 目前的大致样子。

底层架构:Dialog 与 UCAN

00:17:01 · Eileen Wagner

我让那个智能体再做一会儿。能展示的东西还有很多,不过先回到幻灯片。底层到底是什么?我们使用了几个库,也在向它们贡献代码,因为我们的 CTO 本身就是这些库的主要维护者、开发者和作者之一。

Dialog-DB与UCAN · 画面 00:17:50
Dialog-DB与UCAN · 画面 00:17:50

00:17:30 · Eileen Wagner

第一个是 Dialog,也叫 Dialog-DB。它是一个本地优先、基于 CRDT 的数据库,可以到 dialog.foundation 了解。基本想法是一个用 YAML 表达内容的语义数据库。是的,就是大家熟悉的 YAML。应用、数据的视图以及数据结构本身都在里面。它很有可塑性,schema 可以随着你的需要演变,不像 SQL 数据库那样严格。

00:18:14 · Eileen Wagner

它很适合这种可以改变的、去中心化的数据共享。我们也使用 UCAN,为各种应用提供去中心化授权。想了解的话,可以看 ucan.xyz。它使用 DID key。在我们的实现里,DID key 以 passkey 为基础,现在生成一个 passkey 已经很容易了,它就是你身份的基础。

00:18:47 · Eileen Wagner

除了这两部分,我们做了同步引擎,用比较基础的 Cloudflare R2 来同步和存储;也做了 CLI,让智能体读写空间。当然还有 Web 运行时,让你在浏览器里打开这些空间,再通过链接分享。这些就是底层组成。

Tonk 与其他本地优先方案

00:19:13 · Eileen Wagner

这个系列已经介绍了不少项目,也有很多本地优先、基于 CRDT 的数据库,所以我想快速比较一下 Tonk 与它们的关系。这张表很大,可能有点让人眼花缭乱。最主要的区别是,Tonk 和 Dialog 更关注应用与界面这一层。

Tonk与其他方案 · 画面 00:19:50
Tonk与其他方案 · 画面 00:19:50

00:19:51 · Eileen Wagner

我们考虑数据模型怎么存储、怎么编译、怎么定义规则,以及怎样把这些都放进一个同时包含应用和界面的容器。这是在其他人已经做出的基础上,我们增加的部分。

00:20:13 · Eileen Wagner

比如,我们目前还没有加密,加密在路线图上。但通过 UCAN,我们已经有比较好的授权机制。每次编辑都有签名,但内容还没有加密。

00:20:27 · Eileen Wagner

网络方面也类似,这些可以在未来加入。比如很容易想象把 iroh 接进来负责传输。但目前使用的还是 HTTP 和我们托管的服务。这也有好处:因为服务上运行着特定版本的 Tonk,我们可以保证一定的使用体验。

00:20:56 · Eileen Wagner

先说到这里。如果有更多问题,Gavin 也在,可以一起回答。不过继续之前,我想看看 Claude 做完没有。哦,已经完成了!我们在哪儿?在这里。看,刚刚生成了一个空间。

00:21:17 · Eileen Wagner

这是一个留言板,给“本地优先”用的。你可以写消息,也可以用不同的方式显示:有大一些的内容,也有小一些的内容。很不错,Claude 一次就做好了。

一起试用现场生成的留言板

00:21:38 · Eileen Wagner

现在我可以复制分享链接,它同样是对这个空间的权限委托。然后回到大家这里,把链接贴进聊天。你们现在就能进入这个空间,进行读写。

00:22:02 · Eileen Wagner

目前这样使用还不需要账户。合适的账户模式还没有完全确定。我们现在的想法是,每个空间有一位所有者,所有者有账户,其他部分则尽可能按你想要的方式在本地使用。

00:22:23 · Eileen Wagner

谢谢,已经有人开始写了。它也是实时的:你在这里写的东西会同步,并立即显示出来。我也可以说一句“Hi, there”。谢谢大家。

00:22:50 · Eileen Wagner

我已经讲了二十五分钟了。最后还想讲一件事,然后进入问答。这套基础设施能做很多事情。就像前面说的,它是一块空白画布,我们提供的是打包和分发的基础设施。创作者带来自己的智能体、想法和界面。我们没有控制这些东西,也没有兴趣控制它们。

三种用法:应用、知识库、数据容器

应用模式 · 画面 00:23:20
应用模式 · 画面 00:23:20

00:23:33 · Eileen Wagner

不过,我们已经观察到一些使用模式,人们把 Tonk 当作服务——更准确地说,是基础设施——来使用。第一种就是应用:小型软件就是小应用。我前面已经展示了一些,比如 Canoodle,可以和朋友、同事找到共同的空闲时间。

00:24:07 · Eileen Wagner

我们还做了一个叫 Little Writer 的东西,就是一张可以写字的协作便笺,支持并发编辑,也可以放进你的目录里。说到底,它就是一个简单的协作编辑页,没有花哨的东西。

00:24:24 · Eileen Wagner

我还做了一个叫 Trello 的看板:把小任务放进去,分配给不同的人。它小巧、可靠,可以分享,马上就有用,没有多余的东西。你可以发布这些小应用,别人也可以使用。

00:24:56 · Eileen Wagner

还有另一种用法,我们既观察到了,也在自己实践。在 Tonk 上不一定只做应用,也可以让一组数据对某个群体有用,与这个群体相关联,并随着群体一起演变。这更像是在使用知识库。

共享知识库模式 · 画面 00:25:20
共享知识库模式 · 画面 00:25:20

00:25:24 · Eileen Wagner

我快速带大家看看我们的内部知识库。这基本上就是 Tonk 团队自己的工作台。我们只有四个人,却做了很多东西,有很多想法,也有很多每天需要查看的内容。比如这个是在 Tonk 上搭建的问题追踪器,每天都有数据进出,也会不断变化。

00:25:54 · Eileen Wagner

在产品方面,我们有想验证的假设,就把想法放进去,再做一个适合评估它们的界面。当然还有团队人员相关的事情,比如我很快要休假,这也放在这个团队工作空间里。我们用了几个月,它已经长出了很多东西。

00:26:22 · Eileen Wagner

研究资料也会放在这里。我们不需要先想得特别清楚,就把东西放进去。它像一个大资料库,有点像一些人把 Obsidian 当作第二大脑的方式。连接到这些知识库的 AI,因为掌握更多上下文,也会更聪明,更清楚现在发生了什么。

00:26:49 · Eileen Wagner

更重要的是,如果我不喜欢某个东西的样子,可以改变它。它不像有些应用,做出来以后就必须保持原样,一旦修改,就得迁移整个数据库。

00:27:10 · Eileen Wagner

这里修改起来非常容易。现在可能没时间演示,但我可以马上对空间做大大小小的改动,不会因此丢失内容。所有东西还在,经历很多次改变也会继续保存下来。

00:27:29 · Eileen Wagner

我们也开始在社区组织等场景中看到这种需求:人们想要一个类似 GitHub 仓库、但更适合自己的数据仓库,能与团队共享,尤其是团队并不全由开发者和程序员组成的时候。

基于链接的数据容器 · 画面 00:27:55
基于链接的数据容器 · 画面 00:27:55

00:27:49 · Eileen Wagner

最后,还有第三种正在出现的模式,我称它为“基于链接的数据容器”。刚才你们已经看到了,所有东西都可以放在一个链接之中。我觉得未来这样的数据容器,甚至不一定需要界面。

00:28:15 · Eileen Wagner

你可以把整个链接贴给智能体,让它做事情。比如在这个提示词里,我把项目交给它,让它继续工作;如果需要什么,就来问我,否则也可以去连接 Gavin 的智能体,取得其他支持。

00:28:39 · Eileen Wagner

“连接”具体是什么意思?基本上就是拥有一个共享空间。智能体可以共享,人也可以共享。很有意思的是,所有东西——数据和应用——都在同一个地方。除了这个链接里已经包含的内容,你不需要额外的东西。

00:28:58 · Eileen Wagner

它默认支持多人协作。因为是本地优先、使用 CRDT,每个人都有自己的副本,也能同时写入。这也意味着多个智能体可以同时写入,而不必陷入奇怪的冲突。

00:29:16 · Eileen Wagner

由于委托链使用 UCAN,智能体的修改天然就有来源和归属记录。我们也正在做相应的界面。

00:29:25 · Eileen Wagner

它可以只在本地使用。如果你有本地大语言模型,就能组成一套很好的本地环境。也可以离线使用:比如平时大部分时间在线,但有一会儿在飞机上,仍然能使用,修改也会保存下来。

00:29:45 · Eileen Wagner

整个内容采用 YAML 这样的格式,可以检查,读写也很快。给大家看一下,这些应用的数据基本上就是 YAML。这是 seed,也就是一些基础内容;这里定义的是应用中的概念。

00:30:20 · Eileen Wagner

如果你熟悉语义数据库,会发现它有点像 Datalog。它非常容易阅读,智能体也很容易理解。你可以自己逐项读、检查,也可以直接修正。

00:30:37 · Eileen Wagner

我想先讲到这里。结束分享前,再看看留言板上有没有什么。谢谢,太好了。我停止共享,按照前面说的,切回中文。

问答:界面在哪里运行,Windows 怎么用

00:31:02 · Eileen Wagner

好,现在可以回答问题了,我试着用中文回答。

00:31:06 · 主持人

谢谢 Eileen,太棒了。

00:31:18 · Eileen Wagner

谢谢大家一起在里面写了各种各样的留言。

00:31:26 · 主持人

大家现在可以提问。评论区有一个问题:Tonk 是一个把界面设计都放在服务端的程序吗?

00:31:54 · Eileen Wagner

你说的是哪一种界面设计?Tonk 有自己的界面,比如新建一个 space,或者与别人分享 space。这些界面实际上也都是在客户端,因为它是本地优先软件。

00:32:21 · Eileen Wagner

至于你自己的界面放在哪里,我觉得最后由用户决定。你可以把整个设计放在电脑上,尤其是用本地的 AI 编程软件,比如 DeepSeek 或者 Qwen,可以直接在自己的电脑上做,不需要服务器。我理解这个问题了吗?

00:33:13 · Eileen Wagner

还有 Windows 上的支持问题。Gavin,我们有没有 Windows 支持?有没有在考虑?

00:33:25 · Gavin Owens

是指 Windows 原生可执行文件吗?

00:33:30 · Eileen Wagner

对。

00:33:30 · Gavin Owens

问的是 CLI 吗?

00:33:32 · Eileen Wagner

我想是的。

00:33:36 · Gavin Owens

我以为已经加了。看看这里的标签:有 Linux 和 macOS。我猜原先的设想是使用某种基于 Node 的 shell,通常能运行 Linux 二进制文件。不过也可能是我想错了。

00:34:06 · Gavin Owens

如果能具体告诉我需要哪种二进制文件,或者你希望在 Windows 上以什么方式运行,我们可以把它加上。

00:34:15 · Eileen Wagner

好的,谢谢。我们现在还没有这样的 Windows 支持,但如果告诉我们需要哪种二进制文件,可以试着做一个。

问答:Tonk 比直接写 Web 应用多了什么

00:34:35 · Eileen Wagner

有人说网页看起来像 SaaS 服务模式。是指我们公司,还是其他部分?我们的想法是,浏览器现在可以在本地存储。需要 Tonk 账户的地方,实际上是分享 space 的时候,因为现在同步还由我们提供。以后也可能接入 iroh。你问的是浏览器本地存储吗?能再解释一下问题吗?

00:35:25 · 主持人

他说的是 Tonk Network 那个网站。

00:35:36 · Eileen Wagner

对,Tonk Network 还没有正式发布,但已经可以开始用,正在 beta 测试。大家想试着玩当然可以。数据迁移一般已经做得比较成熟,但我不能保证接下来两周内所有东西都能平稳延续,所以先不要把重要资料放上去。其他东西试着玩是没有问题的。

00:36:14 · Eileen Wagner

还有一个问题:“相比直接用 AI 写一个 Web 应用,Tonk 提供什么?一些 CRDT 数据结构、一个 registry、一个运行应用的容器,可以这样理解吗?”

00:36:28 · Eileen Wagner

对。首先是基于 CRDT 的数据库,我们相当于把这个结构做成一个标准。只要在 Tonk 上做应用,就会是本地优先、基于 CRDT 的,也会使用 Dialog 这套语言。

00:36:50 · Eileen Wagner

另外还提供同步。我们有自己的 service worker,你不需要自己处理更新、部署、DNS 这些麻烦事。尤其是这些刚开始编程的人,不想处理这些;即使能做,也未必有时间。比如我可以自己托管,却没有时间折腾,所以 Tonk 也在解决我一个很直接的问题。

00:37:33 · Eileen Wagner

对,如果域名被封,Tonk 暂时就不能用了,所以我们在考虑能不能使用 iroh 之类的东西。目前单是封住这个域名,就会成为问题。然后还有 registry 的问题。

问答:桌面应用与浏览器数据丢失

00:37:58 · Eileen Wagner

我们也在考虑桌面应用。从设计角度,它能带来不少东西。有人已经说到了 IndexedDB:大多数用户不会无缘无故清除它,但偶尔还是会发生。目前我们在 R2 上还有一份副本,所以数据不至于丢失,可这份就不是本地数据了。我们觉得使用本地文件系统可能更好,而这需要桌面应用。

00:38:44 · Eileen Wagner

另外,我们现在包装一个应用,实际上是在浏览器里放一个 iframe,而 Tonk 又在 iframe 和真正的浏览器之间加了一层,感觉像是在和浏览器竞争。用户可能也会不理解:有一个浏览器,又有 Tonk 的浏览器,最后才是应用,三层有点复杂。如果有桌面应用,就可以直接把它做成类似浏览器的东西。

00:39:49 · Eileen Wagner

“浏览器被重叠了?”如果是重复,我们倒觉得问题不是特别大。实验中经常会出现数据库重复,或者下载没有处理好等情况。用了几个星期以后,你会发现,我们的数据保存得非常持久,反而常有一种想删都删不掉的感觉。

00:40:40 · 现场交流

这位朋友的意思是,浏览器里的数据被清除了。

00:40:51 · Eileen Wagner

啊,是被清除,不是重叠,明白了。这确实是个问题。用户需要知道数据到底存在哪里,才能保证它不会从本地丢失。目前服务器上还有副本,但以后不一定,也可能让用户自己选择要不要服务器备份。如果完全不备份,我觉得 IndexedDB 不是一个很好的长期解决方案。

问答:智能体、CLI 与浏览器怎样同步

00:41:41 · Eileen Wagner

“怎么接到智能体里面?刚才没明白,怎么突然从云端到本地了?”

00:41:59 · Eileen Wagner

我试着解释一下。本地有一个 CLI,智能体可以直接通过它读写、修改数据。写完以后要同步,目前 CLI 智能体会话和浏览器会话之间是经过云端的。我们考虑过用 WebRTC 直接连接两边,但目前最快的实现方式还是走我们的云端。

00:42:47 · Eileen Wagner

我们正在尝试能不能完全在本地完成,使用 local-only space,这也是可能的。如果愿意,可以请 Gavin 再解释一下。另外,egg.js 我还没听说过。关于智能体和浏览器空间之间怎样连接,还想了解什么?我请 Gavin 来讲。

00:43:37 · Eileen Wagner

Gavin,能不能再说说智能体会话、CLI 会话与 Web 运行时之间的连接?我刚才说,我们考虑过 WebRTC,但现在还是经过云端;同时也在考虑完全本地的构建体验,是这样吗?

00:44:04 · Gavin Owens

对,我们内部已经有了原型。我觉得体验会好得多,因为更新能立即发生。我们也在做原生桌面体验的原型,不知道刚才有没有提到。

00:44:20 · Gavin Owens

所有同步行为都通过 Dialog。你在本地写入,就是写到本地的 Dialog 实例,然后给 Dialog 配置一个 remote。默认是我们使用的 Cloudflare R2,但理论上可以换成其他东西,包括你自己部署的服务。现在已经能这样做,只是还没有文档。也可以设想一个点对点的 remote。

00:44:57 · Gavin Owens

所以没有理由不能让运行时直接读本地数据库,只需要把这条链路接起来,这也是我们现在在做的事情。我们先从 Web 开始,是为了测试分享体验,了解大家想怎么用,再去做更丰富的构建体验和功能更完整的原生应用。

问答:框架选择与自托管

00:45:33 · Eileen Wagner

谢谢 Gavin。和我说的差不多,不过更详细。下一个问题:“egg.js 适合做本地优先吗?Node.js 框架用哪个更好?”

00:45:52 · Eileen Wagner

我不太了解,也不确定 Gavin 了解不了解。我们现在把这类事情交给 AI 编程工具决定,它想用哪种都可以。我们用 React,也用 Node;egg.js 我不知道,抱歉。不同的小程序基本由 AI 选择,到目前为止,基本都能做成。最后把软件用 Dialog 打包,各种修改也通过 Dialog 进行。

00:46:50 · Eileen Wagner

当然,我们也在写自己的组件。比如只需要一个写东西的地方、小数据库或小表格,我们已经做了一部分与 Dialog 配合得更好的组件,可以直接使用,不用每个人都从头写一遍。

00:47:16 · Eileen Wagner

就像 Gavin 说的,现在我们更想了解这批刚开始编程的人:想写什么、怎么分享、怎么与别人互动。所以先做 Web。以后完全使用本地程序也是可以的。从设计整个系统之初,我们就在考虑能不能让其他人托管,或者用 P2P 的方式运行。

00:48:07 · Eileen Wagner

还有一个问题是把 Tonk 当作中转站,用 host 和 SRV 把浏览器重定向到本地。这不是我能直接回答的问题。是说用 Tonk 做中间层吗?能不能再解释一下?

00:48:56 · Eileen Wagner

作为中间层,我们确实是这样想的。不同的编程工具可以通过 Tonk CLI 读写底层的 Dialog 数据,再在上面搭任何东西。不过 CLI 只是其中一小部分。我觉得可能更有意思的是,怎样与最终用户互动,怎样和他们分享。

00:49:54 · Eileen Wagner

谢谢 Gavin。对,昨天已经有一个 P2P 测试了。

问答:本地服务、remote 与可替换的前端

00:50:17 · Eileen Wagner

Gavin,这个问题好像是:能不能把 Tonk CLI 用作中间层工具,在本地启动 Tonk,把域名指向本地的 Tonk 服务,再由服务与云端同步,也许用 host 和 SRV。这个说法你能理解吗?

00:50:55 · Gavin Owens

这个问题让我有点困惑。不过我们已经在做本地开发。你可以运行 Tonk 的 GitHub 仓库,启动一个本地实例,它会访问本地的 Dialog。

00:51:16 · Gavin Owens

我们的 CTO Irakli 喜欢做的一件事,就是设置 remote,也就是指定另一个需要同步的节点。他可以把 remote 指向预发布或生产环境,让数据同步到 R2,而不只是留在本地。Web 运行时放在 localhost,同步经过 R2,并使用部分生产环境的授权代码:R2 同步前面有一个授权服务,负责检查 UCAN 委托。

00:52:01 · Gavin Owens

我们还没把 Web 运行时和所有这些东西都放在本地这件事做得特别容易。但如果你懂技术,再让大语言模型帮一点忙加快进度,应该可以用现有代码比较快地跑起来。加入我们的 Discord,Irakli 会很乐意帮忙,他最喜欢帮助大家设置其他 remote。

00:52:41 · Eileen Wagner

这点我可以作证。Gavin,你知道 Clash 吗?有人提到一种 Web 应用配合可配置后端的模式。

00:52:53 · 现场交流

——我不太了解,所以没办法评价。 ——这里说的就是这种模式。 ——是的,我没听说过,也很好奇。

00:53:06 · Eileen Wagner

我们没有听说过 Clash,但很想了解它的模式能怎么用。

00:53:20 · 观众

我用过 Clash。它是中国用户用来翻越网络防火墙的软件。它的核心是一个后端,处理网络、配置等事情,默认不提供图形界面,但会提供 API 和端点。你可以自己做前端,调用这些 API。

00:54:04 · 现场交流

好的,我觉得这正是我们可以做的事情。

00:54:13 · Eileen Wagner

Dialog 本身带有 view,但你其实可以做任何前端,怎么做都可以。它相当于后端,因为它就是数据库。我们的想法也是,每个人可以使用自己的前端,共用同一个后端,而且随时可以改变,这些都是可能的。

00:54:49 · Eileen Wagner

目前我认为 Tonk Network 还没有被封,大家可以试一试。我不确定在你们那里好不好用。

00:55:00 · Eileen Wagner

你想的是切换后端。我的意思是,数据、前端和身份验证等东西都放在同一个地方,所以可以直接发给别人,再继续转发。我们叫它 portable software,也就是可以携带到不同地方使用的软件。甚至可以说,没有那么明确地区分前端、后端,因为数据库带着自己的视图。

00:55:48 · Eileen Wagner

“没有配置就走 SaaS,配置了就走 CRDT。”还有人问产品链接。是这个,对,这是我们的主页。

问答:怎样做出真正有用的软件

00:56:12 · Eileen Wagner

刚才还有一个问题:“如何让 AI 优雅地封装起来?”这确实是个基本问题。很多人喜欢写各种各样的程序,却很少有人喜欢接收各种各样的程序,因为写出来的东西确实有时太疯了。

00:56:38 · Eileen Wagner

我们自己也在学习,怎么让它做出质量更高的软件,也想做一些真正有用的东西。

00:57:02 · Eileen Wagner

作为设计师,我首先会问:你在为谁写这个软件?用户是谁?什么情况下需要这样的软件?这是最重要的问题。否则,最后可能得到一些根本用不上的东西。