Memoir

Memoir

把记忆写下来
打开一个文件夹,写作、预览、同步。
Markdown / MDX,始终是普通文件,始终是你的。

English · 简体中文

License: MIT Test Tauri 2 React 19 Platforms

Memoir 桌面端:资料库、Markdown 编辑器与实时预览

Memoir 是一款安静的桌面笔记本。把一个装满 `.md` / `.mdx` 的文件夹交给它,就能得到资料库、CodeMirror 编辑器和实时预览。笔记仍是普通文件,不会锁进专有仓库;可选的 WebDAV 或 S3 兼容同步让同一份文件夹与远程对齐。 笔记就是普通文件。同一个文件夹可以继续用 git、VS Code 或任何编辑器打开。 ## 功能 - **语音输入** — 本地 Whisper 转写,可使用已配置的云端 AI 整理分段;支持预览原文、编辑和撤销。首次下载约 181 MiB 模型,见 [语音输入说明](docs/speech-input.md)。 - **你的文件夹,你的文件** — 工作区就是你选的文件夹。笔记始终是普通 Markdown / MDX。 - **云同步** — 可选的 WebDAV、AWS S3 和 S3 兼容对象存储双向同步,支持 MinIO、R2、COS 等。 - **Markdown 与 MDX** — GFM、KaTeX、Mermaid、任务列表,以及一组内置 MDX 组件。 - **编辑 / 分栏 / 预览** — 写源码、看渲染,或两边同时打开并同步滚动。 - **资料库** — 文件夹、frontmatter 标签、收藏、最近编辑、标题大纲。 - **引用** — `[[笔记]]` 维基链接和指向其他笔记的 Markdown 链接,支持反向引用和完整图谱。 - **默认安全** — 原子写入、可恢复草稿、自动保存;删除进入工作区的 `.memoir-trash/`,而不是直接消失。 - **资料库加速** — 每个工作区在 `.memoir/index.sqlite` 里放一份可丢弃的索引,打开列表时不必重读每一篇笔记。Markdown 文件仍是唯一真相;请把 `.memoir/` 加入 gitignore,并在 iCloud / Dropbox / OneDrive 中排除它。 - **外观** — 浅色 / 深色 / 跟随系统、强调色、界面密度、字号,以及中英界面。 - **路径沙箱** — 只允许工作区内的 `.md` / `.mdx`;拒绝 `..`、符号链接,以及隐藏目录和构建目录。 ### 写作 ````md --- title: Two Sum tags: [leetcode, rust] --- # Two Sum 用 `[[Welcome to Memoir]]` 或 `[首页](../welcome.md)` 引用其他笔记。 行内公式:$O(n)$。独立公式: $$ \sum_{i=1}^{n} i = \frac{n(n+1)}{2} $$ - [x] 读题 - [ ] 写测试 ```mermaid graph LR 扫描 --> 编辑 --> 预览 --> 保存 ``` ```` MDX 可以使用内置组件。`import` / `export` 被有意禁用,避免一篇笔记拉取任意模块: ```mdx 笔记仍是 Markdown。云同步是可选项。 Callout、Badge、Card、Columns、Steps ``` ## 开始使用 到 [Releases](https://github.com/Memoir-Studio/Memoir/releases/latest) 下载对应平台的安装包: - **Windows** — `memoir_*_x64-setup.exe` - **macOS** — `memoir_*_aarch64.dmg`(Apple Silicon)或 `memoir_*_x64.dmg`(Intel) - **Linux** — `memoir_*_amd64.AppImage`、`memoir_*_amd64.deb` 或 `memoir-*-1.x86_64.rpm` AppImage 无需安装即可运行,首次使用前请先执行:`chmod +x memoir_*_amd64.AppImage`。 打开应用,选择一个包含 Markdown / MDX 的文件夹,它就是工作区。 ## 开发 ### 环境 - [Bun](https://bun.sh) 1.3+ - [Rust](https://www.rust-lang.org/tools/install)(仅桌面端需要) - Tauri 2 的[系统依赖](https://v2.tauri.app/start/prerequisites/) - 桌面端语音识别需要 CMake 和 [libclang](https://rust-lang.github.io/rust-bindgen/requirements.html)。Windows 安装 LLVM,并将 `LIBCLANG_PATH` 设为 `C:\Program Files\LLVM\bin`;macOS 使用 Xcode 自带的 libclang;Debian/Ubuntu 安装 `cmake libclang-dev`。 - macOS 桌面构建要求 macOS 11.0 或更高版本。 不要设置 `WHISPER_DONT_GENERATE_BINDINGS`:whisper 附带的绑定包含 Linux libc 类型布局。如果旧版本配置设置过该变量,更新后执行一次 `cargo clean --manifest-path src-tauri/Cargo.toml -p whisper-rs-sys`,以重新生成绑定。 ```bash git clone https://github.com/Memoir-Studio/Memoir.git cd Memoir bun install bun run dev # Vite,浏览器演示 bun run tauri dev # 桌面壳 ``` 浏览器模式是内存中的演示:不读写真实文件,也不持久化设置。 提交 PR 前请跑完验证: ```bash bun run style:check bun run test bun run build cargo test --manifest-path src-tauri/Cargo.toml ``` 前端测试使用 Vitest,请运行 `bun run test`。`bun test` 会启动 Bun 原生测试运行器,跳过 Vite 配置中的 StyleX 编译和应用版本注入,导致测试加载失败。 GitHub Actions 会在 pull request 和推送到 `main` 时跑同一套检查。安装包构建会等这些检查通过。 ### 目录 ```text src/ React 应用(features、store、gateways、domain) src-tauri/ Tauri / Rust 工作区 IO 与持久化 docs/ 架构说明与资源 ``` 前端按 feature 分层: ```text app → features → store → gateways → platform → domain ``` 组件禁止直接 `invoke` Tauri,也禁止读写 `localStorage`。store 的异步操作只走 `WorkspaceGateway` / `PersistenceGateway`。Rust 保持 `commands → services → domain / infrastructure` 的薄分层。 Tauri 命令契约、app-data 布局、路径规则和扩展步骤见 [`docs/architecture.md`](docs/architecture.md)。 ## 现状 Memoir 目前处于早期开发阶段。编辑器、资料库、预览、桌面持久化和可选的 WebDAV / S3 兼容同步已经可以日常使用;插件市场还不在这个阶段。 ## 参与贡献 欢迎提 issue 和 pull request。 1. 先读 [`docs/architecture.md`](docs/architecture.md),让新代码落在现有边界里。 2. 改动尽量小,风格跟周围代码一致。 3. 给 helper、store action 和 Rust 文件系统规则补测试。 4. 跑通[开发](#开发)里的三条验证命令。 请不要在没有 issue 讨论的情况下加入遥测,或第二条持久化路径。 ## 友情链接 - [Linux.do](https://linux.do/)