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
Terretta•2h ago
https://typora.io