Memoir
把记忆写下来
打开一个文件夹,写作、预览、同步。
Markdown / MDX,始终是普通文件,始终是你的。
English ·
简体中文
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/)