A fast, native macOS app for reading Markdown files.
Drop a
.mdon the icon (or set Markdown Preview as your default handler) and get a clean, scrollable preview with a real document outline — no Electron, no browser tab.
Quick Look preview — spacebar a .md in Finder:
- Native rendering —
WKWebViewpipeline backed by swift-markdown, with heading anchors and link handling. - Document outline — sidebar TOC that mirrors your headings; click to jump.
- Inspector panel — toggleable side panel with file metadata.
- In-document search — toolbar search field plus standard ⌘F / ⌘G / ⌘⇧G for next/previous match.
- Open With — switch to your real editor (VS Code, Cursor, Zed, Sublime, BBEdit, Nova, CotEditor, TextMate, MacVim, Xcode, TextEdit) without leaving the preview. The list filters to apps that actually declare an editor role for Markdown, and remembers your pick.
- Share = copy the source — the share toolbar feeds the picker the Markdown text itself, so Copy writes the raw source to the clipboard (great for pasting into ChatGPT / Claude), and Mail, Messages, and Notes get the content in the body instead of a file URL.
- Quick Look extension — system-wide
.mdpreviews from Finder spacebar, Spotlight, and Mail attachments without launching the app. - Default handler — offers to register itself as the default
.mdopener on first launch.
.md, .markdown, .mdown, .txt
UTI: net.daringfireball.markdown
Grab the latest signed and notarized DMG from the Releases page.
- macOS 15 or later
- Apple Silicon or Intel
git clone git@github.com:pluk-inc/md-preview.app.git
cd md-preview.app
open md-preview.xcodeprojBuild and run the md-preview scheme. Swift Package Manager will resolve Sparkle and swift-markdown on first build.
md-preview/ Main app target (AppKit, WKWebView)
quick-look/ Quick Look extension (.appex)
scripts/ Release & rollback automation
Version.xcconfig Marketing & build version (single source of truth)
appcast.xml Sparkle update feed
Releases are driven by Amore — it handles building, code signing, notarization, DMG creation, S3 upload, and Sparkle appcast publishing in one shot.
Bump MARKETING_VERSION and CURRENT_PROJECT_VERSION in Version.xcconfig, then:
./scripts/release.shUse ./scripts/rollback-release.sh to revert the appcast pointer if a release misbehaves.
Pull requests are welcome. For larger changes, please open an issue first to discuss what you'd like to change.
- Fork the repo and create your branch from
main. - Run the app and verify the change end-to-end (UI changes need a manual smoke test — there's no UI test suite yet).
- Keep PRs focused; one logical change per PR.
- Match the existing Swift style (no formatter is enforced; mirror nearby code).
- swift-markdown — Markdown parser (Apple, cmark-gfm-backed)
- Sparkle — Auto-update framework
- Amore — macOS release automation (signing, notarization, DMG, hosting, appcast)

