// What You Write Is What You Mean
A fast, native macOS Markdown editor for technical writing. Plain text in, publication-quality technical preview out. GitHub-Flavored Markdown, code, math, Mermaid diagrams, and export-ready typography — all bundled, all local, all yours.
macOS 14+ on Apple Silicon. Notarized & stapled — opens without a Gatekeeper prompt.
Most Markdown editors are either Electron blobs that idle at 400 MB of RAM,
rich-text WYSIWYGs that secretly mangle your .md on save,
or cloud-locked notebooks that hold your prose hostage behind a subscription.
Writ takes the opposite stance: plain text is the canonical format, your files live where you put them, and the preview renders structure and meaning — not a fake page of decorative font choices.
The principle is WYWIWYM — What You Write Is What You Mean. You write Markdown. Writ shows you what it means — including math, diagrams, and code — without ever pretending to be the document itself.
⌥-drag or ⌥⇧↑/↓ to select a rectangle, then edit every line at once — turn lines into a list, add table borders, strip a column of junk. One undo for the whole gesture.NSTextView, not SwiftUI TextEditor. Real undo, find/replace, tabs, autosave, spellcheck — all the macOS behaviors you'd expect.WKWebView preview with debounced, off-main-thread updates so typing never blocks.apple/swift-markdown backed by cmark-gfm. Tables, task lists, strikethrough, the lot.$…$ and display $$…$$ math rendered with KaTeX. MathJax bundled as a runtime alternate.```mermaid blocks render to native SVG diagrams — flowcharts, sequence, class, state, and more.```plantuml blocks render through a renderer you choose — opt in per document with plantuml: true and point Settings at a server. Without both, the fence stays source and nothing leaves your Mac..md file is your .md file..md, .markdown, .txtA native macOS app on top of a small set of local Swift packages. No IPC, no Electron, no remote services.
App/ hosts the AppKit document app, editor, preview, menu, export, and window controllers.
WritCore handles document snapshots, revisions, hashes, render jobs, large-document mode, and technical-block models.
WritParser does Markdown parsing, math preprocessing, technical-block extraction, and HTML emission.
WritRender manages preview scheduling, technical-block caching, export helpers, and the bridge payloads.
The editor is NSTextView with TextKit 2 where practical.
The preview is a persistent WKWebView loaded once per document, then updated through a small JavaScript bridge —
window.Writ.update(...). Parsing and preview scheduling run off the main thread so typing stays responsive.
Render pipeline:
WKWebView receives an update payload via the bridgeWrit is local-first: no account, no telemetry, nothing fetched at runtime. KaTeX, MathJax, Mermaid, and highlight.js are bundled in the app, so everyday rendering happens offline and your prose and code stay on the machine.
One feature can reach the network, and only if you ask for it twice. PlantUML has no engine
to bundle, so rendering those diagrams means sending that part of a document to a server. It stays off until
you add plantuml: true to a document's front matter and enter a renderer address in
Settings — a server you run or choose to trust. Neither is set out of the box, export never initiates a
request, and with neither in place nothing leaves the machine. The
privacy policy spells it out.
Writ's MVP non-goals, stated up front so nobody has to ask:
WYSIWYG / Typora-style inline rich editing. Cloud sync, collaboration, accounts, proprietary storage. Plugin system. AI writing or generation features. Mobile, iPadOS, Windows, or Linux. A full publishing platform. A heavy custom theme engine.
If a feature is missing, that's the answer. If it's in TODO.md, it's on the way.