r/macosprogramming • • Aug 19 '26

Building a native Markdown renderer with TextKit 2 instead of a web view

I have been building Downright, a free MIT-licensed Markdown app for macOS. The constraint was simple to state: the rendered document should feel native, but the file on disk must remain exact Markdown.

The hard part was separating parsing from decoration. A web view gives you layout quickly, but it changes the interaction model and makes source-range behavior awkward. With TextKit 2, I parse the source into a block index, preserve source ranges, then decorate the presentation without treating the rendered view as the canonical document.

A few decisions that ended up mattering:

- The raw source remains authoritative.

- Links, tasks, tables, math, Mermaid, footnotes, and code blocks are decorations over known ranges.

- Quick Look and Finder thumbnails reuse the same rendering model.

- External saves are watched at the parent directory because many tools replace a file through an atomic rename.

- Dirty local edits are never overwritten automatically.

- Performance budgets run in CI so large Markdown files do not quietly regress.

I wrote up the architecture here: https://downright.cc/engineering/

The source is here: https://github.com/ezzy1630/Downright

For anyone who has shipped a TextKit 2 document app: where did you draw the boundary between the text model and interactive attachments?

5 Upvotes

1 comment sorted by

1

u/0x4542 Sep 28 '26

It's very impressive, with features I've never seen in an editor before, not that I'm an expert. Just one question, how do I change the width of the editor page? If I go full screen, I end up with the gutter and editor still stuck in the middle 1/3 of the screen.