Local-first, AI-native knowledge base. Your markdown files, your data, your machine.
m3m is a desktop knowledge base that treats .md files on disk as the one true source of truth. SQLite indexes, vector embeddings, and sync state are all derived caches — always rebuildable. Everything works offline. AI runs on-device. You own your data completely.
- Files first. Notes are plain
.mdfiles you can open in any editor, commit to git, or migrate away from m3m at any time. - Offline by default. No account required. No cloud dependency. Every P0 feature works without a network connection.
- AI on your hardware. Semantic search and AI features run locally via Ollama. Cloud AI is opt-in, BYOK.
- No telemetry. Nothing leaves your machine unless you explicitly enable sync or cloud AI.
- Vaults are portable. Each vault is a self-contained folder. The app is a manager of vaults, not a container.
| Feature | Description |
|---|---|
| Markdown editor | Block-level editor (TipTap/ProseMirror), writes plain .md on save; full heading hierarchy (h1–h6) and inline marks (bold, italic) styled for both light and dark themes |
| Markdown links | [Label](url) auto-converts as you type; bare URL paste auto-links; bubble menu to open, edit (label + URL), or unlink; Cmd/Ctrl+click opens in browser |
| Blockquotes | > auto-converts to a blockquote block; toolbar > button toggles; styled with accent-color left border |
| Vault watcher | notify crate rebuilds SQLite index on any .md change |
| Full-text search | SQLite FTS5 — fast, offline, no external service |
| Context panel | Multi-tab inspector (Details, Links, Outline, Insights, Agent); resizable; Links tab unifies outgoing links and backlinks in collapsible accordion sub-sections; Outline tab shows all headings as a table of contents with click-to-navigate (smooth scroll); Details tab shows word count, dates, tags, and custom properties |
| Wikilinks | [[Note Title]] syntax with autocomplete, chip rendering, and automatic backlink tracking |
| Tags | Pill/chip visualization in sidebar and context panel; per-tag note filtering via advanced search panel; add/remove tags from the Details tab with autocomplete |
| Advanced search | Collapsible filter panel below the search bar (toggle via sliders icon); tag filter built-in; state persisted across sessions; extensible for future filters |
| Delete a note | Permanent file deletion with confirmation; hover trash icon in note list |
| Resizable panels | Sidebar and context panel widths are drag-resizable and persisted |
| Global settings | Theme, editor font family & size, restore-last-vault behaviour, default vault location |
| Per-vault settings | Autosave delay, line width, vault name & color — stored in .vault/settings.json |
| In-app updates | Checks for new releases on launch; dismissable install banner |
| Changelog / What's New | Auto-appears on first launch after each version upgrade; all past releases rendered with colored section labels (Added, Fixed, Changed, etc.); accessible at any time via the m3m vX.Y.Z badge at the bottom of the sidebar |
| Vault Manager | Create, open, switch, rename, remove vaults |
| Note tabs | Multi-tab strip above the editor; each opened note is a separate tab; dirty indicator dot; Cmd+W closes the active tab; auto-saves dirty tabs on close and on app quit |
| Export as PDF | "Export PDF" button in editor header; sets document title to note name for default filename; system print dialog via window.print(); print CSS hides all app chrome and forces light-mode colors |
| Markdown tables | GFM pipe-table syntax (` |
| Markdown reference | ? button at the far right of the editor toolbar opens a modal listing all supported Markdown syntax: inline formatting, headings, blocks, lists, tables, and wikilinks; Escape or backdrop click closes it |
| Markdown paste | Pasting plain text containing markdown syntax (headings, bold, lists, tables, etc.) automatically parses and renders it as formatted content; single-line pastes (e.g. URLs) are inserted inline — no spurious newlines when pasting inside [Label](url) syntax; pasting rich text from a browser preserves its HTML formatting |
| Onboarding tours | driver.js-powered step-by-step tours; general-onboarding-v1 fires on first vault open; editor-onboarding-v1 fires on first new note creation; themed to match app colors in light and dark mode; restart via Settings → App → Help |
| Feature | Description |
|---|---|
| Daily note | YYYY-MM-DD.md, auto-linked to the previous day |
| Graph view | React Flow — nodes are notes, edges are links |
| Feature | Description |
|---|---|
| Semantic search | nomic-embed-text + LanceDB vector index |
| AI-inferred connections | Cosine similarity + named entities + temporal co-occurrence + shared tags |
| Contradiction detection | LLM compares new note against semantically similar older notes |
| Knowledge decay | Freshness score + spaced resurfacing with AI review prompt |
| Daily synthesis | On open: unresolved threads, new connections, open questions |
| Draft from vault | Synthesise your own notes into a draft on demand |
| Socratic mode | AI challenges your claims using contradicting vault evidence |
| Voice capture | Local Whisper → structured note, linked to existing notes |
| Feature | Description |
|---|---|
| Note properties | Inline CRUD for custom frontmatter key-value pairs; displayed and edited in the Details tab of the context panel |
| Collapsible sections | Always-visible chevron on every heading folds the section beneath it; collapsed state persisted per-note across sessions |
- BYOS sync — encrypt vault, write Automerge CRDT patches to S3 / Dropbox / iCloud
- Managed sync (premium) — Cloudflare Workers WebSocket relay, E2E encrypted, server never sees plaintext
- Telegram bridge (premium) — send text, voice, or images to
@m3mBot; messages land in your vault inbox on next sync
| Layer | Choice |
|---|---|
| Shell | Tauri |
| Frontend | React + TypeScript |
| Editor | TipTap (ProseMirror) |
| Graph UI | React Flow |
| Local DB | SQLite — sqlx (one DB per vault) |
| Vector DB | LanceDB (Rust SDK, one store per vault) |
| AI runtime | Ollama sidecar (spawned by Tauri) |
| Backend | Rust — Tauri commands |
| Layer | Choice |
|---|---|
| Shell | Capacitor (~90% code reuse from desktop) |
| Filesystem | Capacitor Filesystem plugin |
| AI | Cloud API fallback (user API key) |
| Layer | Choice |
|---|---|
| Sync engine | Automerge (CRDT) |
| Free sync | BYOS — S3 / Dropbox / iCloud |
| Premium relay | Cloudflare Workers + R2 |
| Encryption | libsodium secretbox (client-side, Argon2id key derivation) |
Each vault is a self-contained folder. Multiple vaults can live anywhere on the filesystem.
~/Documents/WorkVault/
├── note-title-01J5ABCDEF.md # filename = {slug}-{ulid}.md
└── .vault/
├── meta.json # vault id (ulid), name, created date
├── index.db # SQLite — notes, FTS5, note_links
├── settings.json # vault-level prefs (autosave, line width)
├── embeddings.lance # LanceDB vector index (planned, P1)
└── sync.bin # Automerge doc, absent if sync off (planned, P2)
The app registry lives outside vaults at the platform-appropriate path:
| Platform | Path |
|---|---|
| macOS | ~/Library/Application Support/m3m/ |
| Windows | %APPDATA%\m3m\ |
| Linux | ~/.local/share/m3m/ |
Deleting the registry loses vault history, not vault data — vaults are re-registerable by pointing the app at the folder.
---
id: <ulid>
title: string
created: ISO8601
modified: ISO8601
tags: [string]
links: [ulid] # auto-populated from [[wikilinks]] in the note body on save
---Unknown frontmatter keys are preserved — never removed by the app.
- Rust (stable)
- Bun
- Tauri prerequisites for your platform
git clone https://github.com/ronyevernaes/m3m
cd m3m
bun installbun tauri:devDevTools (right-click → Inspect) are available in dev builds and hidden by default (no auto-open). They are compiled out entirely in production builds.
# Frontend (Vitest)
bun test:run
# Rust backend
cd src-tauri && cargo testsrc-tauri/ # Rust backend — Tauri commands, file watcher, SQLite, LanceDB
src/ # React frontend — editor, graph, search UI
src/lib/ # Shared TS utilities
src-tauri/src/
commands/ # #[tauri::command] handlers (one file per domain)
indexer.rs # vault watcher + SQLite rebuild
ai.rs # Ollama HTTP client + embedding pipeline
sync.rs # Automerge CRDT + encryption
.mdfiles on disk are the source of truth. SQLite, LanceDB, and sync state are derived caches — always rebuildable.- Everything works offline. Cloud sync is an enhancement, never a dependency.
- No telemetry. No account required for local features. Vaults are portable to any markdown editor.
- AI runs on-device via Ollama by default. Cloud AI is opt-in BYOK fallback.
- Each vault is self-contained and independently portable. The app is a manager of vaults, not a container.
See RELEASE.md for the full release process.
MIT — see LICENSE