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 |