判断一款笔记应用是否适合保存私人内容,不能只看“本地优先”或“隐私设计”这样的标签。更有用的问题是:在一次具体操作中,哪些数据离开设备,交给了谁,哪个设置能改变这条路径?
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 无法用自身沙盒约束另一个应用。
可以采取的最小授权措施包括:
- 保持不需要的会话
mcpAccessEnabled关闭;新会话默认就是关闭状态。 - 开始任务前只开放必要会话,结束后关闭。
- 先用列表和搜索工具做只读验证,再允许写入或重组。
- 对客户端的数据保留和模型设置做独立判断。
会话密码:防止界面中的日常误看
设置会话密码后,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 时按任务开放会话,完成后收回权限。
- 对不需要长期保存的内容设置过期,但不要存放真正的认证秘密。
- 定期导出需要长期掌控的资料,并保护好导出文件本身。
隐私不是一句“数据属于你”,而是一组可以核对的数据路径和限制。知道每个功能跨越了哪条边界,才能决定某条内容是否适合放进去。
