Plain
Double-click a .md file and you are reading.
A lightweight Markdown reader and editor for Windows 11 and macOS. Make a change, and the file stays yours, byte for byte. Your library is a plain folder on disk: no database, no account, no network. One monospace font, light and dark themes, no toolbars, no icons.
One document. Four ways to look at it.
Plain keeps one buffer per file and shows it the way you need right now. Switch with Ctrl+/ or click the mode bar. Caret, selection, and scroll position survive the switch: leave read at a heading and edit opens at the same heading.
Headings with anchors, tables, code with a copy button, footnotes, images from your folder. A line above the title shows date, word count, and reading time. Ctrl+F searches the rendered text.
CodeMirror 6 with syntax highlighting, line numbers, folding by heading, multiple cursors, find and replace. Lists and checkboxes continue on Enter with the marker your document already uses.
The same buffer with **, #, and > tucked away on every line except the one you are on, the way Typora does. Headings sized, links underlined, checkboxes clickable.
Edit on the left, the rendered page on the right, updating as you type and scrolled to the same heading as your caret. The divider drags.
All the Markdown you need. Nothing you don't.
CommonMark and GFM, plus the handful of extensions people actually use in their notes. No custom dialect: what Plain renders, GitHub and Obsidian render too. The file itself is never rewritten to fit the parser.
assets/edit → insert, in the command palette, on Ctrl+Alt shortcuts, and on a one-row toolbar above the editor. Toggling a fence, a list, or a callout on a block that already has one removes it instead of nesting. The toolbar switches off in settings if you prefer a bare editor.
A folder is the library.
Open a folder with Ctrl+Alt+O or drop it onto the window. Plain reads the .md files in it and writes nothing back except the documents you save. No index, no cache, no hidden service folder. Put the folder in OneDrive or Dropbox if you want it on two machines.
.git, and node_modules stay hidden. Create, rename, delete to the Recycle Bin or Trash. A new file opens immediately; you name it inline afterwards. Changes made outside Plain show up on their own.>> prefix. Finds Cyrillic file names too.#tag. Word counts are counted lazily for the rows on screen and cached for the session.[[wikilinks]] or relative links. Both sections appear only when there is something to show.Your bytes are not ours to change.
Most editors quietly reformat the file they open. Plain treats the file as the source of truth. Nothing you did not touch changes, and Ctrl+S on an untouched buffer does not write to disk at all. This is the one part of the app where correctness was never traded for simplicity.
Byte fidelity. List markers, indentation, trailing spaces, the byte order mark, the final newline: all preserved exactly as they were.
Line endings. CRLF or LF, kept as they were. A file that mixes both is saved in its dominant style, and the status bar says so.
Encodings. UTF-8, UTF-8 with BOM, and UTF-16 are written back as read. A legacy cp1251 file gets one question the first time you save: convert to UTF-8, save as, or cancel.
Atomic writes. The text goes to a temporary file next to the original and replaces it in one step. An interrupted write cannot corrupt a document. Before writing, Plain hashes the file on disk and refuses to overwrite a version it has not seen.
Changes on disk. With no edits of your own, the file is reloaded quietly. With edits, a banner offers reload, save my copy as, or a line-by-line compare. Plain never overwrites the other change.
Every change to a buffer is mirrored into a recovery draft in Plain's data folder within 2 seconds. If the program or the computer shuts down, the next launch shows unsaved work found with restore and discard.
Snapshots of what you saved are kept for 30 days under version history. Autosave exists as a setting and is off by default. Files over 2 MB open without highlighting and render on request, never truncated silently.
One font. Two themes. Keyboard first.
IBM Plex Mono everywhere. One accent colour for the caret, the selection, and the modified dot. No icons, no rounded corners, no shadows inside the window; hierarchy comes from spacing and 1px lines. Light and dark follow the system or your choice. Everything is in the file · edit · view · help menu, the command palette, and the shortcuts below.
Shortcuts bind to physical keys, so Ctrl+B is bold in a Cyrillic layout too. On a Mac, ⌘ takes the place of Ctrl; the few combinations macOS reserves are remapped and listed under help → shortcuts.
The whole settings file. Edit it on the settings screen (Ctrl+,) and changes apply immediately, or open settings.json by hand.
Download, unpack, double-click.
Builds for both systems are on the releases page. Nothing else needs to be installed: no Node, no Rust, no separate WebView2 runtime. The Windows exe is code-signed with a timestamp; the macOS build is signed with a Developer ID and notarised, so neither needs a detour through security settings.
- Download Plain-0.2.1-win-x64.zip (7.5 MB).
- Unpack it into any folder, for example
C:\Program Files\Plain. It contains oneplain.exe. Move the folder later and just run the exe from there. - To open
.mdfiles with a double-click: right-click any.mdfile → Open with → Choose another app → Plain → Always. Plain appears in that list after its first launch and never makes itself the default on its own.
- Download Plain_0.2.1_universal.dmg (14.7 MB). It runs on Apple Silicon and Intel.
- Open the image and drag Plain into Applications.
- To open
.mdfiles from Finder with a double-click: select any.mdfile, Get Info → Open with → Plain → Change All.
data next to plain.exe keeps all four there instead (portable mode). Your own folders get nothing but the documents you save and, if you paste an image, an assets/ folder next to the note.
What Plain won't do.
Plain is a personal project, built in the evenings for one developer and a few friends, and shaped by a spec that says no more often than yes. The list of things it leaves out on purpose matters as much as the feature list.
No plugins, no sync, no cloud. A folder on disk is the whole story. Sync it with whatever already syncs your folders.
No AI, no telemetry, no auto-update. Nothing leaves your machine. The only network request Plain ever makes is fetching an external image after you click it. New versions are a download from the releases page.
No database, no index. Search walks the folder every time. That is fine for a few thousand notes and wrong for a hundred thousand.
No localisation, no custom keymaps, no rename-with-link-updates. English interface, one set of shortcuts, links left alone when a file is renamed. These are on the later list, not the never list.
Memory. The window is WebView2 on Windows and WKWebView on macOS, so a Chromium-sized process comes with it. Around 180 MB of private memory with a file open: lighter than VS Code, heavier than Notepad.
Rust handles the file system, folder watching, atomic writes, and search. Before a release: TypeScript build, Vitest, cargo test, and a manual checklist on the release build. The source, the spec, and the checklist are on GitHub under the MIT license.