芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App

很多年前,我写过一篇文章:丝滑体验 + 多端同步,技术人 Markdown 笔记的最佳实践,主要讲长期管理个人知识笔记时遇到的一些痛点:多端同步、流畅体验、Markdown 格式、安全与免费。

国内简单、纯粹又好用的产品极少。我当时的方案是迁移到 Typora,固定使用 Markdown 格式,直接存储到 GitHub,再写个脚本定时同步。

因为我一直坚持用 GitHub 作为永久存储仓库,所以始终没有找到体验好、又支持跨端同步的手机端产品。

后来我把两类笔记彻底分开,最近一年在手机上一直用语雀,单独记录生活类笔记。

我特别想吐槽一下语雀玉伯做的产品,由顶级技术大佬为工程师打造,听起来很有极客范,但实际体验一点也不极客。用了一年实在受不了,我只挑两点:

  1. 每次打开目录或文件,加载加渲染都要超过 1 秒,而且每次都从远端加载。不知道非要加载个鸡毛,就算不用本地存储,特么起码也该做个缓存吧,几乎看不到优化。
  2. 从体验上看,应该是 Web 套壳的 Hybrid 方案。就算是前端出身,也没必要这么热衷于 Web 吧?这么多年都不用原生实现,交互体验太差了。

手机端的 Obsidian 非常丝滑。为了不花每年 350 元的订阅费,我决定自己手搓一个。

芝士就是力量!

它必须满足两个核心要求:

  1. 数据永久存储在 GitHub 上。
  2. 要快。

基于这两点,我做了芝士(知识)笔记:一套完全无广告、支持私有化部署、以 Markdown 为唯一内容格式,并与 GitHub 仓库双向同步的个人笔记系统。

  • 技术方案必须遵循本地优先原则,打开速度越慢,使用次数就越少。
  • 针对多端同步冲突,设计明确的冲突处理方式。
  • 使用基于 Authenticator 的权限验证,直接输入验证码登录,省去传统登录流程,每台设备验证一次即可。
  • 自部署服务使用 SQLite 保存索引、状态、凭据等临时信息,原始文档永久存储在 GitHub。

预览图如下:

私有化部署

配置项

编辑 server/config/runtime.local.json,完成以下配置:

  • authenticatorSecret:Authenticator 使用的 Base32 TOTP Secret,用于生成和校验设备登录验证码。请自行生成独立密钥并写入配置,然后下载手机 Authenticator 应用,将密钥添加到应用中。每次重新登录时,需要从 Authenticator 应用获取临时验证码。
  • githubOAuth.clientId:打开 GitHub Developer Settings,新建 GitHub OAuth App,获取 Client ID 并写入配置。
  • githubOAuth.clientSecret:同样在 GitHub OAuth App 中配置 Client Secret,用于服务端完成 GitHub 授权,不能提交到 Git 仓库或泄露给客户端。

构建部署

bash 复制代码
# iOS 构建
cd ios-capacitor
pnpm ios:sync:production

# 服务端构建
cd ../server
pnpm install
pnpm build
pnpm start

将服务端部署到服务器后,即可进行 iOS 真机测试或发布到应用市场。

原创声明

原创文章,转载请注明作者和原文链接。插图由 AI 生成,关注公众号查看更多文章!

内容创作 AI 自律声明

相关推荐
不才不才不不才1 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
漂流瓶jz1 小时前
Webpack开发环境:观察模式/webpack-dev-server/HMR热更新
前端·javascript·webpack
IT_陈寒1 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端
搜狐技术产品小编20231 小时前
告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
后端·多agent
凌涘2 小时前
前端路由(一):二十行代码实现 Hash 路由
前端
勾勾圈圈蛋蛋2 小时前
黑马Vue_day11:Vue3的watch,ref和reactive,vue2->vue3,defineOptions、Model
前端
DantyWei2 小时前
controller注册及调用时机
后端
AlloyTeamZy2 小时前
我发现,一个人做小游戏最难的,根本不是写代码
前端·人工智能·程序员
edwarddamon2 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端