多端同步
三个后端挑一个,端到端加密,口令永不上传。以及它同步什么、不同步什么。
多端同步与官方同步插件属于专业版。 免费版的本地功能不受影响,也不会到期; 同步后端始终是你自己的(CouchDB / WebDAV / 云盘目录),我们不存你的任何数据。见 定价。
它是怎么工作的
每台设备都是完整对等的主副本,没有主从。
核心维护一条 append-only 的变更日志(oplog),按 HLC 做字段级收敛: 两台设备同时改同一条任务的不同字段,两边的改动都留得下来。
插件只负责把已经加密好的字节搬到远端再搬回来。它看不懂内容, 也不做任何合并判断——所有收敛逻辑在核心。
同步失败绝不影响本地读写。 这是 local-first 的底线,不是可配置项。
挑一个后端
| 后端 | 要自己跑服务吗 | 时效 | 代价 |
|---|---|---|---|
| 自建 CouchDB | 要 | ≤ 1 秒 | 唯一带实时订阅的。要维护一个服务。 |
| WebDAV | 不要 | 按轮询间隔 | 坚果云 / Nextcloud / 群晖都行。没有订阅,只能轮询。 |
| 本地文件夹 | 完全不要 | 几秒 – 几十秒 | 写进 iCloud Drive / Dropbox / OneDrive 的同步目录。什么时候到另一台取决于那个云盘客户端。 |
在「设置 → 多端同步」里选后端、输加密口令、启用即可。第二台设备用 Setup URI 接入。
加密
一律端到端加密。passphrase 存本机系统钥匙串,永不同步、永不上传。
强度下限 12 位——它同时保护同步过去的外部账号凭据(飞书 token、邮箱密码这些)。
代价说清楚:口令丢了,远端数据就解不开了(本地数据不受影响)。 这是端到端加密的定义,不是实现缺陷——能帮你找回口令的系统,也就能读你的数据。
什么时候会同步
间隔可配(1 分钟到 6 小时,默认 5 分钟,只影响这台设备、不会同步到别处)。
但那个间隔只是兜底。真正决定时效的是四条事件触发:
- 本机一有改动,约 1.5 秒后跑一轮(连续编辑合并成一轮);
- 远端来信立刻拉;
- 切回窗口 / 点托盘 / 合盖再打开也立刻拉——「打开 app 看一眼」是最常见的动作, 而没有这条时那一眼看到的可能是五分钟前的数据;
- 启动时插件一就绪就跑第一轮,不干等。
随时也能点「立即同步」。
它是有感知的
右下角有个浮动指示器:
- 同步中:一个转着的小圆(只转的时候是个正圆,转就是全部信息);
- 刚同步完:短暂展开说一句;
- 需要处理(缺口令 / 后端不可用 / 出错):停在那儿,可点进设置页。
拉到新数据会立刻让界面刷新(主窗口与浮窗都刷),不必切页面或重启。
订阅是不是真的活着,设置页里会如实写出来(已连接 / 已退回轮询 / 该后端不支持)—— 它可以静默失效,不说的话你只会觉得「有时候快有时候慢」。
积压大的时候
一台设备停了一周再打开:最近的改动秒级到位,历史按轮次从旧往新补齐。 补的时候界面上会写「正在补齐历史数据,还剩 N 项」——不说的话看起来就像旧数据丢了。
同步什么
任务、排期块、事件、日历、标签、提醒,以及全部用户偏好。
包括外部同步落库的那些:飞书项目的「中台开发」这类排期块只落在持租约的那台设备上, 不同步其余设备就永远看不到。
库里在同步上线之前就存在的数据由 seed 每轮自愈补上,你不需要做任何事。
不同步什么
如实列清楚,这些都是会让人以为出 bug 的事:
- 「谁打了哪些标签」暂时不同步。 标签本身会同步,但任务 / 事件与标签的关联 (纯关联表、没有软删列)表达不了「删掉一条关联」,要先加迁移。
- 日历叠加层的数据(考勤、请假)不进数据库、不参与同步。
- 加密口令永不同步。
- 两台设备各建了同名标签或同名同步实例时,那条记录会被跳过, 并在同步完成的提示里报出条数。跨行唯一约束没法靠字段级收敛维护; 跳过是为了不让一条记录拖垮整轮同步——改掉重名的那个再同步即可。
当前的几个限制
- journal 压实。所以远端的对象数只增不减;只是每轮同步的开销不再随它增长。
- 已经被改过的旧行只能补到「改动过的那几个字段」,其余字段在对端仍是骨架值。 出口是设置页的「重置远端」全量重推。
- 账号登录(作为第三个接入方式,而不是前提——不登录也能同步、也能完全离线)。