本地优先 · 无账号体系 · 无云端托管

EsprinProject

Note, Nothing.

本地优先的笔记应用与配套服务。笔记与待办以 .md 落在数据目录, 可由任意编辑器直接打开,整个数据目录复制一份即为一次完整备份。

除手动配置的自建同步与 AI 助手,以及可在设置中关闭的更新检查外,客户端不发起任何网络请求。 桌面端与网页端共用同一套文件格式,读写同一份操作日志。

各仓库以 GNU GPL v3.0 授权 · 无遥测 · 无账号体系

EsprinNemo 主界面 · 侧边栏 / 笔记列表 / 编辑器 / AI 面板
组件
桌面端 · 网页端 · 服务端
存储
纯 Markdown(.md)
账号
无账号体系
许可
GNU GPL v3.0

01组件

一个数据目录,三种打开方式

桌面客户端、网页客户端与服务端各自独立成库,共用同一套数据格式:文件开头是内嵌元数据注释 (标题、文件夹、标签、置顶、废纸篓、时间戳),其后为 Markdown 正文。

EsprinNemo

桌面客户端

笔记、待办、随口记(Windows 本机语音识别)、小本本、AI 助手、自建同步客户端与自动更新。

形态
Electron + 原生 HTML / CSS / JavaScript
产物
Windows 向导式安装包与便携版
平台
Windows 10 / 11

EsprinSync

同步服务端

多账户、操作日志、可复用 ID、令牌鉴权与管理后台,并托管网页版客户端。

形态
单个 Python 文件,仅使用标准库
数据
每个账户一份 journal.log
后台
服务器地址 + /admin

EsprinNemoWeb

网页客户端

界面与桌面版的现代布局逐条对应,含 AI 助手与秘密本;可直接在浏览器中使用,也可由自建服务端在根路径托管,可安装为 PWA。

形态
原生 HTML / CSS / JavaScript,无构建步骤
离线
Service Worker 缓存界面外壳

02组成

服务端只存操作日志

数据以「操作日志」形式保存在自建服务端目录,把日志从头重放一遍即为全部数据。 服务端不保存任何以服务端为准的笔记副本。

客户端

EsprinNemo

桌面客户端,Windows 安装版与便携版

EsprinNemoWeb

网页客户端,浏览器内运行,可安装为 PWA

服务端

EsprinSync

单个 Python 文件,仅使用标准库;支持多个账户

令牌鉴权

每份凭据只读写所属账户的那一份日志

数据与后台

users/<账户 id>/journal.log

一行一条 put / del,重放即全部数据

管理后台 /admin

账户、令牌与日志整理

同一套文件格式

单篇文件自带全部信息,不依赖索引文件:标题、文件夹、标签、置顶、废纸篓与时间戳都写在文件开头,其后为 Markdown 正文。

同一份操作日志

桌面端与网页端读写的是同一份服务端日志,同一批数据可在两端之间互相接管。

一台进程两种角色

服务端启动时把 Web 仓库克隆到 web/ 并在根路径托管网页版;根路径留给客户端,管理后台另挂在 /admin。

03设计

两个核心设计

本地优先决定了数据放在哪里,操作日志决定了同步如何表达删除。两者共同决定了这套实现与 「文件快照 + 目录对比」类同步的差别。

本地优先

数据目录即全部状态。不存在账号,不存在服务端侧的笔记副本,也不存在以服务端为准的隐式上传。

  • 笔记与待办以 .md 落在 notes/ 与 todos/,AI 对话以一份对话一个 JSON 文件落在 ai_chats/。
  • 密钥类内容(AI Key、同步令牌)不进数据目录,交由系统密钥链单独保管,备份、迁移或分享数据目录都不会带出密钥。
  • 复制整个数据目录即完成一次备份,用 Git 初始化即获得完整历史版本。

操作日志同步

同步以「操作(put / del)」为单位追加到服务端日志,客户端只记录「已应用到第几号」。

  • 同步过程为「拉取序号之后的操作并重放 + 推送本地改动」,删除是一条明确的删除标记,重放只会删除,不会反向产生写回。
  • 条目被彻底删除后,服务端抹掉其正文与历史,只留一行删除标记,并把它作为可复用 ID 收进回收池供后续新建使用。
  • 其余操作的序号不动,各设备记的「已应用到第几号」因此照旧有效。
同步模型 客户端可见信息 删除的后果
文件快照 + 目录对比 远端存在 / 不存在某文件 「删除」与「从未见过」不可区分,其他设备会把本地缺失视为待上传,从而重新生成该文件
操作日志(本项目) 逐条 put / del 操作及其全局序号 删除是一条明确的删除标记,重放只会删除,不会反向产生写回

04上手

三条路径

三条路径互不依赖:只用桌面客户端即可离线写作;需要多设备同步时再部署服务端; 网页客户端由服务端托管,也可以在无服务端时以本地模式打开。

01

安装桌面客户端

向导式安装包与便携版均在 GitHub Releases 发布,两者都不需要账号,安装完成后即可离线使用。

最新版本 以发布页为准

02

部署同步服务端

在存放数据的机器上运行即可,除 Python 3 标准库外没有依赖;启动后由它托管网页版客户端。

sync.py
git clone https://github.com/esprinproject/sync
cd sync
python sync.py

03

使用网页客户端

已部署在 esprinnemo.pages.dev,无需安装; 该地址不接服务端,以本地模式运行(界面与本地副本照常,同步整套不出现)。需要跨设备同步时,由自建服务端在根路径托管同一份界面。

静态服务器
# 或 npx serve -l 8686
python -m http.server 8686
目标 入口
了解 Nemo 功能与界面 本站 Nemo 页,或 Nemo 使用文档
从源码运行 Nemo bun install、bun start、bun run build;环境要求 Node.js 与 bun
在浏览器直接打开网页版 直接访问 esprinnemo.pages.dev;也可双击 Web 仓库的 index.html,或对其起一台静态服务器
自建同步服务端 Sync 官网给出运行、接口与管理后台说明;Sync 仓库为源码与发布
取用品牌资源 Logos 仓库中各仓库使用的图标源图

05仓库

组织仓库一览

每个仓库各自独立授权与发布,官网本身也是一个独立仓库。

仓库 内容 形态
Nemo 桌面客户端:笔记、待办、随口记(系统本机语音识别)、小本本、AI 助手、自建同步客户端、自动更新 Electron + 原生 HTML / CSS / JavaScript;产出 Windows 安装包与便携版
Sync 自建同步服务端:多账户、操作日志、可复用 ID、令牌鉴权、管理后台,并托管网页版客户端 单个 Python 文件(仅标准库)加管理页静态文件
Web 网页客户端:界面与桌面版现代布局逐条对应,可安装为 PWA 原生 HTML / CSS / JavaScript,无构建步骤
Page 官网:功能说明、界面截图与最新版本下载入口 GitHub Pages 静态站点
Logos 品牌资源:各仓库使用的图标源图 PNG
.github 组织配置与组织主页 —

许可

各仓库均以 GNU General Public License v3.0 授权,授权全文见对应仓库的 LICENSE。

第三方资源

仓库内随应用分发的资源各自沿用原授权:Material Symbols 为 Apache-2.0,品牌字体 Mohave 遵循 SIL Open Font License。

反馈

缺陷与需求提交至对应仓库的 Issues;服务端与网页版的问题归各自仓库。