tuxedo: a keyboard-driven terminal UI that keeps todo.txt honest
A fast, keyboard-driven terminal UI for todo.txt.
At a glance
- What is it?
- tuxedo is a single static Rust binary that reads and writes the standard todo.txt format: Vim-style bindings, a command palette, atomic temp-then-rename writes, external-edit detection, natural-language task entry without an AI service, and phone capture through a LAN QR code. No daemon, no database, no cloud.
- Who is it for?
- tuxedo fits todo.txt users who live in a terminal and want Vim-grade ergonomics over a file that stays plain text, with atomic writes that survive Dropbox and a sync story that never requires trusting a daemon. It does not fit anyone wanting rich metadata beyond what a todo.txt line holds, or a mobile-first workflow, since phone capture is an inbox convenience rather than a client.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 4 days ago.
- What is it written in?
- Mainly Rust, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 17, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
One file in, one file out
tuxedo's entire premise fits in a sentence: a fast, keyboard-driven terminal UI for todo.txt. It reads and writes the standard format, so every line stays plain text that any other editor, script or sync tool can touch, and the closing line of the feature list states the architecture plainly: no daemon, no database, no cloud, one file in, one file out.
The implementation is a single static binary, badged Rust 2024 edition, with continuous integration and an MIT licence. The release scheme reads like a calendar: v2026.8.1 on 2026-08-30, v2026.7.1 in July, v2026.6.3 in June. The last push was on 2026-09-14, and the repository tree carries a Nix flake and a mise configuration alongside the usual Cargo files, with the maintainer's own done.txt and an inbox lock file sitting in the tree as evidence of dogfooding.
For anyone invested in the todo.txt ecosystem, the compatibility question is the whole evaluation, and tuxedo answers it by refusing to extend the format: pure todo.txt, with completed tasks archived to a sibling done.txt file, atomically, by pressing A.
Two interfaces sharing one binary
Running the bare tuxedo command opens the interactive UI; running tuxedo with a command gives a todo.txt-cli-compatible command line covering add, ls, do, pri, archive and the rest. One binary, two interfaces, the arrangement script writers actually want, because a shell function can drive the same file the TUI edits without any wrapper drift.
The CLI is scriptable in the ways that matter: JSON output for structured consumption, and the classic environment variables for file locations, so existing todo.txt automation keeps working unchanged.
The pairing also disciplines the design. Anything the TUI can do that the file format cannot express would break the CLI contract, so the feature list stays within what a line of text can hold, which is exactly the constraint that keeps todo.txt tools composable a decade and a half into the format's life.
The keyboard contract
The bindings are Vim-flavoured and documented without apology: j and k move, dd deletes, gg and G jump, u undoes with fifty levels behind it. Chord prompts for gg, dd, fp and fc run in a six-hundred-millisecond window. The command palette opens with a colon or Ctrl-P and fuzzy-matches every action, using the same matcher as slash search, ranked so that start-of-label hits beat word-boundary hits beat mid-word hits, which is a small ranking policy stated out loud rather than left to feel.
Filtering cycles by project and context through fp and fc, sorting covers priority, due date and file order, and visual mode handles bulk completion and deletion. Saved searches get their own lifecycle: name the active slash-search with fs, recall the set by cycling with ff, and the saved filters live as plain filter-dot-name lines in the configuration, hand-editable like everything else in the file-and-config philosophy.
The help overlay on the question mark key carries the full keybinding reference, and the screens table in the README shows each of these states, including the filter sidebar with its saved-searches heading and live match counts.
Natural-language add, without an AI service
The most interesting feature is the one that sounds like an AI feature and is not. Type prose into the add prompt, for instance pay rent monthly on the first, show 3 days before due, project home, and tuxedo rewrites it into canonical todo.txt for you to review before saving. The README is explicit about the implementation posture: local, offline, no AI service.
That distinction is the feature. Deterministic parsing of a constrained natural-language surface, with a review step before the write, gives most of the convenience of assistant-style capture with none of the network dependency, latency variance, or privacy question. It is also auditable in a way a model call is not: the same input either maps to the same task line or the parser declines.
Combined with the sibling inbox file, capture composes: anything that can append a line, a shell command, an iOS shortcut, a cron job, becomes a capture source, and the inbox is folded in from inside the TUI rather than imported by hand.
Sync safety, and capture from the phone
Every change goes through write-temp-then-rename, the atomic pattern that makes concurrent access boring instead of catastrophic. If another process, an editor, Dropbox, a script, modifies the file, tuxedo reloads on the next keypress, or within roughly 250 milliseconds while idle, and flashes a notice rather than silently overwriting. For a tool whose storage is explicitly a synced plain file, external-edit detection is not a nicety; it is the correctness core, and it is listed as a headline rather than buried in a changelog.
Phone capture completes the loop: press s and tuxedo shows a QR code pointing at a tiny progressive web app served on the machine's local network. Type tasks from the phone and they appear in the list, landing first in the sibling inbox.txt so the TUI stays the single place where entries get reviewed into the real file. The repository's own inbox lock file suggests the author routes real captures through this path daily.
Nothing in this design phones home, and nothing requires an account, which is the whole point of choosing plain text in the first place; tuxedo is one of the few TUIs that treats that choice as a security architecture rather than a compatibility checkbox.
Themes, installation, and the alternatives
Installation on macOS is one command:
brew install tuxedoThe theme system rewards tinkering. Five built-in themes cycle on T, including a Terminal theme that defers to the terminal emulator's own palette, with three display densities on D; choices persist and hot-reload when the config file is edited externally. Custom themes are any TOML file dropped into the themes directory under the XDG config path, joining the picker in sorted filename order, and the README shows the two-line install of a ready-made theme:
mkdir -p ~/.config/tuxedo/themes
curl -o ~/.config/tuxedo/themes/gruvbox-dark-soft.toml \
https://raw.githubusercontent.com/webstonehq/tuxedo/main/docs/themes/gruvbox-dark-soft.tomlThe theme format is strict in a likeable way: every field is required, and a file missing one, carrying an unparseable colour, or colliding on a name is skipped with a startup warning rather than half-applying. Colours accept hex values or reset and transparent keywords that inherit the terminal's background, so opacity and blur survive theming.
The alternatives frame the trade. todo.txt-cli is the reference shell implementation: minimal, scriptable everywhere, and no interactive interface at all. topydo brings a Python TUI and CLI with richer querying over the same format. Taskwarrior with a TUI front end offers vastly more structure by leaving todo.txt entirely. tuxedo's position is the keyboard-first middle: full TUI ergonomics, zero format drift, one binary, and its natural-language and phone-capture features are the differentiators worth testing first.
Editorial conclusion
tuxedo fits todo.txt users who live in a terminal and want Vim-grade ergonomics over a file that stays plain text, with atomic writes that survive Dropbox and a sync story that never requires trusting a daemon. It does not fit anyone wanting rich metadata beyond what a todo.txt line holds, or a mobile-first workflow, since phone capture is an inbox convenience rather than a client. Verify first: that your todo.txt conventions survive the natural-language add rewrite as you expect, that external-edit reload behaves with your specific sync tool, and whether the brew package tracks the release cadence you want. The licence is MIT, and the last push was on 2026-09-14.
Frequently asked questions
Does tuxedo change the todo.txt format?
No. It reads and writes the standard todo.txt format, so every line remains plain text editable by any other tool, and completed tasks are archived to a sibling done.txt file using atomic writes.
Can I add tasks from my phone with tuxedo?
Yes. Pressing s shows a QR code pointing at a small web app served on the machine's local network; typed tasks land in a sibling inbox.txt first, and anything that can append a line, such as a shell command, iOS Shortcut or cron job, also works as a capture source.
What happens if another program edits the file while tuxedo is open?
All writes go through a temp-file-then-rename pattern, and if an external process modifies the file, tuxedo reloads it on the next keypress, or within roughly 250 milliseconds while idle, flashing a notice instead of overwriting the change.
Community notes