A distraction-free terminal text editor. Black screen, a centered page, and one line at the foot that tells you where you are.
A text editor for writing prose, not code. There are no toolbars, no menus, no line numbers and no frame around the page — just text, centered, never wider than 82 columns because lines longer than that are hard to track back to.
Everything the editor knows about itself lives in a single line at the bottom: the version, the document, and the way into the help. Every action is a keyboard shortcut; you learn them once and they disappear.
It is one static binary with no cgo and no display server, so it runs anywhere you can open a terminal — including a headless writerdeck.
Packages and binaries for Linux, macOS and Windows are on the
releases page, for both x86-64
and ARM. Swap amd64 for arm64 below on a Raspberry Pi or an Apple Silicon
Mac.
Debian, Ubuntu:
sudo dpkg -i justwrite_*_linux_amd64.debFedora, RHEL, openSUSE:
sudo rpm -i justwrite_*_linux_amd64.rpmAnywhere else, unpack the archive and put the binary on your $PATH:
tar xzf justwrite_*_linux_amd64.tar.gz
sudo install justwrite /usr/local/bin/With Go, from source:
go install github.com/MawCeron/justwrite@latestOr from a clone:
git clone https://github.com/MawCeron/justwrite
cd justwrite
go build .To build for a writing device you are not on, such as an ARM writerdeck:
GOOS=linux GOARCH=arm64 go build .justwrite # a new document
justwrite draft.md # open a file, or start one under that nameNaming a file that does not exist yet is how you start one: the name sticks, and
Ctrl+S saves straight to it.
| Shortcut | Action |
|---|---|
Ctrl+S |
Save |
Ctrl+O |
Open file |
Ctrl+N |
New document |
Ctrl+Q |
Quit |
Ctrl+Z / Ctrl+Y |
Undo / redo |
Ctrl+A |
Select all |
Ctrl+C / Ctrl+X / Ctrl+V |
Copy / cut / paste |
Ctrl+T |
Stats — words, characters, pages, read time |
F1 |
Help |
? |
About, from inside the help. Anywhere else it types a ? |
Ctrl+←/→ |
Jump a word left or right |
Shift+arrows |
Extend the selection |
Page Up/Down |
Scroll by page |
Tab |
Insert 4 spaces |
Esc |
Close panel / cancel |
Undo works in bursts: one Ctrl+Z takes back a word, not a letter.
F1 puts the whole list on screen, and ? from there opens About:
Ctrl+T counts what you have written so far:
| Shortcut | Action |
|---|---|
| type | Filter the listing |
Ctrl+H |
Show hidden and binary files |
Tab |
Switch between the listing and the filename field |
Enter |
Enter a directory, or open the file |
Esc |
Clear the filter, then close |
Binary files and dotfiles stay out of the listing by default. Stepping up to the parent leaves the cursor on the directory you came out of.
Anything that would throw away unsaved work — quitting, starting a new document, opening another file, saving over an existing one — asks first.
| Shows | Means |
|---|---|
| (nothing) | A new document, untouched |
* |
A new document with changes. There is no name yet, so it does not invent one |
draft.md |
Saved, and matching what is on disk |
draft.md* |
Edited since the last save |
saved |
Written to disk just now |
| a message in red | The save failed, and why. It stays until one succeeds |
Saving is atomic. Writes go to a temporary file beside the document and are renamed into place, so an interrupted or failed save leaves the previous draft intact rather than a half-written file.
The clipboard travels. Copying works over SSH and inside tmux, with no
display server. For tmux, add set -g set-clipboard on. Text pasted in from
elsewhere lands as a single undo step.
Colours are optional. NO_COLOR is honoured, and the layout carries the
meaning on its own.
justwrite/
├── internal/
│ ├── editor/ the document: buffer, selection, undo, wrapping, files
│ └── ui/ Bubble Tea model, status bar, overlays, file dialogs
├── LICENSE
├── README.md
├── go.mod
├── go.sum
└── main.go
internal/editor does not import Bubble Tea; it is the document on its own,
and most of the tests live there.
Issues and pull requests are welcome.
go test ./... # the whole suite
go vet ./...
go build .The screens above are generated, not drawn: ./assets/screens.sh renders the
editor's real View() output to SVG, so they cannot quietly fall out of date
with the interface. Rerun it after any change to the UI.
MIT © 2026 Mauricio Cerón