Offline-first Markdown notes with local folders, wiki links, graph navigation, and a polished desktop editor.
Download the latest release · Website · MCP setup
Marky is an offline-first Markdown notes app built with Tauri, React, and Rust. It is designed for local folder-based note-taking with wiki links, graph navigation, a modern editor, and strong customization.
Your notes are ordinary Markdown files in an ordinary folder. No account, no database — git them, put them in any sync folder, point the built-in S3 sync at your own bucket, or leave them on a USB stick. Native installers stay under 10 MB.
Download the latest desktop build from the Marky releases page. Installers are attached to each GitHub release after the app is built.
On macOS you can also install with Homebrew:
brew install --cask amiralibg/marky/markyCurrent version: v1.8.9.
- Local-first workspace (notes are normal files in your folder)
- Saves itself as you type — nothing to remember, nothing left unsaved
- CodeMirror 6 editor with split/preview modes
- Wiki links (
[[Note]]) with backlink tracking - Interactive graph view for note connections
- Global fuzzy search across note titles and content
- Command palette for quick actions and note switching
- Templates and scheduled note creation (daily/weekly/monthly)
- Markdown extensions: Mermaid, KaTeX math, footnotes, code highlighting
- Themes, accent colors, app-wide text size, customizable keyboard shortcuts, Vim mode
- AI integration via Model Context Protocol (MCP) Server for Claude Desktop, Cursor, etc.
- Git sync — back your vault up to any git remote, with real history you can inspect
- Cloud sync with any S3-compatible storage (AWS S3, MinIO, Backblaze B2, Wasabi, Hetzner…)
- Auto-sync in the background: on an interval, after you stop typing, or when Marky regains focus
- Workspace ZIP backup export
- File watcher sync for external changes (other editors, git pulls, etc.)
- Your vault becomes an ordinary git repository, backed up to any remote — GitHub, GitLab, Gitea, or a bare repo you own
- Every sync is
commit -> fetch -> merge -> push, so you get a real, inspectable history - Conflicts never produce markers. A note edited on two devices keeps both versions: yours stays where it is, and the other lands beside it as
Note (conflict 2026-08-25 15-42).md - Works with the
gitalready on your machine — no bundled binary, nothing extra to configure - HTTPS access tokens, SSH agent, or an SSH key file
- Configure it in Settings -> Git sync
- Syncs on an interval, after a pause in your typing, when Marky regains focus, or when you come back online
- Only one sync ever runs at a time; requests that arrive during one are folded into a single follow-up
- Offline is not a failure — it waits, then catches up
- After a real error it retries on a widening delay and stops after five in a row, rather than hammering a remote that is rejecting it
- Configure it in Settings -> Auto-sync
- Sync your workspace across devices using your own S3-compatible bucket — your data stays yours
- Works with AWS S3, MinIO, Backblaze B2, Wasabi, Hetzner, and other providers (path-style URLs)
- Manual "Sync now" push/pull; last-write-wins per file, and nothing is ever deleted on either side
- Requests are signed locally (SigV4); credentials live in your workspace settings on your device
- Configure it in Settings -> Cloud sync
- Built-in MCP Server (
@marky-app/mcp-server) connects your notes to Claude Code, Claude Desktop, Cursor, OpenCode / Cline, ChatGPT, Zed, and other AI tools - AI tools can fuzzy search notes, read full content, create new notes, append daily logs, inspect backlinks, and query tags
- In-app 1-click config generator in Settings -> AI & MCP for all major AI clients
- See the MCP Server Guide for setup instructions
- Open a local folder as your workspace
- Nested folders and notes tree
- Multi-tab editing
- Create, rename, move, and delete notes/folders
- Drag-and-drop reorganization
- Recent notes and pinned notes
- Undo last delete
The same note in source view and reading view — Mermaid diagrams and KaTeX maths render inline, and it is still just Markdown on disk.
- CodeMirror 6 markdown editor
- Editor-only / split / preview-only layouts
- Saves as you type — no save step, and no unsaved notes (manual save is still available)
- In-editor search and replace
- Wiki-link autocomplete and broken-link note creation flow
- Table of contents panel for headings
- Focus mode (distraction-free writing)
- Automatic BiDi/RTL rendering for mixed-language notes
- Global search modal (Fuse.js fuzzy search)
- Command palette (
Cmd/Ctrl+K) - Backlink counts in the notes tree, and backlink-weighted node sizes in the graph
- Interactive graph modal: force-directed layout, drag a node to reshape it, cursor-anchored zoom
- Sidebar search, sorting, and tag filtering
- Built-in templates and custom templates
- Scheduled note generation (daily/weekly/monthly)
- Scheduled notes management UI in Settings
- Export note as Markdown or HTML
- Print-friendly HTML export for PDF workflow
- Copy rendered HTML to clipboard
- Export workspace backup as ZIP (with metadata/settings)
- Frontend: React 18 + Vite
- Desktop runtime: Tauri 2 (Rust backend)
- State: Zustand
- Editor: CodeMirror 6 (+ Vim mode via
@replit/codemirror-vim) - Markdown rendering:
marked+ extensions - Search: Fuse.js
- Diagrams: Mermaid
- Math: KaTeX
- Archive export: JSZip
- Node.js (latest LTS recommended)
- Rust toolchain (rustup)
pnpm
pnpm installpnpm tauri:devpnpm devBuild a production desktop app:
pnpm tauri:buildTypical outputs are generated under src-tauri/target/release/bundle/ (platform-specific subfolders such as dmg, msi, deb, etc.).
Common release artifacts:
- macOS:
src-tauri/target/release/bundle/dmg/*.dmg - Windows:
src-tauri/target/release/bundle/msi/*.msi - Linux:
src-tauri/target/release/bundle/deb/*.deband/orsrc-tauri/target/release/bundle/appimage/*.AppImage
Run the unit test suite:
pnpm testFor testing strategy, priorities, and examples, see docs/testing.md.
Before publishing a release, make sure the app version is the same in:
package.jsonsrc-tauri/Cargo.tomlsrc-tauri/tauri.conf.json
The release workflow builds macOS, Windows, and Linux installers automatically and uploads them to a GitHub Release.
Use this when the code is ready and committed:
git status
git add package.json src-tauri/Cargo.toml src-tauri/tauri.conf.json
git commit -m "chore: release v1.2.4"
git tag v1.2.4
git push origin main --tagsWhen the v1.2.4 tag is pushed, .github/workflows/release.yml runs on GitHub Actions and creates the GitHub Release for that tag.
Use this if you want to release the current commit without creating a local tag:
- Open the repository on GitHub.
- Go to Actions -> Release -> Run workflow.
- Enter a tag such as
v1.2.4. - Choose whether it is a prerelease.
- Run the workflow.
The workflow uses GITHUB_TOKEN, so no custom token is required for normal GitHub Releases.
Use this only when you want to test installers locally:
pnpm install
pnpm tauri:buildCmd/Ctrl+K: Command paletteCmd/Ctrl+Shift+F: Search all notesCmd/Ctrl+N: New noteCmd/Ctrl+Shift+N: New folderCmd/Ctrl+S: Save noteCmd/Ctrl+B: Toggle sidebarCmd/Ctrl+W: Close tabCmd/Ctrl+1/2/3: Editor / Split / Preview viewsCmd/Ctrl+Plus/Cmd/Ctrl+Minus: Larger / smaller app text (Cmd/Ctrl+0resets)
Shortcuts are customizable in Settings.
/src- React UI, stores, editor, components/src-tauri- Rust/Tauri backend and desktop config
See TODO.md for the current audit-based roadmap and prioritized next work.
MIT. See LICENSE.


