The native Markdown app for macOS.

Your coding agents write too much Markdown. Downright renders it exactly, reviews rewrites live, and never touches your bytes.

Free · MIT · macOS 14+ · no WebView

sample.md
# Downright renderer showcase**Inline** · **bold** · _italic_ · ~~strike~~ · `code`**Links** · [open](https://x.com) · [[wiki]] · <https://x.com> · note[^1]**Math** · $e^{i\pi}+1=0$ · $\sqrt{x^2+y^2}$ · `$PATH`| Surface | Proof ||---|---|| `Model` | **pass** |> [!NOTE]> Native: prose + source + state + media.- [x] Code · math · Mermaid · table · task**Syntax** · comments, keywords, types, strings, numbers, calls:```swift@MainActor func render(_ source: String) -> NSImage? {    let features = ["math", "mermaid"]    return cache.image(for: source) { print(features.count) }}```**Math**$$\mathop{\mathrm{read}}(source) \longrightarrow \mathop{\mathrm{render}}(surface)$$**Mermaid**```mermaidflowchart LR    A[MD] --> B{?}    B -->|no| C[Keep]    B -->|yes| D[Render]```## Lower anchorsThis lower shelf gives the document map real structure without competing with the proof above.### Source`sample.md` stays the source of truth while the rendered surface stays native.### StateLinks, callouts, tasks, and math retain their local state as the page grows.### FinishThe rail is now a compact section index, not a lone tick.[^1]: Footnotes resolve locally without moving the reader away from the line.

Downright renderer showcase

Inline · bold · italic · strike · code

Links · open · wiki · https://x.com · note1

Math · eiπ+1=0 · x2+y2 · $PATH

SurfaceProof
Modelpass

Code · math · Mermaid · table · task

Syntax · comments, keywords, types, strings, numbers, calls:

swift@MainActor func render(_ source: String) -> NSImage? {
    let features = ["math", "mermaid"]
    return cache.image(for: source) { print(features.count) }
}

Math

read(source) render(surface)

Mermaid

Lower anchors

This lower shelf gives the document map real structure without competing with the proof above.

Source

sample.md stays the source of truth while the rendered surface stays native.

State

Links, callouts, tasks, and math retain their local state as the page grows.

Finish

The rail is now a compact section index, not a lone tick.

Line 1, Column 1Markdown— wpmparse —frame floor 16 ms

This window is real. Type in it.

The difference

Press Space on a Markdown file today. This is what macOS shows you.

  • MathReal symbols, inline and block. No screenshots.
  • DiagramsMermaid, drawn as part of the document.
  • TablesPipe rows become a real table.
  • CalloutsGitHub alerts, drawn natively.
  • FootnotesNumbered and linked, at the bottom.
  • CodeSyntax colours from the app's own themes.
sample.mdOpen with…Downright · Live

Real capture · qlmanage on macOS 26 · nothing retouched. The lines above are the same bytes, live. See the capture ↗

There is more of it every day.

Your agents wrote 3,000 words while you read this sentence. One of them matters. Good luck finding it.

The file changes while you are reading it.

An agent writes to the file you have open. Downright marks every word that changed and waits for you to decide what to keep.

External write

Every change lands on a timeline, so you can compare any two versions later. Setup is three checkboxes and one default: nothing leaves your Mac.

Every number here has a limit beside it.

These are the app's own measurements. The corpus, the date, and the things we did not measure are all listed below the table.

Current local benchmark · every row has its limit beside it
Measurementp50p95Budget
Parse 100 KB12.078 ms12.395 ms<250 ms
Source edit and paragraph map0.146 ms0.153 ms<8 ms
Text diff, external rewrite2.099 ms2.164 msInformational
End-to-end semantic convergence30.583 ms31.445 ms<100 ms
Syntax highlight, 10 KB Swift0.093 ms0.094 msInformational

Your median parse this visit: waiting for a keystroke. Type in the living document and the measured result joins this table.

Corpus 120,825 characters / 4,885 lines. Date 2026-08-06. Machine single unrecorded machine.

Baseline only. Not a cross-machine claim. Missing: TextKit layout, scroll frames, IME input, live window frame time.

Your text stays in charge.

One window handles reading, editing, and source. Downright adds styling on top of your file. It never changes what is in it.

Read the repository
  • Your text is the only source of truth
  • One window for reading, editing, and source
  • No WebView anywhere
  • Downright never changes a byte of your file
One surface, two honest faces

This page keeps its source too. Press ⌘⇧E.

It opens your files from anywhere.

Open a file from Finder. Preview it with Space. Flick a card and it slides — the cards have real weight. Or pipe a file through the down command.

Markdown4 files · flick one, press Space to Quick Look
down — the document from the terminalzsh

Six themes. One document.

This page uses the app's theme engine. Pick a theme and the whole page changes with it.

Free. Open source. MIT. No account.

No telemetry, no cookies, no server. This page has none of them. Your Markdown stays on your Mac.

macOS 14.0+ · direct download · Downright.dmg when verified · or brew install --cask downright

Built by one person, funded by people, not telemetry. If Downright earns its place in your dock — sponsor it.

Downright lives on your Mac. Send it there.

★ Star♥ Sponsor

No email, no server. On iPhone the first option in the share sheet is AirDrop.

⌘KThis palette
⌘⇧EFlip the window to its source
SpaceQuick Look the focused file card
1–5Structural zoom level
← → ↑ ↓Divider, zoom, rail, palette
EscClose whatever opened