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
This problem has risen to the top of many people’s minds at this moment (including mine!). My Show HN for a similar cli + web based solution (https://sdocs.dev) was on the /show page a few days ago (https://news.ycombinator.com/item?id=47777633).
SDocs is cli -> instantly rendered on web
Despite being in the browser, the content of SDocs rendered Markdown files remain local to you. SDoc urls contain your markdown document's content in compressed base64 in the url fragment (the bit after the `#`):
https://sdocs.dev/#md=GzcFAMT...(this is the contents of your document)...
The url fragment is never sent to the server (see https://developer.mozilla.org/en-US/docs/Web/URI/Reference/F...: "The fragment is not sent to the server when the URI is requested; it is processed by the client").The sdocs.dev webapp is purely a client side decoding and rendering engine for the content stored in the url fragment. This also means you can share your .md files privately by sharing the url.
- focus, visual, source modes
- full mermaid diagrams including -beta
- math
- inline styles including e.g. highlights, super/subscripts, etc.
- import/export doc types
- file organizer in addition to outline mode
- themes for screen and print
- GitHub GFM tables work, "all features you care about" supported
- beautiful
- multi-platform
- no subscription, one time $14.99 (pro or con: not in app store)