Your notes. Your keys. Zero knowledge.
一款基于 Passkey 的端到端加密笔记应用
你的笔记,永远只属于你
本项目基于 VrianCao/Inkrypt 进行了修改。
| 改动 | 说明 |
|---|---|
| BlockNote 富文本编辑器 | 替换原有 Markdown 编辑器,所见即所得,支持 Markdown 快捷输入 |
| 代码块语法高亮 | 使用 @blocknote/code-block + Shiki,支持 50+ 种编程语言 |
| Yjs CRDT 同步 | 基于 Yjs 的协作框架,多设备编辑自动合并,无需手动处理冲突 |
| Shadcn/UI 组件库 | 现代化 UI 组件,统一视觉风格,深色/浅色主题支持 |
| 多主题支持 | 6 款内置主题(Graphite、Supabase、Mocha Mousse 等) |
| 全文搜索 | 标题/内容/标签搜索,带高亮预览,快速定位笔记 |
| 模糊块功能 | 选中文本后可快速应用模糊样式,隐藏敏感信息,点击可临时显示 |
| UI 设计风格 | 参考 linux-do/credit 项目的设计风格 |
| 改动 | 代价 |
|---|---|
| BlockNote 编辑器 | 包体积增大(主 JS 约 600KB gzip),不再支持原生 Markdown 源码编辑 |
| Yjs 同步 | 每次同步传输完整快照(非增量),大文档同步较慢 |
| Shadcn/UI | 依赖 Radix UI,包体积增加 |
| 移除的功能 | 移除了 Mermaid 图表、KaTeX 数学公式等 Markdown 扩展功能 |
| AI 辅助开发 | 本次改动大量使用 AI 辅助编写,代码质量无法完全保证,可能存在潜在问题 |
| 未针对移动端适配 | 未针对移动端做良好优化,手机/平板体验可能不佳 |
💡 问题:想要一个能同步、能多设备、还能真正端到端加密的笔记应用,但市面上的方案要么要你信任服务商,要么用起来太折腾。
Inkrypt 的答案:用 Passkey 做身份验证和密钥派生,真正做到端到端加密——你的笔记只有你能看。
|
|
|
|
+-----------------------------------------------------------------+
| Your Browser |
| +-------------+ +-------------+ +-------------+ |
| | WebAuthn | | IndexedDB | | React + | |
| | PRF | | (cache) | | Zustand | |
| +------|------+ +------|------+ +------|------+ |
| | | | |
| +----------------+----------------+ |
| | Encrypt/decrypt happens here |
+--------------------------+--------------------------------------+
| HTTPS (ciphertext)
v
+-----------------------------------------------------------------+
| Cloudflare Edge |
| +-------------+ +-------------+ +-------------+ |
| | Workers | | D1 | | Durable | |
| | (Hono) | | (storage) | | Objects | |
| +-------------+ +-------------+ +-------------+ |
| |
| Ciphertext stored here |
+-----------------------------------------------------------------+
| 组件 | 技术栈 | 职责 |
|---|---|---|
| 前端 | Vite + React + Zustand + BlockNote + Yjs | UI、富文本编辑、加解密、本地缓存 |
| 后端 | Hono on Cloudflare Workers | 认证、同步、CRUD |
| 存储 | Cloudflare D1 | 笔记和元数据 |
| 限流 | Durable Objects | 全局请求限流 |
推荐使用 GitHub Actions 一键部署(无需本地 clone)。
你需要准备:
DOMAIN:你的自定义域名(例如notes.example.com,必须已托管到 Cloudflare)- GitHub 仓库 Secret:
CLOUDFLARE_API_TOKEN - GitHub 仓库 Secret:
INKRYPT_SESSION_SECRET(固定的 32+ 字节高熵值) - GitHub 仓库 Secret:
INKRYPT_SETUP_TOKEN(首次创建保险库时输入)
在 GitHub 点击 Use this template(或 Fork)创建你的仓库。
进入仓库 → Settings → Secrets and variables → Actions:
- 新增 Repository secret:
CLOUDFLARE_API_TOKEN - 新增 Repository secret:
INKRYPT_SESSION_SECRET(必填;后续部署必须保持稳定) - 新增 Repository secret:
INKRYPT_SETUP_TOKEN(必填;建议 16+ 字符)
Token 最小权限建议:
- Zone:
Zone:Read、DNS:Edit、Workers Routes:Edit - Account:
Pages:Edit、Workers Scripts:Edit、D1:Edit
进入仓库 → Actions → Deploy Inkrypt → Run workflow:
- 必填:
domain - 选填:
rp_name、cors_origin、pages_project_name、worker_name、d1_name、d1_location
安全开关(默认谨慎):
force_takeover_dns=true:允许覆盖已存在但不匹配的 DNS 记录force_takeover_routes=true:允许接管已被其他 Worker 占用的 Routeswait_for_tls=false:不等待 HTTPS 就绪(默认会等待)
该工作流会自动完成:
- pnpm frozen-lockfile、类型检查、测试与构建门禁
- D1 创建与 migrations
- Worker 部署(含 D1/DO)与深度健康检查
- Pages 项目创建与 Wrangler Direct Upload
- Pages 自定义域名绑定 + DNS CNAME 自动配置
- Worker Routes 自动配置(
/api/*、/auth/*、/healthz*) - Smoke test:访问
/healthz与/healthz/deep
- 打开
https://<DOMAIN>访问 - 建议保持域名不变:
RP_ID/ORIGIN依赖域名,上线后改域名会导致已注册 Passkey 失效 - 新部署默认使用 SQLite 后端的 Durable Objects(对免费账号更兼容)
👉 完整部署说明(含排错):DEPLOYMENT.md
首次使用流程:
- 创建保险库 — 输入
INKRYPT_SETUP_TOKEN,完成 Passkey 注册并生成主密钥 - 备份恢复码 — 这是你数据的最后保险,务必离线保管
- 开始写作 — 富文本编辑器,支持 Markdown 快捷输入
- 同步与上传 —
Ctrl/Cmd + S上传,自动实时同步
👉 详细说明:USAGE_ZH.md
| 🔑 | 恢复码 = 主密钥 | 任何人拿到它都能解密你的所有笔记。离线保管,不要截图发给自己。 |
| 💾 | "记住解锁"有风险 | 开启后会在本地缓存解密材料,XSS、恶意扩展等可能趁虚而入。 |
| 🌐 | 浏览器要求 | 必须支持 WebAuthn PRF 扩展和 CompressionStream API。 |
欢迎 Issue 和 PR!
Made with 🔒 by VrianCao
Your data, encrypted. Your keys, yours.