# write
`write` is an opinionated, writing-centric editor whose entire purpose is to **silence the
writer's inner editor**. Text fades from the screen shortly after it is typed, so there is nothing
to look back at, nothing to second-guess, and nothing to fiddle with. You simply write.
Output is plain **Markdown**, appended to a daily file. There is no cursor movement and no free
editing; deletion is bounded to recent corrections only — `Backspace` may walk back at most the last
two words to fix a fresh typo. Once text is two-plus words in the past it is permanent in the file
and soon invisible on screen. When you are done, open the resulting `.md` in your real editor
(Neovim, etc.) to revise.
## How it works
- **Fullscreen, borderless, distraction-free.** The app takes over the screen with a black canvas
and a single centered column of text. No chrome, no menus, no mouse.
- **The fading view.** Each glyph stays fully visible for ~30 seconds, then fades out over ~1 second
and is gone for good. The active line holds near the vertical center while older lines scroll off
the top as you write.
- **Running word count.** A small, dim word count sits in the upper-right corner, showing the day's
total (seeded from what is already in today's file, so it survives relaunches). It appears once
you have written at least two words and only ever grows.
- **Append-only Markdown.** Everything you type is appended verbatim to today's session file at
`~/Documents/write/YYYY-MM-DD.md` (falling back to your home directory if there is no Documents
folder). The file is flushed and `fsync`'d roughly every 30 seconds and again on a clean exit, so
your words are durable.
- **One writer per day.** Each day shares a single file, guarded by an advisory lock. If a second
`write` is already running for today, the new instance exits quietly instead of fighting over the
file.
## Keys
| any character | appended to the file and shown on screen |
| `Enter` | inserts a paragraph break (`\n\n`); a second consecutive `Enter` clears the screen |
| `Backspace` | deletes a single character, truncating the file — but only within the last two words and never below the file's length when the session opened; older text is permanent and out of reach |
| `` `\` `` / `` `Esc` `` | opens the menu (day word count); `Esc` resumes, `W` toggles windowed/fullscreen, `D` toggles a darker (dimmer) text mode for the session, `` `\` `` inserts a literal backslash, `Q` quits |
Arrows, `Delete`, `Home`/`End`, `PageUp`/`PageDown`, and `Cmd`/`Ctrl` combinations (paste, undo, …)
are intentionally ignored. Beyond fixing a fresh typo with `Backspace`, there is no way to revise
text from inside `write` — older text stays put.
## Install & run
Requires a recent Rust toolchain (edition 2024).
The easiest way to install is from crates.io:
```bash
cargo install write
```
Or build and run from a checkout of this repository:
```bash
cargo run --release
```
Running `write` with no arguments launches the fading fullscreen TUI for today's session.
Two subcommands operate on today's file without launching the TUI (and without taking the session
lock):
```bash
write edit # open today's session file in $VISUAL/$EDITOR/vi
write show # print today's session file to stdout verbatim (nothing if it doesn't exist yet)
```
Your writing lands in `~/Documents/write/`, one Markdown file per day.
## Platform support
`write` is built on [`egui`/`eframe`](https://github.com/emilk/egui) and is portable in principle,
but it is developed and tested on **macOS** first. Other platforms track upstream `egui` maturity.