A Markdown reader and editor built for the AI era.
Re-renders as Claude, ChatGPT, or Cursor writes. Edit visually, without ever seeing ## or **.
Every AI tool — Claude, ChatGPT, Gemini, Cursor — writes in Markdown by default. That's great, until you actually want to read the output without alt-tabbing into a code editor, or edit it without your non-technical teammates panicking at the ## and ** symbols.
md-reader does two things really well:
- Reading. Open a
.mdfile by double-clicking it. The app re-renders live while your AI is still writing. No vaults, no folders to set up, no "trust this workspace" prompts. - Editing. A WYSIWYG mode (called Smart edit) where markdown syntax is never visible. You type into the rendered view like it's a Notion or Word document. Bold, italics, headings, lists, tables, links — all there, none of the symbols. Saves clean markdown back to disk.
Local-only. No telemetry. No accounts. MIT licensed. ~10 MB installer (Tauri 2 — not a 200 MB Electron app).
- Download the installer for your OS from the badges above.
- Double-click any
.mdfile. md-reader opens with the file rendered. - Press
Ctrl + E(Cmd + Eon Mac) to switch to Smart edit. Type into the rendered view like a Word doc. Ctrl + Sto save back to disk. Reopen the file in any other editor — it's clean markdown.
That's the whole loop.
Open a file in md-reader, kick off a Claude or ChatGPT task that writes to the same file. The viewer re-renders as the content arrives, with a brief highlight on the lines that just changed. Smart-scroll keeps you anchored — it only follows the edit if you're already near it, so you don't get yanked away mid-read.
Hit Ctrl + E and the file becomes editable in place. The markdown symbols disappear:
- Headings render at their proper size — no
#prefix in sight - Bold / italic / strikethrough show their actual styling, not the
**/*/~~wrappers - Links look like links, click the toolbar pencil to change the URL
- Bullet and numbered lists with proper indentation, hit Tab/Shift-Tab to nest
- Tables with right-click row/column controls
- Code blocks with syntax highlighting
- Slash menu — type
/on a blank line to insert a heading, list, table, divider, etc.
On save, you get clean markdown back to disk. Round-trip safe — reopen the file in VS Code or any other editor and it's exactly the markdown you'd expect.
If you ever need the raw source, hit the Raw sub-toggle next to the Edit button. Power users keep their muscle memory; non-technical users never have to look at the syntax.
Drop a folder of .md files onto the window — each becomes a tab. Drag a tab outside the window to tear it off into its own native window. Tab order persists across restarts.
Ctrl + ] and Ctrl + [ widen and narrow the content column. Ctrl + \ toggles full-window width. No locked narrow band like some other readers.
Ctrl + B toggles the file browser. The outline (📑 button) shows your document's headings — click to jump. Both can resize by dragging the right edge.
Ctrl on Windows/Linux, Cmd on macOS. md-reader binds both, so muscle memory transfers either way.
| Shortcut | Action |
|---|---|
Ctrl + T / Ctrl + O |
Open file in new tab |
Ctrl + W |
Close active tab |
Ctrl + Tab / Ctrl + Shift + Tab |
Cycle tabs |
Ctrl + E |
Toggle View ↔ Smart edit |
Ctrl + S |
Save (edit mode) |
Ctrl + F |
Find in document |
Ctrl + , |
Settings |
Ctrl + B |
Toggle files panel |
Ctrl + + / Ctrl + - / Ctrl + 0 |
Zoom in / out / reset |
Ctrl + ] / Ctrl + [ |
Wider / narrower content column |
Ctrl + \ |
Toggle full-window content width |
Esc |
Close find / settings / file menu |
Ctrl + , to open. A few that matter:
- Theme — Auto (follows your system), Light, or Dark.
- Default edit mode — Smart (WYSIWYG) or Raw (markdown source). You can always flip per-tab via the toolbar.
- Content width — slider from 40 to 160 characters, or "Full window" for wide docs.
- Smart-diff (optional) — paste an Anthropic API key and md-reader can summarise what changed in a file since you opened it. Off by default; nothing is sent unless you enable it.
- Experimental features — for power users only. Live AI edit tracking (the 📡 toolbar button) and Diff mode (🔍) live here. Off by default to keep the toolbar calm.
Pick the channel that fits:
- Found a bug? → Open a bug report. A short repro is gold.
- Want a feature? → Open a feature request. Tell me the workflow that's broken, not just the fix you want.
- General "what should this become?" or "this idea is fuzzy" → Discussions (if enabled).
I read everything. PRs welcome.
Build from source (devs only)
- Node.js 20+
- Rust 1.78+ (via rustup)
- Platform C++ toolchain:
- Windows: Microsoft C++ Build Tools + WebView2 (preinstalled on Win10/11)
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux:
webkit2gtk-4.1,libgtk-3-dev,libayatana-appindicator3-dev,librsvg2-dev
git clone https://github.com/kumaradarsh1993/md-reader
cd md-reader
npm install
npm run tauri dev # dev mode with HMR + native window
npm run tauri build # produces installer in src-tauri/target/release/bundle/Frontend-only (no Rust required, useful for UI work):
npm run dev # Vite dev server on :1430
npm run check # svelte-check- Backend: Tauri 2 + Rust. Markdown rendering via comrak with syntect-highlighted code blocks. File watching via notify with an mtime poll fallback for cloud-drive paths (OneDrive's reparse points break inotify).
- Frontend: SvelteKit (Svelte 5 runes) + Vite. Smart edit mode via Milkdown (a ProseMirror-based WYSIWYG that round-trips through remark AST — guaranteed clean markdown out). Raw edit via CodeMirror 6. Math via KaTeX, diagrams via Mermaid, both lazy-loaded.
- Tabs: Stored in
tauri-plugin-storeso they persist across restarts. Tear-out spawns a freshmd-reader.exeprocess per torn-out window (more reliable on Windows than in-process window-spawn).
src-tauri/ Rust backend (Tauri 2)
src/markdown.rs comrak + syntect → HTML, with data-sourcepos
src/watcher.rs notify-debouncer-full, watches parent dir
src/commands.rs IPC commands (file ops, list_dir, spawn_window)
src/lib.rs plugins, CLI args, single-instance
examples/inspect.rs diagnostic harness — dump rendered HTML
src/ SvelteKit frontend (Svelte 5 runes)
routes/+page.svelte app shell
lib/Viewer.svelte rendered output + live-follow
lib/SmartEditor.svelte WYSIWYG editor (Milkdown / Crepe, lazy)
lib/Editor.svelte raw markdown editor (CodeMirror 6, lazy)
lib/TabBar.svelte tabs with drag-tear-out
lib/LeftPanel.svelte Lightroom-style resizable panel
lib/FileBrowser.svelte single-level dir tree
lib/Toc.svelte document outline
lib/Find.svelte Ctrl+F search
lib/Settings.svelte settings panel
lib/post-render.ts heading id assignment + lazy KaTeX/Mermaid
lib/tabs-store.svelte.ts tabs state (open/close/reorder/persist)
lib/settings-store.svelte.ts persisted settings via tauri-plugin-store
docs/ GitHub Pages landing site (static)
test-fixtures/ round-trip fixture for smart-edit testing
See CHANGELOG.md for release notes.
MIT — see LICENSE if present, or the license field in package.json.