A WYSIWYG markdown editor for Windows, modeled on WordPad's behaviors, menus, toolbar, and keyboard shortcuts — but with markdown as the native (and only) format. The default surface is a Word-like WYSIWYG editor; a toggle switches to raw-markdown source editing.
Built on .NET / WPF hosting a WebView2 control. The editing surface is Milkdown (a ProseMirror-based WYSIWYG markdown editor), so markdown is the literal document model rather than a lossy import/export.
Builds are on the
Releases page —
grab MarkdownMidget-vX.Y.Z-…-net10.exe from the entry marked Latest. That's
the newest stable release, and it's what the badge above tracks.
A prerelease (-beta) may sit above it on the page while a feature is being
proven; take that one only if you want what's coming rather than what's settled.
Markdown Midget can also update itself: Help ▸ About lists the newest release
and any newer prerelease separately, so it's always clear which you're installing.
Every tagged push builds on GitHub Actions and attaches the exe automatically
(see .github/workflows/release.yml).
- WYSIWYG editing with a one-key toggle to the raw markdown source (Ctrl+E).
- Headings, bold / italic / underline / strikethrough, inline code, bulleted & numbered lists, block quotes, and horizontal rules.
- Tables (GFM) — insert dialog plus a native right-click menu for insert/delete/select column, row, or table; styled with a dark header and alternating rows.
- Pictures embedded as data URIs (travel with the file), with an aspect-locked Resize dialog.
- Links rendered like a browser, with the URL as a hover tooltip.
- Fenced code blocks with syntax highlighting (C#, JavaScript, TypeScript, HTML, CSS).
- Formatting marks toggle (¶ / ↵ / →) and spell check (private dictionary, with one-way import from Word's CUSTOM.DIC).
- Themes — seven built in (Dracula, GitHub Dark Dimmed, GitHub Light, Midget Solarized, One Light, Solarized Light, and the original Default), plus your own: drop a CSS file in the themes folder and it appears in the menu. Printing stays light whatever you pick.
- Document width (Portrait / Landscape / Full, remembered between sessions) and a zoom indicator (Ctrl + mouse wheel).
- Recent files, drag-and-drop to open, read-only mode, and a bundled Help document and changelog (Help ▸ What's New, or click the mascot — it flags unread entries with a small gold asterisk).
- Ships as a single
.exe.
- Windows 10/11 and the Microsoft Edge WebView2 runtime (already present on Windows 11; otherwise a free download from Microsoft).
- The framework-dependent build also needs the .NET Desktop runtime; the self-contained build bundles it. See Distribution.
Beta (0.8.x), in daily use and signed on every release. Windows-only for now; the editor core is web-based, so a cross-platform shell (MAUI/Avalonia) is a realistic future step. A real installer that registers in Add/Remove Programs is on the roadmap — the portable exe will stay available either way.
MarkdownMidget.sln
src/MarkdownMidget/ WPF app (net10.0-windows)
MainWindow.xaml(.cs) Menu, toolbar, WebView2 host, source toggle, file I/O
wwwroot/ Built editor bundle (served to WebView2) — generated
editor-src/ npm/esbuild project that bundles Milkdown -> wwwroot
src/main.js Editor setup + the window.MDM host bridge
build.mjs esbuild bundler
create(initialMarkdown)— mount the editor with a documentgetMarkdown()/setMarkdown(md)— used for file I/O and the source togglecmd(name, …args)— run a formatting command (bold,italic,underline,strike,code,h1..h6,paragraph,bullet,ordered,quote,hr,codeblock(language))insertMarkdown(md)— insert a fragment (used by the link/picture helpers)
The editor posts loaded / ready / change messages back to the WPF host.
Headings Ctrl+1..Ctrl+5 / Ctrl+0 (paragraph) are bound in the editor keymap
so they work while typing in WYSIWYG; the same commands also work in the raw
source view via the WPF shell (SourceFormat.cs).
Fenced code blocks are syntax-highlighted (Prism/refractor) for C#, JavaScript,
TypeScript, HTML, and CSS.
The editor bundle is embedded in the assembly and extracted to
%LocalAppData%\MarkdownMidget\editor at startup, so a self-contained publish is
a single .exe rather than an exe plus a loose wwwroot folder.
Markdown has no underline, so it round-trips as inline HTML <u>…</u>
(editor-src/src/underline.js): a custom Milkdown
mark serializes to <u>, and a remark transform collapses the <u> … </u>
inline-HTML pair back into the mark on load.
The editor bundle is checked in, so the app builds directly:
dotnet run --project src/MarkdownMidgetAfter changing anything under editor-src/, rebuild the bundle:
cd editor-src
npm install # first time only
npm run build # writes src/MarkdownMidget/wwwroot/editor.bundle.{js,css}npm run watch rebuilds on change during development.
The framework-dependent profile is the standard distributable — a single ~6.5 MB
.exe for machines that have the .NET 10 Desktop runtime (and the Edge
WebView2 runtime, which ships with Windows 11):
dotnet publish src/MarkdownMidget -p:PublishProfile=win-x64-fxdependent
# -> src/MarkdownMidget/bin/Release/publish/framework-dependent/MarkdownMidget.exeA fully self-contained profile (win-x64, ~63 MB, bundles the .NET runtime so
nothing needs to be installed) also exists for one-off use; it can't be shrunk
because WPF doesn't support trimming. The editor bundle and HELP.md are embedded
in either build. Debug/dotnet run stay framework-dependent and fast.
The mascot (art/midget.svg) is the canonical Markdown M▼ badge with googly
eyes and stubby feet, in the editor's Nord palette. art/ holds rendered PNGs
(16–256 px) and a multi-resolution midget.ico used as the app/taskbar icon
(<ApplicationIcon>), the title-bar icon, and the toolbar mark. Regenerate with
ImageMagick:
cd art
for s in 16 24 32 48 64 128 256; do magick -background none -density 512 midget.svg -resize ${s}x${s} midget-${s}.png; done
magick -background none -density 512 midget.svg -define icon:auto-resize=256,128,64,48,32,24,16 midget.ico| Action | Shortcut |
|---|---|
| New | Ctrl+N |
| Open | Ctrl+O |
| Save | Ctrl+S |
| Save As | Ctrl+Shift+S |
| Bold / Italic / Underline | Ctrl+B / Ctrl+I / Ctrl+U (in the editor) |
| Paragraph / Heading 1–5 | Ctrl+0 / Ctrl+1 … Ctrl+5 |
| Focus style box | Ctrl+Shift+H |
| Insert link | Ctrl+K |
| Exit block (escape a code block) | Ctrl+Enter |
| Toggle source | Ctrl+E |
Per the project rule, anything from WordPad that isn't strictly easy to implement is deferred from this first iteration. Notable deferrals / divergences:
- Ribbon → menu + toolbar. WPF has no trivial Office ribbon, so the MVP uses a classic menu bar + toolbar with the same commands and shortcuts.
- Font size box → paragraph Style dropdown. Markdown styles blocks (Paragraph / Heading 1–5 / code block), not point sizes — the "Styles, not size" divergence.
- Underline → inline HTML. Markdown has no underline; it round-trips as
<u>…</u>(see above). - Toolbar glyphs. Old-school flat icon buttons (Segoe Fluent Icons). The
</>mark is reserved for inline code; the source/WYSIWYG toggle uses braces ({}, → markdown source) and a document glyph (→ formatted view). - Pictures embed as data URIs. Inserting a picture base64-encodes the file
into the markdown (
) so it renders inside the sandboxed WebView and travels with the document. Right-click ▸ Resize… (aspect-locked) stores the size as inline HTML<img width height>. - Links render styled (steelblue, underlined) with the URL shown as a native
hover tooltip (a
title-attribute decoration), like a browser. - Tables (GFM): insert via Insert ▸ Table…; right-click for the minimal structure edits (insert/delete/select column, row, table). Cell selection + Backspace/Delete clears content; typing replaces it. Styled like the Markdown Monster "PDF Output" theme — dark header row, alternating row stripes.
- Modified state is content-based: the document is "unchanged" whenever it matches the last opened/saved markdown, so undoing back to that state clears the modified flag. Opening/new flushes undo history (you can't undo past the open state); saving leaves history intact (you can undo past a save).
- Drag & drop: dropping a file opens it in place when the window holds an untitled, unmodified document; otherwise it opens in a new instance. Files can also be passed on the command line.
- Read-only mode: Edit ▸ Read Only locks the document; also available via the
--readonlycommand-line switch. Help ▸ View Help opens the bundled HELP.md read-only in a new instance. - Printing (Ctrl+P) and PDF export, with header/footer and colour-code-block options, and Find (Ctrl+F, F3) in Normal / Extended / Wildcards / Regex modes.
- Deferred: page setup, Replace (find is done), text colour. (Theming shipped in 0.7.0.)
The last few releases. See CHANGELOG.md for the full history and ROADMAP.md for what's on deck.
- v0.8.1 — Tables print like they look. The header row and alternating row shading now survive onto paper in every theme (dark themes print a light row shade so text stays readable); the rest of the page still prints light.
- v0.8.0 — Updates keep your place: the restart carries your document and view mode, stale windows get Help ▸ Apply Update for a one-click switch to a version another window already installed, and the About box shows installed vs running when they differ. Plus Edit ▸ Settings ▸ Import words from Word's custom dictionary (one-way), and a fix for dictionary words vanishing when another window wrote the file.
- v0.7.0 — Themes. Seven built in — Dracula, GitHub Dark Dimmed, GitHub Light, Midget Solarized, One Light, Solarized Light and the original Default — plus your own: drop a CSS file in the themes folder and it appears in the menu, checked before it is used and greyed out with a reason if it can't be. The source view and mermaid diagrams follow the theme; printing stays light whatever you pick. Also: File ▸ New opens a new window, Settings moved to the Edit menu, and Help ▸ What's New (or the mascot) opens the changelog.
- v0.6.4 — Updating with several windows open now says "restart this window" instead of a raw Windows error, and stops before downloading anything it doesn't need.
- v0.6.3 — Unsaved work survives a crash: a copy is kept while a document has unsaved changes and handed back on the next launch, still marked unsaved and still bound to its file. Superseded prereleases no longer clutter the About box. Ships patched dompurify and postcss.
- v0.6.2 — The window remembers where you left it (validated against the monitors that still exist, and correct on mixed-DPI desks); word and character count in the status bar; Edit ▸ Settings… for the Open Recent length and what a session opens with; and File ▸ Open, Open Recent, drag-and-drop and the command line all put the cursor in the document too.
- v0.6.1 — File ▸ New puts the cursor in the document, so the first thing you type doesn't go nowhere.
- v0.6.0 — In-app updates with a real About box: versions, licence and copyright links, stable and prerelease listed separately, and one-click updates that verify the Funcular Labs signature before installing. Plus a round of spelling-menu fixes.
MIT © Funcular Labs.
The bundled editor is built on Milkdown / ProseMirror with syntax highlighting via Prism / refractor, each under their own permissive licenses.

