Macro 的 blocks 数据模型:十几类内容共用一份库,到底改变了什么
“统一工作区”这个词,多数产品的实现是把几个独立应用塞进同一个侧边栏。数据库还是各自的,跨应用引用靠粘 URL,搜索得挨个搜,通知得挨个点。你在文档里贴了一个工单链接,工单那边并不知道自己被引用过;你把一份 PDF 拖进群聊,它同时又躺在网盘里,两份东西以后各自漂移。
Macro 的官方文档在 concepts 这一层给出的是另一个答案:Macro 里的一切都是 block(块)。不是”邮件模块、任务模块、文档模块”,而是同一种东西的不同类型值。这句话听上去像个措辞,但它决定了后面一连串具体行为——引用面板、共享对话框、搜索索引、收件箱,全是块级设施,写一次就对所有类型生效。
这篇只讲这个数据模型本身:类型清单是什么、块共用了哪些东西、提及和嵌入在权限上为什么不一样、协作块怎么同步,以及它和”一堆 SaaS 各存各的”的分歧究竟落在哪几处。产品全景在《Macro 是什么》里已经讲过,这里不重复。
一等块类型的完整清单
官方文档把当前的第一方块类型逐个列了出来,一共 15 种。值得注意的是命名——文档里给的是内部类型标识,括号里才是产品层面的叫法,两者并不总是一一对应:
| 类型标识 | 对应的产品概念 |
|---|---|
md | 文档 |
email | 邮件 |
channel | 频道 |
chat | Agent(对话) |
automation | 自动化 |
project | 任务 |
contact | CRM 联系人 |
company | CRM 公司 |
call | 通话 |
canvas | 画布 |
code | 代码 |
image / video / pdf | 图片 / 视频 / PDF |
unknown | 兜底类型 |
这份清单里有两个细节值得停一下。
一是 chat 和 automation 也是块。Agent 会话和自动化规则不是挂在某个设置页里的配置项,而是和一封邮件、一份文档平级的对象。这意味着它们同样能被 @ 提及、同样出现在统一搜索里、同样有自己的引用面板。
二是有 unknown 这个兜底类型。任何模型都要面对”塞不进已有类型的东西”,Macro 的处理是给它一个正式的类型位,而不是拒绝收录。一个文件哪怕系统认不出,它仍然是块,仍然能被引用、被搜到、被共享。
顺带说一句,官方首页把面向用户的核心块整理成十张卡片(邮件、消息、任务、文档、Canvas、Agent、通话、文件存储、Pull Request、CRM),和上面这份类型清单是两种切分口径,别把两个数字对起来看。
每个块自带的四样东西
块模型真正省事的地方,是下面这几样设施不需要为每种类型各做一遍。文档里明确写了它们对所有块生效:
| 设施 | 官方文档写明的行为 |
|---|---|
| References 面板 | 每个块都有,聚合它被提及或被嵌入的所有位置(反向链接) |
| 共享对话框 | 每个块都是同一个,访问级别为 owner / editor / commenter / viewer,文档另外支持公开链接 |
| 统一搜索 | 一份索引覆盖每一种块类型,可按类型筛选,也可按”提到了谁”筛选 |
| 统一收件箱 | 把跨块的未处理通知拉进一个按时间倒序的列表 |
第一行是最容易被低估的。反向链接在笔记类工具里很常见,但那通常只在”笔记”这一种类型内部成立。Macro 把它放在块这一层,意味着一封邮件的引用面板里可以出现提到它的任务、频道消息和文档;一个 CRM 公司记录能直接看到哪些通话、哪些文档提过它。这正是官方首页说的”双向数据库”在具体产品层面的落点——你 @ 提到某个文档,消息和文档双方都知道对方存在,事后能反查一件事到底在哪儿被讨论过。
第三行的”可按提到了谁筛选”也是块模型的直接产物:人也是可被提及的对象,提及关系统一存在库里,搜索层才有办法拿它当过滤条件。搜索的具体用法见统一搜索那篇。
提及和嵌入:一个反直觉的权限差异
这是 blocks 文档里最该划重点的一段,因为它和很多人的直觉相反。
官方首页描述权限模型时说的是”权限继承自频道”:在频道里 @ 提及某样东西,频道所有成员自动获得访问权,省掉了”能不能把这个共享给我”的来回。听到这里很容易顺推出一个结论——只要提到了,别人就能看。
但 blocks 文档明确写了另一半:在文档里做的嵌入和提及不会自动授权,这一点和频道内的提及不同。你在文档里嵌了一份文件,还得另外把这份文件共享出去,对方才看得到。
这个差异是有道理的。频道有明确的成员边界,“在这个频道里说的,频道成员都能看”是一条闭合规则;文档没有等价的成员集合,一份文档可能被公开链接分享出去,如果嵌入自动授权,等于一次分享就把嵌进去的所有东西一起放了出去。所以这条不是遗漏,是刻意的收口。落到实操上就是一条检查项:文档里嵌了东西,就单独确认一遍被嵌对象的共享设置。完整的权限层级见权限模型那篇。
嵌入的另外两条事实:大多数块能以只读方式嵌进 markdown 文档,编辑和标注工具在嵌入态下是禁用的;创建嵌入的路径是先按 @ 或直接拖放生成一个提及,再把这个提及转换成嵌入(文档里给的操作名是 Convert to embed)。也就是说嵌入不是一种独立的插入动作,而是提及的一个升级态——这又是块模型的一致性体现:先有引用关系,再决定它以什么形态呈现。
至于提及本身的呈现,文档说的是大多数块类型带悬停预览:在任何 markdown 区域(任务、文档、频道等)@ 提及一个块,看到这条提及的人悬停就能拿到上下文,不必点进去。
协作块的同步路径:Loro CRDT + Durable Objects
数据模型统一了,同步却不必对所有类型一视同仁。文档只把”协作块”——具体点名了文档和 PDF 标注——放进了实时协作通道,这条通道的技术路径写得相当具体:
客户端 --WebSocket--> /document/:id
|
Rust sync-service
|
Cloudflare Durable Objects(每份文档一个 "room")
|
Loro CRDT 合并
拆开看是四件事:冲突合并用 Loro CRDT;后端跑在 Cloudflare Durable Objects 上;由 Rust 写的 sync-service 为每份文档拉起一个独立的 Durable Object “room”;客户端通过 WebSocket 连到 /document/:id。文档说这套组合带来的是多人同时编辑、在线状态光标,以及完整的离线支持。
CRDT 这个选型和”离线支持”是绑定的:无中心仲裁的合并算法,才允许客户端断网期间照常改、联网后再合。而”一份文档一个 room”这种分片粒度,也让并发压力天然按文档散开。这里官方文档没有给任何性能数字,我也不替它编。
Splits:一个标签页里的窗口管理
块模型在交互层的配套是 splits。文档写明这是 Macro 自带的窗口管理器,让你在浏览器的一个标签页里并行处理多件事,仅桌面端有,移动端没有;打开 Macro 时默认是一个 split。
因为所有东西都是块,“在新 split 里打开”就成了一个通用动作,不需要为每种类型单独设计:shift+点击一个 @ 提及或列表项,就把它开到新 split。每个 split 维护自己的历史记录。
| 操作 | 快捷键 |
|---|---|
| 新建 split | cmd + \ |
| 焦点左移 / 右移 | shift + h / shift + l |
| 最大化 | shift + escape |
| 关闭 | cmd + escape |
| 后退 / 前进(split 内历史) | opt + [ / opt + ] |
能同时开几个 split,文档说取决于显示器尺寸和缩放比例;放不下时 Macro 不会再开新的,得先关掉一个。
和「一堆 SaaS 各存各的」差在哪
只按文档写明的事实并列,分歧落在这几处:
- 引用关系存在库里,不是存在 URL 里。 跨工具引用的本质是一段文本形式的链接,被引用方无从知晓;块之间的提及是双向的,两边都知道对方,所以才有 References 面板可看。
- 共享对话框只有一个。 owner / editor / commenter / viewer 这套级别对所有块类型一致,不需要在网盘、文档工具、工单系统里各学一套权限术语。
- 搜索是一份索引。 覆盖每种块类型,按类型和”提到了谁”筛选;多工具并存时这件事只能靠各搜一遍。
- 通知汇成一个按时间倒序的列表。 跨块的待处理项进同一个收件箱。
- Agent 拿到的是同一份库。 官方首页的原话是”一个界面、一个双向数据库、给你的 Agent 用的共享记忆”。这也是 Macro 的 MCP 工具能用统一的”实体”口径去列对象、读属性、改属性的前提,具体见实体类工具那篇。
官方文档自己也拿几个成熟产品做过参照——按它的说法,邮件比 Superhuman 快且带统一收件箱,消息比 Slack 更聚焦、更少噪音,文档比 Notion 简单,任务借鉴 Linear 但少一些仪式感(周期、点数这些”真想要”也有,但官方建议别用)。这是官方文档的说法,不是实测结论,我们没有安装运行过,不做优劣判断。
什么时候这套模型不解决你的问题
块模型不等于零迁移成本。 好处来自”所有东西都在这一份库里”,反过来说,只要一半内容还留在原来的工具里,双向链接和统一搜索就只覆盖一半。分裂使用的收益,比全量迁移小得多。
文档嵌入不自动授权这条会持续制造摩擦。 它是安全上的正确取舍,但从用户视角看就是”我明明嵌进去了,对方还说打不开”。团队协作流程里得固化一条共享检查,别指望模型替你兜住。
splits 是桌面端特性。 文档写明移动端没有窗口管理器,能开几个还受显示器尺寸和缩放限制。如果你的主要使用场景在手机上,这部分体验并不存在。
实时协作只覆盖了协作块。 文档点名的是文档和 PDF 标注走 CRDT 通道,其它块类型的同步机制官方文档在这一页没有说明,不要默认”所有块都有离线编辑和多人光标”。
最后一件容易搞混的事:类型清单里的 15 个标识和首页那十张核心块卡片,是两套切分口径。前者是数据模型层面的一等类型,后者是面向用户的功能分组。讨论”Macro 有几块”的时候,先说清你问的是哪一层,否则两个人说的根本不是一回事。
延伸阅读
- 从头读起:Macro 是什么:邮件、任务、文档、CRM 共用一个双向数据库的开源工作区
- 本专题共 40 篇,完整分组目录见专题页
- Macro 的 @ 提及机制:一个 @ 同时决定引用、通知和访问权限
- Macro 的 properties 机制:给邮件、任务、文档挂上同一套结构化字段
本文依据 Macro 官方仓库(github.com/macro-inc/macro,AGPL-3.0 协议)的 apps/docs/ 产品文档、
MCP 工具参考与自托管说明整理,核对日 2026-08-17。
我们没有注册或运行过 Macro,因此不涉及界面外观与操作手感;
官方标注为计划中的能力文中已如实标明,不代表当前可用。
价格与额度以官网 macro.com 最新页面为准;许可证相关问题请咨询专业人士并以官方许可证原文为准。