Markdown that reads like a finished document.
A free, open-source WYSIWYG Markdown editor for macOS, Windows and Linux.
No preview pane, no split view: the page you write is the page you read.
Website · Download · Release notes · Build from source
- One page, not two. Formatting appears the moment you type it. Click any block to edit its Markdown, click away and it renders in place.
- Plain files you own. Documents are
.mdfiles in folders you choose. Open them anywhere, keep them in Git, sync them however you like. - Private by default. No account and no telemetry. Voice typing runs on your computer, and the AI assistant only changes what you approve.
- Free, with no paid tier. GPL-3.0, built in the open.
With Homebrew (no security prompt, and brew upgrade --cask sarala keeps it current):
brew tap solancer/sarala https://github.com/solancer/sarala
brew trust --cask solancer/sarala/sarala
brew install --cask --yes sarala
brew trustis a one-time step: Homebrew 6 refuses casks from third-party taps until you trust them. Older Homebrew has notrustcommand and doesn't need one. The cask needs Homebrew 5.1.14 or newer;brew updategets you there.If
brew installfails withCalling `depends_on macos: :catalina` is disabled, your tap holds an old copy of the cask: runbrew update(orbrew untap solancer/saralaand tap it again), then install.
Or download the universal .dmg (Apple Silicon and Intel, macOS 10.15+) from the latest release. Sarala is ad-hoc signed but not notarized by Apple, so macOS blocks the first launch. After dragging it into Applications, run this once:
xattr -dr com.apple.quarantine /Applications/Sarala.app(Or open it, click Done, then System Settings › Privacy & Security › Open Anyway.) Sarala registers for .md, .markdown and .mdown, so Open With › Sarala works in Finder, including when it's already running.
Download the installer (.exe) or .msi from the latest release. Windows 10 and 11, 64-bit. The installer isn't code-signed yet, so if SmartScreen says "Windows protected your PC", click More info › Run anyway.
| Format | Install |
|---|---|
| Snap Store | sudo snap install sarala |
.deb (Ubuntu, Debian, Mint) |
sudo apt install ./Sarala_<version>_amd64.deb |
.rpm (Fedora, RHEL, openSUSE) |
sudo dnf install ./Sarala-<version>-1.x86_64.rpm |
.AppImage (any distribution) |
chmod +x Sarala_<version>_amd64.AppImage && ./Sarala_<version>_amd64.AppImage |
All from the latest release. Sarala opens .md files passed to it, so your file manager's Open With works. In-app updates cover the AppImage, .deb and .rpm; Snap and distribution packages update through their package manager.
Writing
- Live blocks: markers stay visible but dimmed while you type, then the block renders when you leave it
- Smart Enter: continues lists and quotes, auto-numbers, closes a just-opened fence;
Shift+Enterfor a soft break - Click anywhere in rendered text and the caret lands at that exact spot in the source
- Select text for a formatting bar with a block-type dropdown; type
/for an insert menu - IME-safe, so CJK composition works as it should
Content
- Full GFM: tables, task lists with clickable checkboxes, strikethrough, footnotes, GitHub alerts, YAML front matter
- Code fences highlighted by Shiki, with light and dark handled through CSS variables
- Math via KaTeX; diagrams via Mermaid and D2. A broken one keeps its last good render instead of blanking
- Tables edit in place; hover an edge to add a row or column
- Images resolve relative to the document, with a properties panel for size, alt text and loading
Getting around
- Document tabs with independent edits and undo history (
Cmd/Ctrl+T,Cmd/Ctrl+W,Ctrl+Tab) - Sidebar with a live file tree, outline, and full-text search across the folder
- Open Quickly (
Shift+Cmd/Ctrl+P), find and replace, and a command palette (Cmd/Ctrl+K) - Focus and Typewriter modes, plus Source mode as an escape hatch to the raw document
AI assistant (opt-in)
- Works with Claude Code, OpenAI Codex or GitHub Copilot CLI, using their own sign-in; Sarala stores no keys
- Proposals arrive block by block as word-level diffs, with Accept, Reject and Accept all; undo works as usual
- The agent edits a scratch copy with file tools only, never your real file
Voice typing (opt-in)
- Speech becomes text on your computer: no cloud, no account, no keys. One model is downloaded when you turn it on
- Hold the shortcut to talk, press once to start and again to stop, or let it type at each pause
- Commands for Markdown: "new bullet …", "new heading …", "make that bold", "scratch that"; say "what can I say" for the rest
- Built for people who can't easily type or see the screen: read-back through the screen reader, distinct sounds for every state, spoken punctuation, any shortcut you can reach
Making it yours
- 13 built-in themes, plus a custom theme from any base16 scheme
- Any installed font for prose and code
- A searchable settings window for the rest: Markdown extensions, autosave, line endings, images, AI and voice
Getting it out
- HTML with an outline sidebar, and real PDF via headless Chromium (page size, margins, header and footer)
- docx, odt, rtf, epub, LaTeX, MediaWiki, rst, Textile and OPML through Pandoc, with import too
- Atomic saves, autosave, crash recovery, and signed in-app updates
The menus show every accelerator inline. The ones worth learning:
| Keys | Action |
|---|---|
Cmd/Ctrl+K |
Command palette |
Cmd/Ctrl+S |
Save |
Shift+Cmd/Ctrl+P |
Open Quickly |
Cmd/Ctrl+F |
Find (Cmd/Ctrl+G next, Alt+Cmd/Ctrl+F replace) |
Cmd/Ctrl+/ |
Source mode |
Shift+Cmd/Ctrl+L |
Toggle sidebar |
F8 / F9 |
Focus / Typewriter mode |
Cmd/Ctrl+1…6, 0 |
Heading level / paragraph |
Esc |
Render the current block |
Cmd+Shift+D (Mac), Ctrl+Alt+Space |
Voice typing, once turned on (changeable) |
Node 22+, pnpm, Rust stable, Tauri's platform prerequisites (on Linux, webkit2gtk-4.1 and friends), and CMake plus a C++ compiler for voice typing's speech engine (on Linux also libasound2-dev and libopenblas-dev). To build without voice typing, pass --no-default-features to Cargo.
pnpm install
pnpm tauri dev # desktop app
pnpm tauri build # installers in src-tauri/target/release/bundlepnpm dev runs the frontend standalone in a browser, which is handy for UI work, but file dialogs and the file tree are desktop-only.
Three decisions shape everything else:
A block model, not a character model. The document is an array of Markdown blocks (fences and YAML front matter kept whole). The active block is a contenteditable whose innerHTML is re-styled on every keystroke, and the load-bearing invariant is that the styled HTML's textContent stays byte-identical to the Markdown source. That exactness is what lets the caret be saved and restored by plain text offset, and it's covered by roundtrip tests.
One render pipeline. The same renderMarkdown() draws editor blocks and the HTML export, so what you see and what you ship cannot drift apart.
Rust holds the filesystem, not the logic. The backend does directory walks, atomic saves, the Pandoc bridge and the speech engine; the native menu forwards item ids as events. Every editing decision lives in one frontend command bus shared by the menus, the shortcuts and the command palette.
pnpm release X.Y.Z bumps the manifests and tags; pushing the tag makes CI build and sign for all three platforms, publish the release, and update the manifest existing installs check. Details in RELEASING.md.
GPL-3.0-or-later © Srinivas Gowda







