跳到正文
安时安其时,成其事
下载

多端同步

三个后端挑一个,端到端加密,口令永不上传。以及它同步什么、不同步什么。

多端同步与官方同步插件属于专业版。 免费版的本地功能不受影响,也不会到期; 同步后端始终是你自己的(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. 本机一有改动,约 1.5 秒后跑一轮(连续编辑合并成一轮);
  2. 远端来信立刻拉;
  3. 切回窗口 / 点托盘 / 合盖再打开也立刻拉——「打开 app 看一眼」是最常见的动作, 而没有这条时那一眼看到的可能是五分钟前的数据;
  4. 启动时插件一就绪就跑第一轮,不干等。

随时也能点「立即同步」。

它是有感知的

右下角有个浮动指示器:

  • 同步中:一个转着的小圆(只转的时候是个正圆,转就是全部信息);
  • 刚同步完:短暂展开说一句;
  • 需要处理(缺口令 / 后端不可用 / 出错):停在那儿,可点进设置页。

拉到新数据会立刻让界面刷新(主窗口与浮窗都刷),不必切页面或重启。

订阅是不是真的活着,设置页里会如实写出来(已连接 / 已退回轮询 / 该后端不支持)—— 它可以静默失效,不说的话你只会觉得「有时候快有时候慢」。

积压大的时候

一台设备停了一周再打开:最近的改动秒级到位,历史按轮次从旧往新补齐。 补的时候界面上会写「正在补齐历史数据,还剩 N 项」——不说的话看起来就像旧数据丢了。

同步什么

任务、排期块、事件、日历、标签、提醒,以及全部用户偏好。

包括外部同步落库的那些:飞书项目的「中台开发」这类排期块只落在持租约的那台设备上, 不同步其余设备就永远看不到。

库里在同步上线之前就存在的数据由 seed 每轮自愈补上,你不需要做任何事。

不同步什么

如实列清楚,这些都是会让人以为出 bug 的事:

  • 「谁打了哪些标签」暂时不同步。 标签本身会同步,但任务 / 事件与标签的关联 (纯关联表、没有软删列)表达不了「删掉一条关联」,要先加迁移。
  • 日历叠加层的数据(考勤、请假)不进数据库、不参与同步。
  • 加密口令永不同步。
  • 两台设备各建了同名标签或同名同步实例时,那条记录会被跳过, 并在同步完成的提示里报出条数。跨行唯一约束没法靠字段级收敛维护; 跳过是为了不让一条记录拖垮整轮同步——改掉重名的那个再同步即可。

当前的几个限制

  • journal 压实。所以远端的对象数只增不减;只是每轮同步的开销不再随它增长。
  • 已经被改过的旧行只能补到「改动过的那几个字段」,其余字段在对端仍是骨架值。 出口是设置页的「重置远端」全量重推。
  • 账号登录(作为第三个接入方式,而不是前提——不登录也能同步、也能完全离线)。