Macro:用 Rust 重写整个公司工作区,还让 Agent 当 CRDT 协作的一等公民

Macro:用 Rust 重写整个公司工作区,还让 Agent 当 CRDT 协作的一等公民

把 Slack、Linear、Notion、HubSpot、Superhuman 全塞进一个 app,还全开源。

先说一个真实痛点。Macro 的创始团队在 README 里写得很直白:他们上一个创业公司扩张到约 20 人时,工具链崩了。每个团队各用各的--Slack 聊天、Linear 管任务、Notion 写文档、HubSpot 管 CRM、Superhuman 收邮件,公司靠 MCP 和 Zapier 粘在一起。原文那句话值得直接引用:"The company was not computable. It was chaotic."(公司不可计算,一片混乱。)

Macro 是他们对工作软件的推倒重设计:Email、聊天、文档、任务、AI Agent、通话、CRM 统一进一个快速界面,全部通过双向 @链接打通,外加团队级共享 AI 记忆。NYC 和 Toronto 的团队开发,约 15 人内部用了两年才开源。当前 3,962 星、AGPLv3(明确写了 not open core)、Rust 后端 + SolidJS 前端。

这个项目最让我感兴趣的其实不是"又一个 all-in-one",而是它对 AI Agent 的处理方式--这是第一个把 Agent 当成协作系统 peer(对等者)的工作区。

本文提纲

  1. 一体化的代价与解法:模块化 blocks
  2. 双向 @链接:把工作区变成一张图
  3. 团队级 AI 记忆:每晚刷新一次,纯 markdown 存储
  4. Agent 是 CRDT 里的 peer,不是外挂
  5. 42 个服务、167 个 Rust crate 的重型工程
  6. 本地跑起来:Nix + just
  7. 坦诚的局限与开源态度

一体化的代价与解法:模块化 blocks

"一体化工作区"不是新想法,为什么大多数失败了?因为一体化通常意味着每个模块都做得平庸。Macro 的策略是模块化 blocks,每个 block 对标一个最佳产品并试图超越它:

Block 对标 差异点
Email Superhuman 键盘优先、多 Google 账号统一收件箱、cmd+k 直达联系人或公司
Messages Slack 前几条回复内联、其余折叠进 thread,更聚焦
Tasks Linear 更激进--"issue tracking never really worked",任务与频道紧耦合
Docs Notion Markdown 原生 + CRDT 实时协作、历史版本、fork、离线编辑
Canvas - 2D 白板,可嵌入 @链接
Calls - 录音、转写、自动写入团队记忆
CRM HubSpot 每个 deal 自动获得专属"频道"作为笔记

注意 CRM 这行。Macro 对 CRM 的核心判断是:CRM 不保持更新,是因为 deal 的真正对话发生在消息里而不是 CRM 里。所以它把 CRM 记录和聊天频道直接打通--deal 频道里的对话就是 CRM 的活数据,不需要任何人手动同步。README 对 CRM 部分甚至自嘲:"We haven't innovated on the core idea of CRM... None of this should be that interesting."--重心根本不在 CRM 本身,在打通。

双向 @链接:把工作区变成一张图

Macro 的架构级设计有四条,第一条是最基础的:Bidirectional @linking(双向 @链接)

在消息里 @一篇文档,双方互相知道。文档知道谁提到了它,消息知道它提到了什么。原生存储就是一张双向图。这个设计配合第二条 Channel-based permissions 发挥威力:在频道里 @的任何东西自动共享给频道成员,加入频道即获得权限,退出即失去--没有"申请权限"的流程。

第三条是 One inbox:邮件、频道消息、任务分配、@提及、Agent 回复全部进一个收件箱,分成 Signal 和 Noise 两类,j k e 键盘导航一切。

这三条合起来是个完整的答案:工具碎片化的本质是上下文碎片化,权限碎片化又是协作摩擦的来源。把三者一起解决,才配叫"一体化"。

团队级 AI 记忆:每晚刷新一次,纯 markdown 存储

Agent 记忆是 Macro 在 AI 叙事上最独特的点。

它的记忆模型是团队级的:Agent 记住整个团队(而非个人)在邮件、消息、任务、文档、通话中做的事。实现方式很克制--每晚一个 cron job,把所有来源单次综合(one pass)成一份记忆,而不是分别合成再拼接。存储格式是纯 markdown,随时可导出。

这个"file over app"的选择值得玩味。记忆不是锁在数据库里的 embedding,是一份人类可读、可编辑、可 git 管理的文档。你不满意 AI 的记忆?直接改文件。

记忆还能通过 MCP 提供给任何外部 Agent:

claude mcp add --transport http macro https://mcp-server.macro.com/mcp

一行命令,Claude Code 就能接入 Macro 的团队记忆和工具面。README 说 MCP 工具对 UI 能力的覆盖率"接近 100%",且MCP 无速率限制--第三方 Agent 在 Macro 里能做的事,几乎和真人用户一样多。

Agent 是 CRDT 里的 peer,不是外挂

这是我认为整个项目技术上最有趣的决定。

Macro 的文档协作基于 CRDT(Cloudflare Durable Objects 之上)。Agent 编辑文档时,像 CRDT 协作系统里的"人"一样以 peer 身份参与--不是通过某个特殊的 API 通道,而是和真人用户走同一套协作协议。README 里有个自动化的例子很生动:

"我们有一个每天运行的 Macro Automation,更新办公室台球游戏的 markdown 文档。它扫描所有频道看有没有人赢了一局,然后更新文档。如果有人已经手动编辑过文档,它能感知到并放弃更新。冲突由 CRDT 协作系统原生处理。"

多个 Agent 同时编辑同一篇文档、和真人同时编辑、离线再合并--全部由 CRDT 的冲突解决机制原生处理。Agent swarm 作为协作者而不是工具调用,这个心智模型和其他产品把 Agent 当"外挂大脑"的做法完全不同。

另一个 README 里的用户场景:

"我把写在纸质笔记本上的功能点拍了张照片,让 agent 创建 tickets 并分配给合适的工程师--它没用到任何运行时工具就完美完成了。"

最新 main 分支的提交还在往这个方向推进:"give ai tools to create and manage bots"(AI 可以创建和管理 bot)、"local Docker sandboxes"(Agent 本地 Docker 沙箱)。

42 个服务、167 个 Rust crate 的重型工程

代码规模值得单独一节。仓库约 17,030 个文件,结构如下:

macro/
├── apps/
   ├── web/       SolidJS client - browser, Tauri desktop, mobile
   └── docs/      docs.macro.com
├── services/      42 deployable services, workers, and Lambda handlers
├── crates/        167 Rust libraries - domain logic, models, db clients
├── packages/      shared TypeScript - collaboration, lexical-core, loro-mirror
├── infra/         Pulumi definitions
├── docker/        local Compose stack
├── nix/           pinned dev shell and build inputs
└── tooling/       repo scripts and code generators

42 个可部署服务里包括 mcp_serviceagent_harness_serviceemail_servicetranscriptionlexical-servicecoding-agent-workersync-service 等。服务采用六边形架构(hexagonal layout):入站适配器、带 ports 的领域核心、出站适配器。本地栈在 Docker 里跑 Postgres、Redis、LocalStack、OpenSearch、Kafka、FusionAuth。

有个细节能看出这个代码库对 AI coding agent 的友好程度:每个文件树里有 .claude/.cursor/.zed/.helix/AGENTS.mdCLAUDE.md。这就是为 AI 协作深度优化的仓库的样子。

安全性方面有 SOC 2 Type II 认证和 ISO 27001,与模型提供商零数据保留、不用客户数据训练。

本地跑起来:Nix + just

自部署路径(来自 docs/RUNNING_LOCALLY.md):

git clone https://github.com/macro-inc/macro.git
cd macro

nix develop          # Nix 提供全部工具链:just、Cargo、Bun、sqlx

just run_local --no-doppler   # 无 Doppler 权限的普通贡献者路径

just seed-scenario apply --file seed/scenarios/team-perms.json  # 灌入演示数据

本地栈用确定性 stub 替代第三方集成密钥(Google/GitHub/Stripe/CloudFront),auth、文档、邮件、搜索等核心功能完整可用。登录验证码邮件落在本地 Mailpit(http://localhost:8025)。

Nix 是唯一的宿主依赖--有人会觉得重,但换来的是"所有人拿到完全相同的工具链"。托管版则直接注册连 Gmail,约 15 分钟完成初始设置,有 iOS App,Android 还没发布。

版本发布用日期式 calver(如 v2026.8.20.2),8 月 20 日一天发了 3 个版本,节奏极快。

坦诚的局限与开源态度

README 和 CONTRIBUTING 里的坦诚程度在同类项目里少见:

  • 文档版本控制:"still in v1",要接近 git 还有很多要做,可能最终加 git 兼容
  • 邮件仅支持 Gmail/Google 账号
  • Android 未发布
  • 本地开发强依赖 Nix
  • 贡献政策:"Unreviewed AI output submitted as-is wastes reviewer time and will be closed."(未经人工审阅的 AI 生成 PR 会被直接关闭)--和 Prime Agent 一样,这是 agent 时代开源治理的先行实验

AGPLv3 + not open core 的立场在商业化产品里不多见。商业授权走 licensing@macro.com,托管版和自部署版功能同源。对比那些核心功能闭源的"开源"项目,Macro 的选择意味着你可以真的把它 fork 走。

要不要切过去?我的判断:如果你的团队正被工具碎片化折磨(尤其是 CRM 和聊天割裂、Agent 没有团队记忆这两个痛点),值得试。邮件只支持 Gmail 这条要先确认。如果你重度依赖某个单品的深度功能(比如 Linear 的_cycle 管理、Notion 的 database view),迁移成本要算清楚--每个 block 对标最佳产品,但"对标"不等于"追平"。

参考文档与链接

你的公司现在用几个工具拼工作流?切到一体化工作区的最大顾虑是什么?评论区聊聊。觉得 Rust 重写工作区这事靠谱的,点个赞。


作者: itech001
来源: 公众号:AI人工智能时代(the-ai-era)
网站: https://www.theaiera.top/
关注每日最新AI新闻和技术博客,主页有更多的文章的AI 技术参考:https://www.theaiera.top

本文首发于 AI人工智能时代,转载请注明出处。

posted @ 2026-08-22 22:50  iTech  阅读(6)  评论(0)    收藏  举报