desktop app new

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.

v0.2.1 · New Windows 11 macOS 13+ Tauri 2 + Rust Signed builds MIT
01three views

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.

read rendered

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.

edit source

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.

rich markup hidden

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.

split both

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.

Plain in read view, light theme: a file tree on the left with inbox, projects and recipes folders, a rendered note titled Plain on the right with a task list and a Saving section.
read · light theme · a folder as the library
Plain in rich view, dark theme: the formatting toolbar above the editor, a note with two Mermaid code fences and a TypeScript block, markup dimmed in the left margin.
rich · dark theme · formatting toolbar above the editor
02markdown

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.

| name | size |Tables, with horizontal scroll when wide
- [x] doneTask lists
[^1]Footnotes
> [!note]Callouts: note, tip, warning, important, caution
$E = mc^2$Inline and block math with KaTeX
```mermaidMermaid diagrams, rendered when they scroll into view
```tsCode blocks highlighted by Shiki, with a language label
==marked==Highlights
[[other note]]Wikilinks, with alias and heading forms
~~gone~~Strikethrough
---  title: …YAML front matter, kept out of the render
![](assets/a.png)Images from your folder; paste or drop one and it lands in assets/
#tagTags in the text, clickable into a filtered library
<details>Inline HTML, sanitised with the GitHub schema
Every construct has a command. Bold, headings, lists, callouts, footnotes, math, tables, and wikilinks live under 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.
03a folder as the library

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.

file tree
Folders first, natural sort
Dot-folders, .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.
quick open · Ctrl+K
Files by name, commands by >
Fuzzy matching on the path, recent files on empty input, and every command in the app behind a > prefix. Finds Cyrillic file names too.
search · Ctrl+Shift+F
Full-text search across the folder
Results by file with lines of context, a case toggle, and a regex toggle. Rust walks the folder in parallel and returns in one answer. Files over 2 MB are skipped and marked as skipped.
library · Ctrl+Alt+L
Every note on one screen
Name, path, modified date, and word count for each file. Sort by modified, name, or created. Filter by #tag. Word counts are counted lazily for the rows on screen and cached for the session.
tags and backlinks
Connections without a graph
The sidebar lists the tags in your library and the notes that link to the one you are reading, through [[wikilinks]] or relative links. Both sections appear only when there is something to show.
version history
A snapshot of every save
Kept for 30 days in Plain's own data folder, never in yours. Open a snapshot read-only, restore it, or compare it with the current text line by line.
04careful saving

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.

if something goes wrong

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.

05a quiet interface

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.

files
open file · open folderCtrl O · Ctrl Alt O
new fileCtrl N
save · save asCtrl S · Ctrl Shift S
close · next documentCtrl W · Ctrl Tab
print or save as PDFCtrl P
navigation
quick openCtrl K
command paletteCtrl Shift P
find · replaceCtrl F · Ctrl H
search the folderCtrl Shift F
back · forwardAlt ← · Alt →
view
read ↔ editCtrl /
read · edit · richCtrl Alt 1 2 3
split · sidebarCtrl Shift \ · Ctrl \
library · focus modeCtrl Alt L · F8
theme · settings · shortcutsCtrl Shift D · Ctrl , · F1
formatting
bold · italic · inline codeCtrl B · Ctrl I · Ctrl E
link · quote · code blockCtrl Shift K · Ctrl Shift Q · Ctrl Shift `
heading 1–6Ctrl 1Ctrl 6
cycle list type · checkboxCtrl Shift L · Ctrl Enter
strike, highlight, math, table, footnote, wikilink…Ctrl Alt …

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.

appearance.theme system · light · dark appearance.fontSize 11–20 appearance.contentWidth 440–1400 edit.lineNumbers edit.toolbar edit.indentUnit read.codeWrap files.autosave seconds, 0 = off files.newFileEol crlf · lf library.extensions library.tags

The whole settings file. Edit it on the settings screen (Ctrl+,) and changes apply immediately, or open settings.json by hand.

06install

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.

Windows 11
A single exe, no installer
  1. Download Plain-0.2.1-win-x64.zip (7.5 MB).
  2. Unpack it into any folder, for example C:\Program Files\Plain. It contains one plain.exe. Move the folder later and just run the exe from there.
  3. To open .md files with a double-click: right-click any .md file → 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.
plain.exe notes.md
SmartScreen shows the publisher instead of "Unknown publisher". The blue dialog may still appear once while the certificate earns reputation.
macOS 13+
One universal build
  1. Download Plain_0.2.1_universal.dmg (14.7 MB). It runs on Apple Silicon and Intel.
  2. Open the image and drag Plain into Applications.
  3. To open .md files from Finder with a double-click: select any .md file, Get Info → Open with → Plain → Change All.
The macOS build comes from CI and is signed and notarised. The author develops on Windows, so the Mac side has had less time on real hardware. Bug reports are welcome on GitHub.
%APPDATA%\Plain · ~/Library/Application Support/Plain
settings.json The settings above. Easier to change on the settings screen, but plain JSON if you prefer.
drafts/ Recovery drafts of unsaved edits. Deleted only after the same text is confirmed saved.
state.json Open files, reading positions, the last folder, the window.
history/ Snapshots of what you saved, kept for 30 days.
Where your data lives. These four items are everything Plain writes for itself. On Windows, a folder called 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.
07honest about limits

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.

built with
Tauri 2 Rust React 19 TypeScript CodeMirror 6 unified · remark · rehype Shiki KaTeX Mermaid

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.