"WYSIWYG is only justified if the markup must never appear. For a Markdown native, it never has to."
What WYSIWYG Actually Costs
A WYSIWYG editor (Tiptap, ProseMirror, Lexical) is a genuinely powerful thing — but it comes with a specific cost: it replaces the source string with a rich-text document model. Now bold is a schema node, a heading is a node, and the Markdown you started with has to be parsed into the tree on load and serialized out of it on save. You've traded one representation (source) for three: the tree, the rendered view, and the Markdown you import/export.
The One Condition That Justifies It
That trade is worth it under exactly one condition: the markup characters must never be visible. If you're building a word processor for people who should never see a # or a ** — who want to click a Bold button and see bold, full stop — then a rich-text model is correct and the three-representation cost is the price of that experience. That's a real, valid product. It just isn't this one.
Condition: "markup must NEVER appear" -> WYSIWYG is justified (rich-text model)
Condition: "markup is meaningful, keep it" -> source model + Live Preview
# Rekindle's user is in the second row. So the heavier model buys nothing.
A Markdown Native Doesn't Meet That Condition
Dad is a Markdown native. The vault, the essays, the site content, years of Sublime and Obsidian and iA — all source-mode, all markup-visible, by preference. He wants to see the #. For that user, a WYSIWYG model would fight the workflow at every turn: hiding characters he relies on, forcing a parse/serialize round-trip on a file he'd rather edit directly, and complicating every soul feature that wants to read plain source.
So Rekindle takes the lighter road: source is the model, and Live Preview (decorations) gives the rendered look without the rendered model. You see bold as bold on inactive lines and the raw ** on the line you're editing — the readability of WYSIWYG with none of its representational tax. WYSIWYG wasn't rejected because it's bad; it was rejected because its one justifying condition isn't met.