安全机制 & 数据流
最后更新:2026-04-25 · v2.2
SoloMD 是纯客户端桌面 / 移动应用。没有 SoloMD 服务器, 没有 SoloMD 账号,没有 SoloMD 云端。下面把产品里所有可能涉及数据的地方 和我们的保护机制全部讲清楚。
1. 笔记内容 — 永远在你的硬盘上
-
每条笔记都是工作区文件夹里的一个普通
.md文件。没有专有 数据库,没有不透明的二进制格式。 -
就算卸载 SoloMD,你的文件还在原地,Obsidian / VS Code / 记事本 /
cat全都能打开,完全不锁定。 - Tauri 的文件系统权限只限你打开的工作区,App 无法扫描你硬盘的其他位置。
- 代码里根本不存在"同步到云端"的路径。我们想上传你的笔记都做不到。
2. API Key — 系统钥匙串,不落盘明文
-
14 家 AI 厂商的 API key 通过
keyring-rs存储,实际位置:- macOS → Keychain(硬件加密)
- Windows → Credential Manager(凭据管理器)
- Linux → libsecret / GNOME Keyring
-
Key 绝不写入
localStorage、settings.json、日志、任何配置文件。 - 只在调用 AI 的那一瞬间从钥匙串取出,Rust 后端读出后直接发给厂商,然后 就丢弃。前端从来拿不到 key 的明文。
- 你在设置里删除某个厂商的 key,会立刻从钥匙串里删除。
3. AI 改写 — 默认关闭,直连,只发选中文字
- AI 默认关闭。需要你在设置里手动开启,并填自己的 key (BYOK)。我们不托管任何模型。
- 触发改写时只发送你选中的那一段。不带文件名、文件路径、 上下文段落,也不带任何笔记元信息。
- 请求直接从你的电脑发到你选的厂商 — 没有 SoloMD 中转, 没有日志,没有拦截。我们看不到内容,因为它根本不经过我们。
-
"验证 key" 也是直连厂商的
/models接口。
4. MCP Server — 默认只读,带路径穿越防护
-
自带的
solomd-mcp二进制默认只暴露 6 个只读工具:list_notes、read_note、search、get_backlinks、list_tags、get_outline。 -
写入工具(
write_note、append_to_note) 必须用显式的--allow-write启动参数才能开启。 默认 = 只读。 -
每个路径参数都会做
canonicalize+ 工作区根目录前缀校验。 类似../../etc/passwd的访问会在任何 I/O 之前被拒绝。 - MCP 通过 stdio 在本地通信,不开任何网络端口。
5. 本地 RAG / 语义搜索 —— 数据从不离开磁盘
- v2.3 新增了语义搜索面板(⌘⇧F)。和 SoloMD 里其他功能一样, 默认关闭。在「设置 → 启用语义搜索」开启后才会建立索引; 关闭状态下不扫描、不生成索引文件、零开销。
-
开启后,笔记会按段落切块,使用一个完全在 Rust 进程里运行的
哈希三元组嵌入器生成向量。不会下载任何模型文件 ——
自带嵌入器无需权重、无需联网。向量存放在
<workspace>/.solomd/embeddings.sqlite, 就是一个普通 SQLite 文件,可以用sqlite3 <file> .schema直接查看结构。 - 查询语句也在本地完成嵌入。排序在 Rust 里直接做暴力余弦相似度 —— 没有任何远程 API 调用,没有查询日志,没有网络流量。
-
索引目录
.solomd/会被自动加到工作区的.gitignore,AutoGit 不会把嵌入索引提交进版本历史。 - 隐私小结:查询文本 → 本地嵌入函数 → 本地 SQLite 扫描 → 排序结果。查询文本从不接触任何网络套接字。
6. AutoGit — 本地提交,绝不自动推送
-
自动提交只发生在你工作区里的本地
.git仓库,绝不会自动 push 到任何远程。 - 推送由你掌控。想推到 GitHub / 私服,用你喜欢的 git 工具手动推。
-
它就是普通的 git 仓库,所有提交都能用
git log审计, 没有隐藏状态。
7. 遥测 — 极少 + 可关 + 不带内容 + 可见
- 只发匿名事件计数(打开次数、用了哪个功能),帮我们决定接下来做什么。
- 绝不发送:笔记内容、文件名、文件路径、工作区路径、 API key、搜索关键词,或任何能识别个人身份的信息。
- 设置里一键关闭。App Store 版本默认关闭。
-
想看到底发了什么?打开 DevTools 执行
localStorage.setItem('solomd.telemetryDebug', '1'), 所有事件会原样打印到控制台。
8. 沙箱 & 供应链
- Tauri 2 把 Webview 和操作系统隔离 — 渲染层只能调我们显式注册的 Rust 命令。
- Rust 后端没有 eval,也没有把用户输入拼到 shell 命令里这种事。
- 所有依赖都钉死版本,锁文件随仓库一起发布。每个版本都从 GitHub Actions 上的 tag 提交构建。
- macOS 构建经过 Apple notarize,Windows 构建有签名。
9. 透明 — MIT 开源
上面所有的说法都可审计。整个代码库都是 MIT 协议:
-
想验证钥匙串处理?读
app/src-tauri/src/ai_proxy.rs -
想验证 MCP 路径校验?读
mcp-server/src/main.rs -
想验证遥测里没有笔记内容?在仓库里搜
trackEvent
报告漏洞
发现安全问题?发邮件到 [email protected],我们 72 小时内回复, 并在版本说明里致谢(除非你希望匿名)。