mder v0.1.226

Documentation

A markdown editor and renderer built for screen readers, NVDA first.

What's with the name? MD-er? uh I dunno, but the md is definitely honoring the .md extension. It's also fast to speak and easy if silly to say. I say it as a word rather than spelling out M D, because it's funnier that way.

mder is written largely through agentic coding, with an AI coding agent doing most of the programming. See How mder is made.

The window has two panes: a plain text editor for the markdown source, and a rendered view you read in browse mode. They stay in sync:

How the syncing works, and what we learned along the way, is written up for each screen reader:

If another program changes a file that mder has open, it reloads both panes within about a second. If you have edits in mder that aren't saved yet, it asks first whether to reload the file, losing your edits, or to keep your edits.

Getting it

Download the latest version from mder's page on valiant8086.com, or from the releases page on GitHub. Both have the same files. The file names start with the version, such as mder0.1.5, then say which system and processor they're for.

To offer mder when you open markdown files from Explorer (or your Linux file manager), use Tools, Options, or run mder --register once. See Open with below.

Command line

mder [--edit | --view] [--line N] [--find TEXT] [--anchor SLUG] [--log FILE] [FILE[:LINE][#SLUG]]
mder --register
mder --unregister

On a Mac, start mder through open, with full paths. For example, instead of mder --line 42 notes.md, run:

open -n /Applications/mder.app --args --line 42 /path/to/notes.md

There's more about why below the table.

Command What it does
mder notes.md Opens the file.
mder notes.md:42 or mder --line 42 notes.md Goes to line 42.
mder notes.md#setup-steps or mder --anchor setup-steps notes.md Goes to the heading with that anchor (GitHub style: lowercase, punctuation dropped, spaces as hyphens).
mder --find "some text" notes.md Goes to the first line containing that text. An exact match wins; otherwise the match ignores case.
--edit or --view Opens in the editor, or in the rendered view, whatever the settings say. See Which pane a file opens in.
--log FILE Writes a debug log to that file, for troubleshooting. See Debug log.
mder --register Windows and Linux: offers mder in Open with for every file type it supports, without changing the default app. Mac: makes mder the default app for those types. See Open with.
mder --unregister Windows and Linux: removes mder from Open with. Mac: gives each type back to the app that opened it before mder; for any type where mder doesn't know which app that was, it says so, and you choose one in Settings.

Each file opens in one window. Running mder again for a file that's already open in another instance of it sends the location (if provided) to that window, brings it to the front and exits with code 0. The window reloads the file from disk first. Exit code 1 means the open window didn't respond.

This makes mder easy to drive from another program or AI coding agent. For example, after changing a file, Claude could run mder --find "the changed text" file.md to show you the exact context in the rendered view. Just pressing Enter is all it takes to then make your own edits.

On macOS, launch it through open, so it starts as an app and can come to the front, and pass full paths:

open -n /path/to/mder.app --args --find "the changed text" /path/to/file.md

-n starts a new copy each time, which hands the location to the window that has the file, as on Windows. Opening files from Finder works without any of this.

Which pane a file opens in

Tools, Options, on the General tab, has two settings, both set to the rendered view at first:

--edit or --view overrides both for that launch. A file that's already open stays in whichever pane you're in, and moves to the location there, unless --edit or --view says otherwise. With no file, mder starts in the editor.

Settings are saved in mder.ini, next to mder.exe, so mder stays portable. If that folder can't be written to, they go in %APPDATA%\mder instead, or ~/.config/mder on Linux. On macOS, Settings is in the mder menu (Command+Comma), and the file is in ~/Library/Application Support/mder.

Debug log

mder --log C:\path\mder.log notes.md makes that window add a line to the log file whenever it gets a location to go to, moves the editor's caret, puts the screen reader on a block in the rendered view, or notices the file changed on disk. Each line starts with mder's process number, so lines from different windows can be told apart. Without --log, mder writes no log at all.

If the file is already open, the window that has it starts logging to that file too, if it wasn't logging already. An Options setting is planned that will turn the log on, and choose its file, for every launch. When it arrives, --log will still override it for that launch.

Open with

On Windows, registering adds mder to the list in the "How do you want to open this file?" dialog. In Explorer, open a markdown file's context menu, choose Open with, then "Choose another app", and mder is in that list. mder never changes which program opens a file type by default. If you want markdown files to always open in mder, check "Always use this app" in that dialog.

Registering writes to your user's part of the registry, so it needs no admin rights. It records where mder is, so if you move mder, register it again from its new place. Tools, Options shows any type still pointing at the old copy, and checking it moves it to this one.

On macOS, mder.app is always in Finder's Open With menu for markdown files. The Integration tab in Settings instead chooses which types open in mder when you double-click them. Checking one makes mder the default and remembers the app it replaced; unchecking gives the type back to that app, or asks which app to use. macOS asks you to confirm each change.

On Linux, registering works as on Windows: mder joins the Open with list in your file manager, and never changes which program opens a file type by default. Linux desktops go by file type rather than extension, so the Integration tab has one box for all markdown. Registering writes mder.desktop to ~/.local/share/applications, and also teaches your desktop that .mdown, .mkdn and .mdwn are markdown (some systems call them plain text), with mder.xml in ~/.local/share/mime/packages. Unchecking the box removes both. If no default program is set for markdown, the desktop may open it in mder on double-click, since mder names markdown more closely than general text editors do; choose a default in your file manager's Open with dialog to change that. --register and --unregister work here too.

A note on portability: registering is the one part of mder that isn't portable, since that is recorded on the computer instead of in mder's folder. If you move mder, register it again from its new place. If you're removing mder from a computer, unregister it first, so it isn't offered anymore.

Updates

mder checks for a new version when it launches, no more than once a day. If there is one, it shows what changed since your version, with three choices: Install Now, Ignore Version, and Maybe Later. Ignore Version skips that version and avoids prompting you to update until the next version is out. You can also check any time with Help > Check for update, and turn the daily check off in Tools > Options on the General tab (mder > Settings on the Mac).

Install Now downloads the new version, puts it in place of the old one, and restarts mder on the same file, in the same pane. Every other open mder window restarts on the new version too; one with unsaved changes asks first whether to save them. mder replaces itself in its own folder, so that needs to be a folder you can write to; if it isn't, mder offers to open the download page instead. Updates come from mder's GitHub releases. On the Mac, updating should not cause mder to be blocked from running again.

Every version's changes are on mder's changelog page.

How mder is made

mder is built with heavy use of agentic coding. An AI coding agent, Claude Code, writes most of the code, scripts and documentation, working from my direction. I decide what mder does and how it should behave, and I test the changes myself with screen readers: NVDA, JAWS and Narrator on Windows, VoiceOver on the Mac, and Orca on Linux. What we learned along the way, such as how NVDA reads web views, is written up in the docs folder.

License

mder is licensed under either of

at your option. Please keep the credits in NOTICE.txt when you use mder or parts of it.

Unless you say otherwise, any contribution you submit for inclusion in mder is licensed as above, without any additional terms or conditions.