你的书签数据到底去了哪里?Siftly本地优先架构与隐私安全全解析
【免费下载链接】SiftlyLocal Twitter/X bookmark organizer with AI categorization and mindmap visualization项目地址: https://gitcode.com/gh_mirrors/si/Siftly
Siftly 是一个运行在你自己电脑上的本地优先 Twitter/X 书签管理工具:导入书签后,AI 自动分类打标,并提供思维导图与语义搜索。它没有云端账户、没有订阅、没有遥测追踪——你的书签数据默认永远不会离开本机,这是理解它隐私边界的关键。
一、本地优先意味着什么?
"本地优先(Local-First)"不是营销口号,而是指数据的默认存储位置和主权:
- 数据存在哪?全部落在本机一个 SQLite 数据库文件里(默认
prisma/dev.db),路径可在 lib/db.ts 中看到,通过环境变量DATABASE_URL覆盖。 - 数据归谁?归你。删掉这个文件等于彻底删除所有书签,反过来备份一个文件就完成全部迁移。
- 谁在看?没有遥测、没有追踪、没有账号体系——README 的 Privacy 章节 明确写道:唯一的例外是"你主动配置的 AI 接口"。
换句话说,Siftly 的隐私模型可以用一句话概括:数据留在本地,AI 调用透明可控,其他第三方服务器一概不碰。
二、数据流全景:从书签到 SQLite
理解"数据去了哪里",先看数据"怎么流动":
你的 X 书签页 │ ① 内置 Bookmarklet 自动滚动抓取 ▼ bookmarks.json(下载到本地) │ ② 拖拽上传到 Import 页面 ▼ SQLite 数据库(Bookmark / MediaItem / Category 等表) │ ③ AI 四级流水线:实体提取 → 视觉分析 → 语义打标 → 分类 ▼ 带分类、标签、置信度的完整知识库- 导入入口:app/api/import/ 目录下的路由负责接收 JSON 文件并自动去重;
- 表结构设计:prisma/schema.prisma 定义了
Bookmark、MediaItem、BookmarkCategory、Category、Setting、ImportJob六张表——你的推文原文、原始 JSON、AI 标签、分类置信度全部存在这些表里; - 搜索加速:SQLite 的 FTS5 全文索引在 lib/fts.ts 中于运行时维护,让"按语义搜索"能在纯本地数据库上跑起来。
整个过程不经过任何 Siftly 官方的"服务器",因为 Siftly 根本没有服务器——"云端"就是你的硬盘。
三、唯一的例外:AI 调用会发什么出去?
Siftly 的 AI 功能(图像视觉分析、语义打标、智能搜索)确实需要把数据发给大模型提供方,这是本地优先架构中唯一的数据出口。它的设计是"透明且可选"的:
1. 发出什么?
- 推文文本与图片数据,仅在你触发 AI 流水线时发送;
- 实体提取(hashtags、URL、@提及、100+ 已知工具名)是纯本地完成的,零 API 调用,这部分源码在 lib/rawjson-extractor.ts。
2. 发给谁?
你配置谁就发给谁。支持 Anthropic、OpenAI、MiniMax 三家,切换逻辑见 lib/settings.ts。更妙的是支持ANTHROPIC_BASE_URL指向任意本地代理或本地模型——把接口指向 localhost,数据就一步都不出机器。
3. 用不用都行?
可以。不配置任何 AI 密钥时,导入、浏览、筛选、导出、思维导图照常工作,只有 AI 打标和语义搜索不可用。隐私与功能之间的权衡,完全由你把控。
四、密钥与凭证如何保管?
API 密钥本身也是敏感数据,Siftly 的存储策略值得参考:
| 凭证类型 | 存储位置 | 说明 |
|---|---|---|
| API 密钥 | 本地 SQLite 的Setting表 | 存在你自己的数据库文件里,不出本机 |
| Claude CLI 登录态 | 系统钥匙串(macOS)/~/.claude/目录 | 只读取你已登录的会话,lib/claude-cli-auth.ts 展示了读取逻辑,绝不回传任何地方 |
| Docker 环境变量 | docker/.env(已 gitignore) | docker/README.md 明确注明"密钥只留在本地" |
值得注意的是 lib/claude-cli-auth.ts 中的认证优先级:请求覆盖键 → 数据库保存的密钥 → CLI 会话 → 环境变量 → 本地代理。整个解析链都在你本机进程内完成,没有第三方中转。
五、访问控制与供应链安全细节
很多本地工具把"安全"止步于"数据在本地",Siftly 在细节上还做了两层防护:
1. 可选的 HTTP 基础认证
middleware.ts 实现了全局 Basic Auth:在.env中设置SIFTLY_USERNAME和SIFTLY_PASSWORD后,局域网内访问 Siftly 需要登录。默认不启用(纯本地使用零配置),但暴露到内网时一开关即生效。
2. 媒体代理白名单
app/api/media/route.ts 中的媒体代理只允许转发pbs.twimg.com等 5 个固定域名,且强制 HTTPS——这不是功能需求,而是防止 SSRF(服务器端请求伪造)的典型防御:你的本地服务绝不会被诱导去访问任意外部地址。
3. 漏洞报告通道
安全问题走私有渠道而非公开 Issue,响应承诺 48 小时内确认,详见 SECURITY.md。MIT 许可证源码开放,所有"安全承诺"都可直接在代码中逐行验证——这是本地优先工具最独特的安全优势:你审计不了大厂的黑盒,但可以审计 Siftly 的每一行。
六、Docker 部署下数据照样"本地"
用 Docker 跑 Siftly 会引入一层容器隔离,但数据主权不变:
- SQLite 文件存放在命名卷
siftly_data → /data/dev.db,docker compose down重启不丢数据; - 备份一条命令完成,重置也是一条命令——见 docker/README.md 的 Data Persistence 章节;
- 密钥通过
docker/.env注入,该文件被 gitignore,永不入库。
本地开发 → prisma migrate dev 镜像构建 → prisma generate 容器启动 → prisma migrate deploy → next start数据始终绑定在本地卷上,容器可随时销毁重建,书签毫发无损。
七、如何自己动手验证隐私承诺?
本地优先架构最大的好处是"可验证"。你可以亲手做三件事来确认:
- 抓包验证:不配置 AI 密钥时运行 Siftly,用任意抓包工具确认除 X 媒体 CDN 外没有任何出站请求;
- 翻数据库:
npx prisma studio打开数据库 GUI,确认所有书签都在dev.db这一个文件里; - 读源码:全文检索项目中所有
fetch(调用,逐一核对目的地——你会看到媒体代理白名单和 AI 配置端点是仅有的两个出口。
总结:一条清晰的隐私边界
| 数据类型 | 去向 | 是否可配置 |
|---|---|---|
| 书签文本、图片、AI 标签 | 仅本地 SQLite | 可改存储路径 |
| 实体提取、搜索、分类浏览 | 纯本地计算 | — |
| AI 打标、语义搜索 | 你指定的模型服务商 | 可换供应商/本地代理/关闭 |
| API 密钥 | 本地 SQLiteSetting表 | — |
| 遥测、账号、追踪 | 无 | — |
Siftly 的"本地优先"不是把云端服务搬到家里,而是从架构第一天就把数据主权交还给你:一个文件即全部数据,一个开关即数据边界。对于把书签当作个人知识库的 X 用户来说,这套"默认本地、例外透明"的隐私模型,值得作为自选部署(self-hosted)工具的参考范本。
如需部署,从 start.sh 一键启动脚本开始:
git clone https://gitcode.com/gh_mirrors/si/Siftly.git cd Siftly ./start.sh【免费下载链接】SiftlyLocal Twitter/X bookmark organizer with AI categorization and mindmap visualization项目地址: https://gitcode.com/gh_mirrors/si/Siftly
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考