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

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

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

## 分享者介绍

**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](images/0090.webp)

**00:01:35 · Eileen Wagner**

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

## 什么是小型软件

**00:01:49 · Eileen Wagner**

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

![小型软件 · 画面 00:02:20](images/0150.webp)

**00:02:15 · Eileen Wagner**

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

**00:02:44 · Eileen Wagner**

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

## 从互联网到自动化编程

**00:03:02 · Eileen Wagner**

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

![互联网前后 · 画面 00:03:20](images/0210.webp)

**00:03:36 · Eileen Wagner**

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

![自动化编程前后 · 画面 00:04:20](images/0270.webp)

**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》中就谈过。这是对小型软件的另一种表述：像在家做饭一样，自己做应用。

> 编注：分享者在口述中说的是 2022 年，幻灯片上标注的是 2024 年，此处分别保留录音与画面中的信息。

![Home-cooked-apps · 画面 00:06:20](images/0390.webp)

**00:06:23 · Eileen Wagner**

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

**00:06:45 · Eileen Wagner**

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

**00:07:12 · Eileen Wagner**

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

![本地模型与本地优先 · 画面 00:07:20](images/0450.webp)

**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](images/0570.webp)

**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](images/0810.webp)

**00:13:22 · Eileen Wagner**

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

**00:14:00 · Eileen Wagner**

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

![随机四重唱分组 · 画面 00:14:20](images/0870.webp)

**00:14:28 · Eileen Wagner**

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

**00:14:36 · Gavin Owens**

我在。

**00:14:37 · Eileen Wagner**

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

![协作音效板 · 画面 00:15:20](images/0930.webp)

**00:15:11 · Eileen Wagner**

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

**00:15:31 · Eileen Wagner**

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

## 分享应用与安排聚会

**00:15:45 · Eileen Wagner**

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

![一起选择聚会时间 · 画面 00:16:20](images/0990.webp)

**00:16:28 · Eileen Wagner**

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

## 底层架构：Dialog 与 UCAN

**00:17:01 · Eileen Wagner**

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

![Dialog-DB与UCAN · 画面 00:17:50](images/1080.webp)

**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](images/1200.webp)

**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](images/1410.webp)

**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](images/1530.webp)

**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](images/1685.webp)

**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**

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

Eileen Wagner: https://tonk.xyz/ · Tonk: https://github.com/tonk-labs