Saw a few threads recently about people having issues with markdown in DOpus, and I’d hit the same wall myself. The PowerToys handler kept throwing errors for me too. So I built my own viewer a while back to scratch the itch, and spent today tidying it up to make it a bit more accessible and compatible. Thought I’d share in case it’s useful to anyone else here.
It's WebView2-based and does more than the existing options. Three core modes:
Reading - clean rendered HTML
Live - the formatting stays visible until your cursor enters a line, then the raw markers reveal just for that line
Source - raw markdown, with an optional split pane inside the viewer (source left, live preview right, draggable handle, link/unlink scroll sync)
Why it shouldn't randomly quit on you
It works around the WebView2 DPI bug that trips up the PowerToys handler, and deals with the cases the existing plugin chokes on, so it should stay up.
Editing
Full formatting toolbar: bold, italic, strikethrough, highlight, inline code, link, footnote, a cycling heading button (H1 to H6), bullet / numbered / task lists, indent, quote, code block, image insert
Reorder or hide toolbar buttons, and set either toolbar to auto-hide (sweep the edge to bring it back)
Right-click context menu in any mode
Syntax highlighting in all three modes (js, ts, python, rust, go, c/cpp, sql, json, yaml, shell, powershell and more), with a copy button on every rendered code block
Word-wrap toggle for long code lines and URLs
Saving and files
Save and Save As, in the viewer pane or popped out into its own window (double-click a .md)
Conflict-aware auto-save: if another app changed the file underneath you, it backs off instead of clobbering it
Unsaved-edit persistence: switch to another file with unsaved edits and it holds them, click back to keep them or reload from disk
Line-ending aware: optional LF / CRLF badge at the end of each line, and your file's endings are preserved on save
In-app updater: checks the repo for a newer build and installs it, no manual quit / extract / reinstall
Images
Insert popup: pick a file or paste a URL, set alt text, width / height, alignment. URL images download into the document folder (with magic-byte type sniffing) so your markdown stays self-contained
Remote-image privacy gate (off by default): https image URLs render as a placeholder and make no network request, so the host can't tell you opened the document
Obsidian-style sizing syntax works, e.g. 
Themes
29 built-in palettes (17 dark, 12 light: Dracula, Nord, Gruvbox, Tokyo Night, Catppuccin, Solarized and so on), or save your own
The whole UI re-tints to the active palette: toolbars, selection, scrollbars and the syntax highlighting. Code colours can follow the palette automatically, or you can pin a specific syntax theme
Language and encoding
Auto-detects UTF-8 / UTF-16 (LE/BE) via BOM, with a configurable fallback codepage for legacy files
Renders Arabic, Hebrew, CJK, Devanagari, Thai, Greek and mixed bidi text
Full GFM-plus extension set: tables, task lists, footnotes (editable in place), definition lists, abbreviations, mark / highlight, sub / sup
Built it because I work with a lot of markdown day to day and didn't want to fire up a separate app for every small edit. The whole point is keeping it inside DOpus. Bear in mind it's a solo thing that I just extended because a few recent comments here made me think others might get some use out of it.
I'll push updates to the repo as I improve it. There are install and uninstall scripts for the pre-built package, in app updater and more info here:
Pleasure! And here is a new release with extra features for you (nice bike btw, see you on the road).
mdWorX v0.1.1
Released: 2026-05-26
New features
Editor toolbar expanded. New buttons for task lists, indent/outdent, fenced code blocks, footnotes, and image insertion. The image button opens a popup with Browse, alt text, width/height, alignment, and an option to copy the file into the document's folder.
Obsidian-style image syntax. now sets dimensions and alignment in one go, working identically in Reading and Live. Windows absolute paths (e.g. C:\images\photo.png) now resolve correctly.
Save your own palettes, styles, and themes. A Save menu in settings lets you keep the current configuration as a colour-only palette, a typography-and-layout style, or a full theme. Saved entries persist between sessions and show up in the preset picker.
Show formatting characters. A Live-mode overlay reveals every space, tab, and line ending in your file, with LF/CRLF badges so you can tell line-ending conventions apart.
Hard line breaks toggle. Choose whether a single newline renders as a visible break in Reading mode or flows as soft whitespace.
Page shadow and border controls. Adjustable shadow depth plus independent colour and thickness for the page outline.
Inline mark colours per palette. Bold, italic, strikethrough, and inline code each have their own colour entries that follow the active palette.
Heading underline thickness. Separate control from the horizontal-rule thickness, with a new default gradient style.
Palettes
Eight new palettes added: Obsidianite, Obsidianite Light, AnuPpuccin Frappé, Everforest, Rosé Pine, Vesper, Red Rascal, and One Light.
Existing palettes refined for better contrast against AA standards, particularly accent, link, and heading colours on lighter backgrounds.
Improvements
Settings dialog overhauled. Hover tooltips on every setting, a live colour preview that repaints as you scroll palettes, and input fields that stay readable on any palette.
Palette-aware chrome. Headings, horizontal rules, page borders, and section underlines now follow the active palette instead of a fixed colour.
Reading and Live parity. Lists, images, and spacing render consistently between the two modes.
Source-mode whitespace markers softened. Faint space dots and tab arrows are now half as visible so they sit quietly in the background.
Fixes
Preset picker no longer reverts to a stale palette name after picking a default.
Syntax highlighting in rendered code blocks restored.
Double-underline on Live headings removed.
Also
Plus a swag of smaller cosmetic refinements throughout (heading spacing, gradient underlines, highlight colour, dropdown carets, slider sizing, README rewrite, and similar polish).
Install
Download mdWorX_v0.1.1.zip, extract, and run Install.cmd. Full instructions in the bundled README.txt, or in the repository README.
If you have any problems or weirdness, best to place an issue ticket on GitHub. I will attempt to resolve them as soon as I can.
Another release to fix minor bugs and some more useful features including file persistence so you don't loose temporary edits along with autosave function.
mdWorX v0.1.2
Released: 2026-05-26
Key features of this release
Unsaved edits persist when you switch files in the viewer pane
Optional auto-save on a minute interval
Image popup downloads URLs locally
Remote images blocked by default for privacy
Settings dialog now closes cleanly when opened from DOpus's Plugins preferences
New features
Unsaved edits stay around when you switch files. Edit something in the viewer
pane, click another file, click back — your edits are still there. A banner asks
whether to keep them or reload the disk version. Lives for the current DOpus
session only.
It notices if you changed the file outside mdWorX. Same banner, but worded so
you know the file moved under you.
"Always reload external changes" setting. Skip the banner and always grab the
disk version. A toast in the settings warns that unsaved edits get thrown away
under this mode.
Auto-save (minutes). Pick an interval in settings and it'll Ctrl+S for you
while you've got changes.
Image popup takes URLs now. Paste a link and it downloads the image next to
your markdown. The saved syntax points at the local copy, not the original URL.
Real image-type detection on the download. Reads the file's actual bytes so a .jpg URL serving a PNG ends up with the right extension. HTML 404 pages and
similar non-images get rejected outright.
External image URLs in markdown are off by default. They render as a
placeholder until you flip "Allow remote images" in settings. Keeps hosts from
logging that you opened a doc that references their images.
Improvements
Mouse wheel over either toolbar now scrolls it sideways instead of leaking
through to the page.
The unsaved-edits banner stays out of your way if your stash matches what's on
disk anyway.
Fixes
Settings can be closed when opened from DOpus's Plugins prefs (#3, thanks@iamlimeng@iamlimeng for the report and @PolarGoose for the pointer).
Images show as images straight after Insert instead of leaving the markdown
syntax sitting there.
Two-line headings (Title\n====) no longer get a double underline.
Install
Download mdWorX_v0.1.2.zip, extract, run Install.cmd. Full instructions in the
bundled README.txt or the repo README.
Anything weird, file an issue on GitHub and I'll have a look.
Public beta of the v0.2.0 line. Open for testing alongside v0.1.2; not yet the stable cut. Headline additions are the in-app updater, fenced-code syntax highlighting that follows your palette, toolbar customisation, auto-hide toolbars, plus a handful of editing-toolbar tweaks.
New features
In-app updater. Settings dialog gains an "Install update" button next to "Check for updates". Click Check, and if a newer release exists with an attached zip the Install button enables. Click it, confirm, and mdWorX downloads the release zip from GitHub, extracts it, and runs the bundled Install.cmd. The installer self-elevates via UAC, closes DOpus, swaps the DLL and assets, and relaunches DOpus. No manual download / extract / quit / install dance any more.
Fenced-code syntax highlighting across all three modes. One Lezer-based highlighter drives Reading, Live, and Source mode, so a fenced block looks identical regardless of how you're viewing it. Languages covered: javascript / typescript (incl. jsx / tsx), python, rust, go, c / cpp, sql, json, yaml, xml, html, css, markdown, plus shell / bash, diff, ini, and toml.
Palette-driven syntax colours. Each token role (keyword, string, comment, number, function, type, operator, variable, punctuation) has its own CSS variable. Palettes can override per-role colours through the same --code-<role>-override mechanism the rest of the palette system uses, so a custom palette can fully retheme the code highlighter without touching CSS.
Code-theme picker. Ten built-in code themes ship alongside the palette colours: GitHub Light, GitHub Dark, Solarized Light, Solarized Dark, Monokai, Dracula, Nord, Tomorrow, Tomorrow Night, One Dark. New codeBlockTheme setting, default match-palette (which keeps the code following whichever palette is active).
Toolbar customisation. Both the top toolbar and the formatting toolbar can be re-ordered and have individual buttons hidden. The settings dialog grows a toolbar-layout row per toolbar: drag tiles to reorder, click a tile to toggle visibility, drag the separators to move them around too. Stored as topToolbarLayout / editToolbarLayout. New buttons added in future versions append at the end rather than silently disappearing.
Auto-hide toolbars. New topToolbarMode / editToolbarMode settings, each always or auto-hide. Auto-hide adds a 10px hot-zone strip at the top of the viewport; hover over the strip, the toolbar itself, or any element holding keyboard focus to reveal it. A 400ms grace period after mouseleave keeps it from flickering away while you reach for it.
Highlight (==text==) toolbar button. New button between strikethrough and inline-code. Wraps the selection in == markers, rendered with the palette's highlight colours in Reading and Live mode (powered by markdown-it-mark).
Cycling heading button. The three separate H1 / H2 / H3 buttons collapse into one button that walks the level on each click. The number on the glyph shows the level the next click will apply. Clicking on an existing heading line replaces the level in place rather than stacking #s.
Per-palette blockquote and table-header colours. Picking a palette like Dracula now tints blockquotes and table headers in the palette's code background colour automatically. Saved palettes round-trip these fields too.
Install
Download mdWorX_v0.2.0-beta.zip, extract, run Install.cmd. Or, if you're already on v0.1.2, open Settings, switch to the About tab, click Check for updates, then click Install update once it lights up.
Build from source
cd web
npm install
npm run build
cd ../plugin
./build.ps1
Succeeds v0.1.2. Adds an in-app updater, palette-aware syntax highlighting, a code-theme picker, toolbar customisation and auto-hide toolbars, plus a round of stability fixes.
New features
In-app updater. The About tab checks GitHub for a newer release and installs it (download, swap, relaunch), no manual quit/extract/install.
Syntax highlighting in all three modes. One highlighter for Reading, Live, and Source. Covers js/ts, python, rust, go, c/cpp, sql, json, yaml, xml, html, css, shell, powershell, ruby, lua, perl, swift, dockerfile, diff, ini, toml.
Palette-driven code colours. "Match palette" derives the nine token colours from the active palette; each palette has its own curated set.
Code-theme picker. Lock code colours to a specific scheme. "Use syntax theme in source mode" extends it to the Source editor.
Toolbar customisation. Reorder or hide formatting-toolbar buttons.
Auto-hide toolbars. Set the top or formatting toolbar to slide away; sweep the edge to bring it back.
Highlight button for ==marked== text, and a cycling heading button that walks H1 to H6.
Line-ending aware. A per-line LF / CRLF badge in Source and Live modes (Show formatting characters); Live also marks spaces and tabs, and each file keeps its line endings on save.
Context menu. Right-click in any mode for quick actions like copy.
Conflict-aware auto-save. Optional timed auto-save that backs off when another program has changed the file, so it never overwrites external edits.
Unsaved-edit persistence. Switch files with unsaved edits and they're held; click back to keep them or reload from disk.
Fixes
Body text colour now reaches paragraphs and lists in Live mode, matching Reading.
Blockquotes and table headers now follow the active palette instead of staying a fixed grey.
Plus a long tail of smaller refinements, polish, and edge-case fixes across the editor, settings, and rendering pipeline.
Install
Download mdWorX_v0.2.1.zip, extract, run Install.cmd. Or update in-app: Settings > About > Check for updates > Install update.
Build from source
cd web
npm install
npm run build
cd ../plugin
./build.ps1
I agree !
It is quite good, but there is much important to it that I don't really understand.
I have just been waiting and seeing what's next !
Well, as we begin to discuss these things, at the risk of asking too much too soon,
a hook or something to render Obsidian md files would be just great.
My special interest is the community Asciimath plugin, but default Obsidian Latex equations would also be a nice pipe dream come true.
I already can do on the fly source code modifications.
This plugin is very good and useful so far.
Good news on the text files: previewing plain-text and source files with syntax highlighting is already
working in my dev build, so that one's coming in an update.
Maths is on my radar too. The honest constraint isn't difficulty, it's weight: a maths renderer means
shipping its stylesheet and fonts with every file, which fights the lightweight, Sumatra-quick feel I want
to protect. So the plan is to load the maths engine only when a document actually has equations, rather than
bloating every open. Obsidian-style $$…$$ LaTeX is the straightforward target; AsciiMath (your interest) is
a different syntax so it needs a bit more plumbing, but it's on the list. Watch this space.
Before following your install instructions, I checked that the files were at the right location:
Viewers\mdWorX.dll
Viewers\mdWorX_assets\
Then I was trying to make it work by following your instructions:
In DOpus, go to Settings → File Types.
Ok
Edit (or create) the Markdown file type covering md, markdown, mdown, mdwn, mkd, mkdn.
Ok: I have created a File Types Groups and added all the file extensions to it.
Open the Events tab.
Ok: Events tab is located inside the Commands tab.
Select Left double-click, click Edit, and set the command to just Show.
I choose the Function: Standard Function (Opus or external) and wrote under Commands "Show". And these questions appers: Just "Show"? Where is the link to your PlugIn?
After left-double-click on a md-File the file opens in the standard Windows editor.
I think that's a bug on our side. We'll investigate, but if you create the type and then edit it you get the Commands -> Events tab. It's just missing when first creating the type.
I followed the steps, but the result is the same. The file only opened in the same editor as when I opened it from the Windows Explorer. I also restarted DOPUS, but the same result.
It would be helpful to have a function that removes all formatting or return a line/block or selection to default text. For example, I found a line in a md file that was a different font and size. A simple one-click button could remove all previous formatting, making it easy to reformat it consistently with the rest of the document.
I notice that copying material from Logseq maintains the underlying formatting like headings but changing them (say h1 to h3) seems to keep extra "#" codes. I am not sure what is happening here.
I also have Typora, and can make changes there, but when I used this extension in DOPUS, it seemed much more convenient. You have exceeded my expectations as you have added more functionality. This is so good it should be a standard part of DOPUS.
This is actually going to be covered in a pretty big update, which I hope to release soon, so keep your eye out for it. I will release it as a beta for you guys to test and let me know.
And yes, it is turning out to be exceeding even my expectations from when I first had it. I just keep finding things that I can add to it. Luckily, a lot of this stuff I can port from previous work I've done, so I know the method roughly, then it's just working with the nuances of CodeMirror and co.
I'm just lucky that DOpus has made it actually quite easy to integrate on that side, so it's really a big thanks to them for making this available. I just hope there's lots of envious eyes from people who don't have DOpus and wish they could for things like this, which will hopefully convert into revenue for them.