Memoir is a quiet desktop notebook. Point it at a folder of .md / .mdx files and you get a library, a CodeMirror editor, and a live preview — without an account, a sync service, or a proprietary vault.
Notes are ordinary files. You can open the same folder in git, VS Code, or any other editor.
Features
- Local-first — the workspace is a folder you choose. Memoir never uploads your notes.
- Markdown and MDX — GitHub Flavored Markdown, KaTeX, Mermaid, task lists, and a small set of built-in MDX components.
- Edit / split / preview — write source, read the rendered page, or do both with synced scroll.
- Library — folders, frontmatter tags, favorites, recent notes, and a heading outline.
- Safe by default — atomic writes, crash-safe drafts, autosave, and deletes that go to .memoir-trash/ instead of vanishing.
- Fast library — each workspace keeps a disposable SQLite cache at .memoir/index.sqlite so the sidebar does not re-read every note. The markdown files are still the source of truth; gitignore .memoir/ and exclude it from iCloud / Dropbox / OneDrive.
- Appearance — light / dark / system theme, accent colors, density, type scale, and Chinese / English UI.
- Sandboxed paths — only .md / .mdx inside the workspace; .., symlinks, and hidden/build directories are rejected.
README
Memoir
A quiet desktop notebook.
Open a folder. Write. Preview. Sync.
Markdown / MDX — still ordinary files, still yours.
Memoir is a quiet desktop notebook. Point it at a folder of .md / .mdx files and you get a library, a CodeMirror editor, and a live preview. Notes stay ordinary files — not a proprietary vault. Optional WebDAV or S3-compatible sync keeps the same folder in step with a remote copy.
Notes are ordinary files. You can open the same folder in git, VS Code, or any other editor.
Features
Your folder, your files — the workspace is a folder you choose. Notes stay ordinary Markdown / MDX.
Cloud sync — optional two-way WebDAV, AWS S3, and S3-compatible storage such as MinIO, R2, or COS.
Markdown and MDX — GitHub Flavored Markdown, KaTeX, Mermaid, task lists, and a small set of built-in MDX components.
Edit / split / preview — write source, read the rendered page, or do both with synced scroll.
Library — folders, frontmatter tags, favorites, recent notes, and a heading outline.
References — [[Note]] wiki links and markdown links to other notes, with backlinks and a workspace graph.
Safe by default — atomic writes, crash-safe drafts, autosave, and deletes that go to .memoir-trash/ instead of vanishing.
Fast library — each workspace keeps a disposable SQLite cache at .memoir/index.sqlite so the sidebar does not re-read every note. The markdown files are still the source of truth; gitignore .memoir/ and exclude it from iCloud / Dropbox / OneDrive.
Appearance — light / dark / system theme, accent colors, density, type scale, and Chinese / English UI.
Sandboxed paths — only .md / .mdx inside the workspace; .., symlinks, and hidden/build directories are rejected.
Writing
---
title: Two Sum
tags: [leetcode, rust]
---
# Two Sum
Link another note with `[[Welcome to Memoir]]` or `[home](../welcome.md)`.
Inline math: $O(n)$. Display math:
$$
\sum_{i=1}^{n} i = \frac{n(n+1)}{2}
$$
- [x] Read the prompt
- [ ] Write a test
```mermaid
graph LR
scan --> edit --> preview --> save
```
MDX files can use built-in components. import / export are disabled on purpose so a note cannot pull in arbitrary modules:
git clone https://github.com/Memoir-Studio/Memoir.git
cd Memoir
bun install
bun run dev # Vite, browser demo
bun run tauri dev # desktop shell
The browser build is an in-memory demo. It does not read or write real files, and it does not persist settings.
Verify a change before opening a PR:
bun run style:check
bun run test
bun run build
cargo test --manifest-path src-tauri/Cargo.toml
GitHub Actions runs the same checks on pull requests and pushes to main. Installer builds wait for them to pass.
Layout
src/ React app (features, store, gateways, domain)
src-tauri/ Tauri / Rust workspace IO and persistence
docs/ architecture notes and assets
The frontend is feature-first:
app → features → store → gateways → platform
→ domain
Components do not call Tauri invoke or touch localStorage. Store actions go through WorkspaceGateway / PersistenceGateway. Rust stays a thin commands → services → domain / infrastructure stack.
See docs/architecture.md for the Tauri command contract, app-data layout, path rules, and how to add a feature.
Status
Memoir is in early development. The editor, library, preview, desktop persistence, and optional WebDAV / S3-compatible sync are usable day to day; a plugin market is not part of this release.