判断一款笔记应用是否适合保存私人内容,不能只看“本地优先”或“隐私设计”这样的标签。更有用的问题是:在一次具体操作中,哪些数据离开设备,交给了谁,哪个设置能改变这条路径?

OrbNote 的普通记录、iCloud 同步、AI、语音转写和 MCP 使用不同的数据路径。下面把它们分开说明。

先看完整数据流

操作 设备本地 可能离开设备的数据 接收方
新建普通笔记 写入 Core Data 和附件存储 启用 iCloud 时同步笔记与附件 Apple CloudKit 私有数据库
AI 保存 保留原始输入和最终保存结果 当前输入、路由所需的分组/会话信息;最多 3 张符合大小限制的图片可作为请求内容发送 OrbNote AI 服务链路及其模型提供方
AI 智能整理 保存建议和采用结果 当前消息、来源与时间、附件名称/类型、已有转写或图片描述,以及现有分组和会话名称 OrbNote AI 服务链路及其模型提供方
图片 OCR Vision 在支持设备上处理 OCR 本身不需要把图片发送到 OrbNote AI 服务 无 OrbNote AI 请求
WhisperKit 转写 下载后的模型在设备上处理音频 模型下载流量;转写时音频留在本地 模型下载来源
Apple Speech 转写 调用系统语音能力 是否需要在线识别取决于系统版本、语言和可用能力 可能包含 Apple 语音识别服务
MCP 访问 OrbNoteMCP 读取 App Group 数据 工具结果经 stdio 交给 MCP 客户端 由所用客户端和模型配置决定
订阅与 AI 认证 保存 StoreKit 状态和临时凭证 购买验证信息;AI 会话认证还会把交易凭证和安装标识发送到 AI 网关换取临时令牌 Apple 与 OrbNote AI 认证服务

这张表刻意区分“OrbNote 不运营普通笔记内容数据库”和“数据完全不与任何服务器通信”。前者是当前架构的边界,后者在启用 iCloud、使用 Apple Speech、验证订阅或调用 AI 时并不成立。

普通笔记:本地 Core Data,加上可选的 CloudKit 私有同步

消息和附件首先保存在设备上。启用 CloudKit 存储配置时,NSPersistentCloudKitContainer 会把变更同步到 Apple 托管、属于当前 iCloud 账户的私有数据库,再由其他设备合并远程变更。

更准确的路径是:

设备上的 OrbNote 数据 → Apple CloudKit 私有数据库 → 你的其他设备

CloudKit 仍然是云服务;“私有”指数据库位于用户账户的私有范围,而不是公开可读,也不是 OrbNote 自建的内容服务器。同步安全还依赖你的 Apple ID、设备解锁状态、系统版本和 Apple 的平台安全机制。

AI:只在主动使用时调用,但请求不只有一句文本

OrbNote 的 AI 功能默认不是后台扫描器。AI 保存或 AI 智能整理只有在用户发起相应功能、并满足 Pro 与设置条件时才发送请求。

不过,“只处理当前操作”不应被理解为“只发送当前输入的一句话”。为了建议目标分组和会话,当前实现还会提供必要的路由上下文,例如已有分组、会话名称和当前会话。AI 智能整理可以发送附件名称、类型、已有语音转写和图片描述;AI 保存还可以把符合限制的图片内容随请求发送。

因此,使用 AI 前应该检查:

  • 当前输入是否包含不希望交给模型服务的内容;
  • 图片中是否有屏幕通知、身份证件或其他无关敏感信息;
  • 会话和分组名称是否本身就暴露私人主题;
  • 当前功能是否真的需要附件参与。

不使用 AI 功能时,普通笔记不会因为“可能以后要整理”而自动发送到 OrbNote AI 服务。

MCP:无网络的本地服务,不等于端到端不外发

macOS 版的 OrbNoteMCP 运行在 App Sandbox 中,权限文件只声明 App Group,没有网络客户端权限。它通过 stdin/stdout 把工具结果交给启动它的客户端。

这个设计减少了 MCP 进程自行联网的能力,但信任边界到客户端为止:Claude、Codex 或其他 MCP 客户端拿到搜索结果后,可能把结果发送给远程模型。OrbNote 无法用自身沙盒约束另一个应用。

可以采取的最小授权措施包括:

  1. 保持不需要的会话 mcpAccessEnabled 关闭;新会话默认就是关闭状态。
  2. 开始任务前只开放必要会话,结束后关闭。
  3. 先用列表和搜索工具做只读验证,再允许写入或重组。
  4. 对客户端的数据保留和模型设置做独立判断。

会话密码:防止界面中的日常误看

设置会话密码后,OrbNote 会在界面、搜索和 MCP 内容读取中隐藏锁定会话正文。解锁状态保存在进程内,重启后需要重新输入。

它不提供应用层内容加密:

  • 密码当前以未加盐的 SHA-256 摘要保存;
  • 消息正文在 Core Data 层没有使用该密码加密;
  • 有能力读取数据库文件或备份的人,不会被这个界面密码阻止;
  • 它不等同于端到端加密,也不应该用于保护高价值密钥或临时验证码。

会话密码适合防止同事瞥见屏幕、演示时误开私人会话或家人借用已解锁设备时随手查看。它不是针对设备取证、恶意软件或云账户失陷的防护。

消息过期:减少留存,不是安全删除证明

Pro 用户可以给会话设置保留期限。创建或移动消息时会计算 expirationDate,后台清理器每 5 分钟查询已过期消息并从 Core Data 删除;策略变化时会重新计算相关消息。

这能降低临时内容长期留在活跃数据库中的概率,但不应被描述为经过取证验证的安全擦除。删除变更还需要同步到其他设备;既有导出、系统备份、客户端缓存或此前已发送给 AI 的内容,不会因为本地消息过期而自动消失。

OrbNote 当前防护什么,不防护什么

场景 当前机制 仍需你负责的部分
OrbNote 自建服务器集中保存普通笔记 普通笔记使用本地存储和 CloudKit 私有同步 Apple ID 与设备安全
他人在 App 界面随手查看敏感会话 会话密码、搜索排除、重启回锁 使用独立强密码并及时锁屏
MCP 读取不相关会话 全局开关和会话级白名单 只开放任务所需会话,评估客户端
临时消息长期遗留 会话级过期和定期清理 不把过期当作安全擦除或撤回
数据库、备份或设备被有能力的攻击者读取 依赖系统级沙盒和设备保护 OrbNote 目前没有应用层端到端加密
AI 请求中的内容被外部服务处理 仅在使用功能时发起、限制到任务上下文 发送前检查输入、附件和路由名称

一份实际可用的隐私检查清单

  • 不需要多设备同步时,确认自己是否仍需要 iCloud 路径。
  • 对敏感内容优先使用 WhisperKit,而不是假设 Apple Speech 必然离线。
  • AI 请求前检查图片和会话名称,而不只检查输入框文字。
  • 给日常防误看的会话设置密码,同时清楚它不加密数据库。
  • 使用 MCP 时按任务开放会话,完成后收回权限。
  • 对不需要长期保存的内容设置过期,但不要存放真正的认证秘密。
  • 定期导出需要长期掌控的资料,并保护好导出文件本身。

隐私不是一句“数据属于你”,而是一组可以核对的数据路径和限制。知道每个功能跨越了哪条边界,才能决定某条内容是否适合放进去。