A simple Markdown viewer for reading .md files
2,310
stars
241
commits
Swift
primary language
Sep 9, 2026
updated
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.
Markdown Preview is available in the official Homebrew cask repository:
brew install --cask markdown-preview
Or grab the latest signed and notarized DMG from the Releases page.
Edit Markdown directly with a native formatting toolbar:
Quick Look preview — spacebar a .md in Finder:
Customize the toolbar — drag in Print, Copy, Zoom and the rest from View → Customize Toolbar…
WKWebView pipeline backed by swift-markdown, with heading anchors and link handling.mermaid code blocks render as diagrams in both the app and Quick Look previews, using a bundled renderer so previews work offline without a CDN request.$x_1 + x_2$), display ($$\int_0^1 x^2\,dx$$), and fenced math blocks render with a bundled KaTeX. Selecting a rendered formula and copying yields the original LaTeX source (via the official copy-tex extension)..md previews from Finder spacebar, Spotlight, and Mail attachments without launching the app.mdp, md-preview, and markdown-preview from the app menu, then open files or folders from any shell with commands like mdp README.md or mdp ..md-preview://file/<absolute path> (e.g. md-preview://file/Users/me/project/README.md), the same shape as cursor://file/…. Percent-encode special characters in the path (a space becomes %20)..md opener on first launch..md, .markdown, .mdown, .txt
UTI: net.daringfireball.markdown
git clone git@github.com:pluk-inc/markdown-preview.git
cd markdown-preview
open markdown-preview.xcodeproj
Build and run the markdown-preview scheme. Swift Package Manager will resolve Sparkle, Sentry, and swift-markdown on first build.
Release builds submit native crash reports to the pluk-inc/markdown-preview Sentry project. The integration does not collect performance traces, session data, breadcrumbs, network requests, user information, document contents, or file paths. Users can turn reporting off directly from Markdown Preview > Send Anonymous Crash Reports; on later launches, the Sentry SDK will not initialize at all.
The committed DSN is a public client key. Release archives upload the app dSYM with sentry-cli; authenticate locally with sentry-cli login and keep that authentication token outside the repository.
Release builds can submit at most one anonymous app became active event per installation per UTC day when Markdown Preview becomes active. The event contains a random installation identifier, app version, macOS major version, processor architecture, locale country or region, and the flag that prevents PostHog from creating a person profile. It is used to count daily and monthly active installations and understand basic platform compatibility. It does not contain document contents, file names or paths, actions, screens, precise location, personal information, or advertising identifiers. Users can disable it from Settings > Privacy.
The PostHog project token is injected from the gitignored Secrets.xcconfig. Copy Secrets.xcconfig.example to Secrets.xcconfig and set POSTHOG_PROJECT_TOKEN before making a release build. If the token is absent, or for a Debug build, analytics remains disabled. Every event disables GeoIP enrichment, and the PostHog project must also be configured to discard IP data in Project Settings > General.
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.sh
Use ./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.
main.Markdown Preview is free and MIT-licensed. If it saved you a browser tab, you can buy us a coffee.
mermaid fenced code blocks$…$, display $$…$$, and ```math blocksSwift
86.5%
JavaScript
10.2%
Shell
2.2%
Python
1.1%
A simple Markdown viewer for reading .md files
2,310
stars
241
commits
Swift
primary language
Sep 9, 2026
updated
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.
Markdown Preview is available in the official Homebrew cask repository:
brew install --cask markdown-preview
Or grab the latest signed and notarized DMG from the Releases page.
Edit Markdown directly with a native formatting toolbar:
Quick Look preview — spacebar a .md in Finder:
Customize the toolbar — drag in Print, Copy, Zoom and the rest from View → Customize Toolbar…
WKWebView pipeline backed by swift-markdown, with heading anchors and link handling.mermaid code blocks render as diagrams in both the app and Quick Look previews, using a bundled renderer so previews work offline without a CDN request.$x_1 + x_2$), display ($$\int_0^1 x^2\,dx$$), and fenced math blocks render with a bundled KaTeX. Selecting a rendered formula and copying yields the original LaTeX source (via the official copy-tex extension)..md previews from Finder spacebar, Spotlight, and Mail attachments without launching the app.mdp, md-preview, and markdown-preview from the app menu, then open files or folders from any shell with commands like mdp README.md or mdp ..md-preview://file/<absolute path> (e.g. md-preview://file/Users/me/project/README.md), the same shape as cursor://file/…. Percent-encode special characters in the path (a space becomes %20)..md opener on first launch..md, .markdown, .mdown, .txt
UTI: net.daringfireball.markdown
git clone git@github.com:pluk-inc/markdown-preview.git
cd markdown-preview
open markdown-preview.xcodeproj
Build and run the markdown-preview scheme. Swift Package Manager will resolve Sparkle, Sentry, and swift-markdown on first build.
Release builds submit native crash reports to the pluk-inc/markdown-preview Sentry project. The integration does not collect performance traces, session data, breadcrumbs, network requests, user information, document contents, or file paths. Users can turn reporting off directly from Markdown Preview > Send Anonymous Crash Reports; on later launches, the Sentry SDK will not initialize at all.
The committed DSN is a public client key. Release archives upload the app dSYM with sentry-cli; authenticate locally with sentry-cli login and keep that authentication token outside the repository.
Release builds can submit at most one anonymous app became active event per installation per UTC day when Markdown Preview becomes active. The event contains a random installation identifier, app version, macOS major version, processor architecture, locale country or region, and the flag that prevents PostHog from creating a person profile. It is used to count daily and monthly active installations and understand basic platform compatibility. It does not contain document contents, file names or paths, actions, screens, precise location, personal information, or advertising identifiers. Users can disable it from Settings > Privacy.
The PostHog project token is injected from the gitignored Secrets.xcconfig. Copy Secrets.xcconfig.example to Secrets.xcconfig and set POSTHOG_PROJECT_TOKEN before making a release build. If the token is absent, or for a Debug build, analytics remains disabled. Every event disables GeoIP enrichment, and the PostHog project must also be configured to discard IP data in Project Settings > General.
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.sh
Use ./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.
main.Markdown Preview is free and MIT-licensed. If it saved you a browser tab, you can buy us a coffee.
mermaid fenced code blocks$…$, display $$…$$, and ```math blocksSwift
86.5%
JavaScript
10.2%
Shell
2.2%
Python
1.1%