A tiny red typewriter that sits on top of your other windows and holds your to-do list.
You type a plan, it prints onto the paper. It shows you one task at a time so you don't have to look at the whole list. Tick it off, it makes a satisfying noise, sparkles, and the next task rolls up. Finish everything and you get confetti.
That's the whole app. No accounts, no cloud, no notifications. Your plans are just text files on your own computer.
Long to-do lists are stressful to look at. This shows you the next thing and hides the rest until you ask for it. If you want the full list, there's a button for that.
You need Node.js installed. If you don't have it, get the "LTS" version from that site and click through the installer.
Then open a terminal in this folder and run these two lines, one at a time:
npm installnpm startThe first one downloads what the app needs (takes a minute or two). The second one starts the typewriter. After the first time, you only ever need npm start.
Making a plan. Just start typing. The first thing you type is the plan's name. Press Enter and type your first task. Press Enter again for the next one. When you're done, press Ctrl and Enter together and it prints.
You can click the round keys on the typewriter instead of using your keyboard. They work.
There's no save button, and you don't need one. The moment it prints, it's written to a file on your computer. Every time you tick something off, that's written too, straight away. You can close the app whenever you like and it'll come back exactly where you left it.
Adding to a plan you already made. Just start typing again. It'll show the new task at the bottom of the paper. Press Enter to add it, Esc to change your mind. Works whether you typed the plan or imported it from a file.
Where did my other tasks go? When you print a new plan you see the whole list. Once you're working, hit ● and it collapses down to one task at a time so you're not staring at everything at once. Nothing is gone, it's just hidden. ≡ brings the full list back.
Already have a list somewhere? Drag a .md file onto the typewriter, or copy your list and paste it with Ctrl+V. It understands lists that look like this:
# Saturday
## Errands
- [ ] post office
- [x] buy milk
## Studio
- [ ] finish the editTicking things off. Click the checkbox. That's it.
The buttons along the middle:
| Button | What it does |
|---|---|
≡ |
Show the whole list |
● |
Collapse down to one task at a time |
♪ |
Sound on |
✕ |
Sound off |
Other things you can do:
- Move the window: drag the red body or the black top bar
- Give up on a plan: press
Ctrl+C. It'll ask whether to keep it or delete it - Cancel while typing: press
Esc
Everything lives in one folder on your computer as plain text. By default that's a Typewriter folder inside your Documents, and you can point it anywhere you like (see below).
Open any of those files in any text editor and you'll see your list, with the time you ticked each thing off written next to it:
- [x] buy milk (done 2026-07-29 14:03)Nothing is ever sent anywhere. If you drag a file in from somewhere else, the app copies it and leaves your original completely alone.
Edit config.json and change recordsDir to wherever you want. You'll find it at:
- Windows:
%APPDATA%\typewriter\config.json - Mac:
~/Library/Application Support/typewriter/config.json - Linux:
~/.config/typewriter/config.json
If that file doesn't exist yet, the app uses a Typewriter folder inside your Documents.
What's under the hood
Electron, with context isolation on and Node integration off in the renderer. All filesystem work happens in the main process behind a small IPC surface (preload.js).
Each plan gets a {plan-name}.progress.json sidecar holding flattened zero-based task indices with { done, at }. The sidecar is written before the markdown and wins on reopen, so a crash mid-write can't lose your ticks. The markdown is also rewritten in place so the file stays readable on its own. Anything in the file that isn't a heading or a checkbox is preserved untouched.
Deletes are hard-gated to inside the records folder. The app will refuse to unlink anything outside it.
npm test runs the parser and markdown-rewrite tests under plain Node, no Electron needed.
The window is sized to the typewriter graphic itself via a ResizeObserver on the stage, clamped to the display work area, and grown upward from its bottom edge so the machine stays put. A transparent always-on-top window larger than its visible content is an invisible click trap over every other app, and a fixed height taller than the work area pushes the bottom-anchored machine under the taskbar where you can't reach its buttons or drag regions.
