logo
I built Werner because I wanted a Markdown editor that didn't make me choose between plain files I own and a writing experience that actually feels good. Most apps pick one side: either a glorified textarea over .md files, or a "nice" editor that swallows my notes into a proprietary database.

Werner stores plain .md files in folders you choose, but offers four ways to work with them, switchable per-document:

Source — CodeMirror 6 with markdown syntax highlighting

Split — source + live preview

Preview — rendered output only

Interactive — a real WYSIWYG (TipTap 3) that round-trips to clean GFM

The interactive mode was the hardest part. TipTap's default Markdown serializer mangles GFM features I care about — table column alignment (:---:), task lists, strikethrough, hard breaks (two-space convention). So I wrote a custom ProseMirror→Markdown serializer that handles all of them and survives round-trips without diff churn.

A few other things that might be of interest:

Unified search across all four modes. One query, three adapters (CM6 search API, a custom ProseMirror decoration plugin, DOM <mark> injection for the preview). Query persists when you switch modes.

Stack: Tauri (Rust backend), React + TypeScript, Tailwind v4 with an OKLCH-based token system, shadcn/ui. Markdown rendering happens in Rust via IPC.

Mac App Store sandbox done properly. Security-scoped bookmarks for "open this folder and remember it," with a reconnect flow when bookmarks fail (e.g., external drive unmounted).

No lock-in. Files stay where you put them. Delete the app and your notes are still just .md files in folders.

It's on the Mac App Store: https://apps.apple.com/ua/app/werner/id6758157982?mt=12. Free

Things I know I haven't solved yet: No plugins yet, no realtime collaboration, no vim mode, no Win/Linux builds yet.

Happy to dig into any of it — the GFM serializer, the search architecture, the sandbox bookmarks, the Tauri tradeoffs vs. Electron, or anything else


Loading...