nyblnet/bento
GitHub: nyblnet/bento
Bento 是一款将编辑器、查看器和播放器全部打包进单个 HTML 文件的本地优先演示工具,以「文件即软件」的理念实现无需安装、无需账号、数据自主可控的幻灯片制作与协作。
Stars: 900 | Forks: 51
# [Bento — 装进文件的办公套件](https://bento.page/)
**这款 PowerPoint 替代品是一个单 HTML 文件。** 一个 Bento 演示文稿将
它自己的查看器、演示器和编辑器内嵌在文档中 —— 在任何
浏览器中打开它,编辑它,演示它,发送它。你发送给的人什么也
不需要:文件本身*就是*软件。
**花 10 秒钟试一试:** 打开 [bento.page/slides](https://bento.page/slides)
—— 这就是整个应用,它在一个同时作为功能向导的初始演示文稿上运行。或者从
[图库](https://bento.page/) 获取一个设计好的模板并将其变成你自己的。
**下载应用:** 从
[GitHub Releases](https://github.com/nyblnet/bento/releases) 页面或直接从
[bento.page](https://bento.page/releases/slides/Bento_Slides.bento.html)
获取这个单一的 `Bento_Slides.bento.html`(约 560 KB,无需账号,无需安装程序)。在任何现代浏览器中打开它,它*就是*
编辑器。保存,它会用你的演示文稿重写自身。
## 为什么会有这个项目
办公文档曾经是你*拥有*的东西。现在它们变成了你租用的东西 ——
被锁定在别人的云盘中,隐藏在别人的登录名后,只有在某家
公司保持其服务器运行时才可读取。Bento 走上了另一条路:
- **一个文件,永远相伴。** 演示文稿、字体、图像、图表、动画和
完整的编辑器结伴而行。2026 年的副本在 2036 年依然能打开。
- **诚实的源码可见。** 你的数据位于文件顶部一个普通且易读的 JSON 块中。
没有二进制格式,没有锁定,无需考古挖掘。
- **自我保存。** 文件在保存时重写自身的数据块(File
System Access API,带有下载后备方案)。永远无需安装应用。
- **本地优先,毋庸置疑。** 开启离线模式,任何数据都不会离开你的
机器 —— 更新和协作被强制阻断,并且应用会明确说明这一点。
## 内部功能
| 功能 | 描述 |
|---|---|
| **Morph(平滑)演示** | 共享同一 id 的元素会在幻灯片之间产生动画效果 —— 位置、大小、颜色,甚至渐变。复制一张幻灯片,重新排列,动画效果会自动生成。 |
| **实时协作** | 采用 E2EE (AES-GCM) 加密,密钥仅存于你的文件中,绝不上服务器。文件本身就是邀请函:任何人打开副本即可加入。离线编辑会精准合并 —— 基于我们自研的 CRDT,包括字符级别的文本合并。 |
| **盲中继** | 可选的同步中继 ([`server/sync-worker/`](server/sync-worker/)) 仅存储密文,对内容一无所知。阅读源码吧;它仅仅只有一个文件。 |
| **内置图表** | 柱状图 / 折线图 / 饼图 / 散点图由我们自研的无依赖引擎绘制,在演示期间实时呈现:包含工具提示、缩放,以及柱状图变为饼图时平滑过渡的数据。 |
| **专为 AI 设计** | 文档是文件中纯粹的 JSON,因此 agent 可以就地编辑 `.bento.html` 文件,而聊天机器人可以往返交互 JSON (`window.bento.loadDoc`)。参见 [docs/agents.md](docs/agents.md)。 |
| **带签名的自我更新** | 发布版本均经过 ECDSA 签名并在应用内提供。更新时会写入一个*新*文件 —— 旧文件将保留作为你的回滚备份。任何服务器都不会触碰你的文档。 |
| **其他所有功能** | 演讲者视图、评论、布局、隐藏的交互状态、悬停显示、动作路径、PDF 导出、页面尺寸、8 种 UI 语言 —— 全部集成在约 560 KB 的外壳中。 |
## 配合 AI 使用
由于文档是位于文件顶部附近的一个纯文本块中的纯 JSON,
任何能够读写文件的助手都能编辑你的演示文稿 ——
无需插件,无需 API。有两种使用方式:
- **文件工具集** 就地编辑 `#bento-doc` JSON:
[Claude Code](https://claude.com/claude-code)、Cursor、Aider 或任何具备
文件系统访问权限的 agent。Claude Code 用户将获得一个打包好的 `bento-slides`
技能(可从此代码库的插件市场安装:`/plugin marketplace
add nyblnet/bento`),它甚至会自动下载最新的 Bento 应用。
- **聊天交互** 适用于任何聊天机器人:复制出文档 JSON(*About →
Copy document JSON*),让助手重写它,然后将其粘贴回去。
**它可以完全离线配合本地开放权重模型工作** ——
只需将
[Ollama](https://ollama.com)、llama.cpp 或 LM Studio 指向演示文稿,任何数据都不会
离开你的机器。Agent 指南是一个单页文档,你可以将其直接放入任何
模型的上下文中:[bento.page/agents.md](https://bento.page/agents.md)(同时也在
此代码库的 [docs/agents.md](docs/agents.md) 中)。
## 一段话讲清架构
`slides/src/model.ts` 定义了 JSON 文档模型;一个渲染器
(`render.ts`) 负责为编辑器画布、缩略图和演示模式绘制它
(Reveal.js 驱动导航;Morph 效果是根据模型而非
DOM 计算得出的)。动画是自研引擎(`anim.ts`),图表是自研的
(`charts.ts`),协作是自研的 CRDT (`sync/crdt.ts` ——
纯数据,由 `scripts/test-sync.ts` 进行了数十万次
收敛检查的模糊测试)。外壳压缩后约为 560 KB,文档块
作为纯文本保留,以便旧文件和外部工具随时进行拼接。
深入了解:[docs/architecture.md](docs/architecture.md)。
## 真实的安全模型
- 协作密钥在创建文档时在客户端生成,仅存在于
文件中。拥有文件 = 拥有成员资格;“Rotate keys” = 撤销权限。
- 中继可见内容:密文、连接时间以及房间密钥的哈希值。
它无法读取内容、名称或结构。
- 在线状态名称属于声明,而非证明 —— 在共享密钥的房间内没问题;
企业级身份验证需要签名的数据帧(已设计,未构建)。
- 更新检查仅获取静态清单,不发送任何关于你或你
文档的信息。签名 + 哈希 + 版本单调性均在应用内验证。
- 已知权衡:实时协作期间的撤销基于快照,可能会还原
其他协作者对同一属性的并发编辑;编辑功能
优先针对桌面端设计(手机端非常适合查看和演示)。
## 从源码构建
你只需要 Node 20+ 和 npm —— 该应用是一个单页构建,无需
搭建后端。
```
cd slides
npm install
npm run dev # dev server (http://localhost:5173)
npm run build:single # → dist-single/Bento_Slides.bento.html (the product)
```
`node scripts/test-sync.ts` 运行 CRDT 收敛测试套件。发布版本在本地
构建,因此签名密钥永远不会离开维护者的机器 —— 参见
[docs/RELEASING.md](docs/RELEASING.md)。
## 延伸阅读
- [CLAUDE.md](CLAUDE.md) — 深入的架构 + 开发指南(也是 AI agents
在此代码库中工作时阅读的文档)。
- [docs/architecture.md](docs/architecture.md) — `.bento.html` 文件是如何
构建的、磁盘上的格式以及运行时布局。
- [docs/format.md](docs/format.md) — 规范的 `bento/slides` 文档模型
规范(每种元素类型、幻灯片/状态/布局结构及协作字段)。
- [docs/collab-design.md](docs/collab-design.md) — CRDT、E2EE 中继和
签名写入 RBAC 设计 + 威胁模型。
- [docs/agents.md](docs/agents.md) — 面向 AI agents 的文档格式说明。
- [CHANGELOG.md](CHANGELOG.md) — 版本历史。
- **布局:** `slides/` 是应用(源码在 `slides/src/`);
`server/sync-worker/` 是盲中继;`docs/` 和 `scripts/` 是
指南和构建工具。
欢迎贡献代码 —— 从 [CONTRIBUTING.md](CONTRIBUTING.md) 开始吧。发现了
安全问题?请参见 [SECURITY.md](SECURITY.md)。
## 路线图
**Bento/Slides** 是 Bento/Suite 的首款应用 —— 一款现已发布的
PowerPoint 替代品。接下来是 **Docs** (`bento/docs`) 和 **Sheets** (`bento/sheets`),
每一款都作为各自独立的 `.bento.html` 分发文件。当前发布版本
存在于 [bento.page](https://bento.page) 上,并通过
签名更新通道触达每一个现有文件。
## 许可证
Bento 是基于 [MIT 许可证](LICENSE) 的开源项目 —— 此处的所有软件均为
MIT 许可,© 2026 The Bento/Suite 作者。捆绑的运行时组件 (reveal.js、
Moveable、Selecto) 均为 MIT 许可;嵌入的字体 (Fraunces、Instrument Sans)
为 OFL 许可;图库图像属于公共领域(参见
`scripts/gallery-photos/SOURCES.md`)。每个组件均保留其原始许可。
标签:HTML, MITM代理, 办公套件, 多模态安全, 本地优先, 演示文稿, 离线优先, 程序员工具, 自动化攻击