A tiny Windows 11-style notepad, written in Rust against the raw Win32 API —
no UI framework, no telemetry, one dependency, and a single ~330 KB .exe
that starts instantly.
This exists because of Dave Plummer — the retired Microsoft engineer behind a good deal of classic Windows, and host of Dave's Garage — and specifically TinyRetroPad, the project from his PlummersSoftwareLLC that fits a working, menu-complete Notepad-style Windows editor into roughly 2.5 KB of hand-written x86 assembly. He walks through it here:
TinyRetroPad chases the absolute floor on bytes. tinypad asks the same question
— how little does a real Notepad actually need? — in Rust instead: still no
framework, no runtime, no dependencies beyond raw extern declarations, but
wearing the full Windows 11 look. At ~330 KB it is enormous next to 2.5 KB of
assembly, and rounding error next to a modern Electron editor. Both are pushing
against the same thing.
Grab the latest release:
| File | What it is |
|---|---|
tinypad-setup-<version>.exe |
Installer — per-user (no admin prompt), Start Menu entry, Open with for .txt, clean uninstaller |
tinypad.exe |
Portable — one file, no install, no registry writes |
64-bit Windows 10 or 11. The Mica backdrop and rounded corners are Windows 11 extras; on Windows 10 it falls back to a solid caption and looks fine.
The binaries are unsigned, so SmartScreen shows an "unknown publisher" warning the first time. More info → Run anyway.
Open files by dragging them onto the window, passing them on the command line
(tinypad.exe notes.txt), or with Ctrl+O. If you installed it, tinypad also
shows up under Open with for .txt files.
Tabs live in the title bar, the way Windows 11 Notepad does it. Ctrl+N or the
+ button opens one, Ctrl+W closes one, and Ctrl+Tab cycles. A tab with
unsaved changes shows a dot instead of its close button — todo.txt in the
screenshot above. Closing a modified tab asks before discarding anything.
Ctrl+F opens the search panel, Ctrl+H opens it with a replace row. Matches
highlight as you type; Enter and Shift+Enter (or F3 / Shift+F3) step
forward and back, and Esc closes the panel. The Aa and loop buttons toggle
match-case and wrap-around.
Three menus — File, Edit, View — matching the system theme, with every command
showing its shortcut. Alt+F, Alt+E, and Alt+V open them from the keyboard.
| Keys | Action |
|---|---|
Ctrl+N / Ctrl+T |
New tab |
Ctrl+W |
Close tab |
Ctrl+Tab / Ctrl+Shift+Tab |
Next / previous tab |
Ctrl+O / Ctrl+S / Ctrl+Shift+S |
Open / Save / Save As |
Ctrl+F / Ctrl+H |
Find / Replace |
F3 / Shift+F3 |
Find next / previous |
Ctrl+Z / Ctrl+X / Ctrl+C / Ctrl+V |
Undo / Cut / Copy / Paste |
Ctrl+A |
Select all |
Ctrl+Plus / Ctrl+Minus / Ctrl+0 |
Zoom in / out / reset |
Ctrl+scroll |
Zoom |
Alt+F / Alt+E / Alt+V |
File / Edit / View menu |
tinypad follows the Windows app theme and switches live — change it in Settings → Personalization → Colors and the window, menus, scrollbars, and title bar all update without a restart.
Line and column, zoom level, line-ending style, and encoding — all of the document state that a text editor should not hide from you.
- Tabs in the title bar, with modified-dots, close buttons, and working Snap Layouts on the maximize button
- Dark and light, following the system theme, switching live
- Encoding is preserved, not mangled: UTF-8 (± BOM), UTF-16 LE/BE, and ANSI are detected on open and written back in the same encoding, with CRLF / LF / CR line endings kept intact
- Find & Replace with match case, wrap around, and incremental highlight
- Zoom 10–500%, word wrap toggle, drag & drop
- Remembers window placement, wrap, and zoom in
%APPDATA%\tinypad\settings.ini
The build cross-compiles from Linux (or WSL) to Windows — which is also exactly what CI does, so the binaries you download are built the same way.
rustup target add x86_64-pc-windows-gnu
sudo apt install gcc-mingw-w64-x86-64 nsis # nsis only needed for the installercargo wb # alias for: cargo build --release --target x86_64-pc-windows-gnu
# -> target/x86_64-pc-windows-gnu/release/tinypad.exe
cargo test # encoding, search, and settings logic — runs natively on LinuxInstaller:
cd installer && makensis -DVERSION=0.1.0 tinypad.nsiThe app icon is generated by assets/gen_icon.py (pure Python stdlib, no
ImageMagick) and committed as assets/app.ico.
Push a tag and the release workflow builds the exe and installer, stamps the version into both, and publishes them:
git tag v0.1.0 && git push origin v0.1.0Roughly 2,900 lines of Rust over windows-sys,
which is just extern declarations — every pixel of chrome is drawn by this
codebase.
window.rs |
Message loop and the custom frame: WM_NCCALCSIZE to reclaim the title bar, WM_NCHITTEST for drag and Snap Layouts, DPI changes, theme changes |
chrome.rs |
Title-bar painting — tabs and caption buttons, composited through a buffered-paint DIB so the Mica backdrop shows through GDI drawing |
editor.rs |
One classic EDIT control per tab, which buys per-tab undo, caret, and scroll state for free |
tabs.rs / fileio.rs |
Tab model, file dialogs, save prompts |
find.rs / search.rs |
Find panel, and the pure UTF-16 search core behind it |
encoding.rs |
BOM sniffing, UTF-8/16 codecs, line-ending detection — all pure and unit-tested |
theme.rs |
Palettes, DWM attributes, and system dark-mode detection |
Two deliberate limitations, both matching classic Notepad: undo is single-level,
and toggling word wrap clears the undo stack (the EDIT control has to be
recreated to change wrapping).
MIT — see LICENSE.



