tuxedo
A fast, keyboard-driven terminal UI for todo.txt. Vim-style bindings, atomic writes, instant external-edit detection, and five hand-tuned themes — all in a single static binary.
brew install tuxedo

For a more in-depth walkthrough, please watch this video by @IogaMaster.
Highlights
- Pure todo.txt. Reads and writes the standard format — every line is plain text you can edit with anything else.
- TUI and CLI in one binary. Run
tuxedofor the interactive UI, ortuxedofor a todo.txt-cli-compatible command line (add,ls,do,pri,archive, …) — scriptable, with--jsonoutput and$TODO_DIR/$TODO_FILE/$DONE_FILEsupport. - Natural-language add. Type prose into the add prompt —
Pay rent monthly on the first, show 3 days before due, project home— and tuxedo rewrites it to canonical todo.txt for you to review and save. Local, offline, no AI service. - Phone capture. Press
sfor a QR pointing at a tiny PWA on your machine's LAN — type tasks from your phone and they appear in the list. Captures land in a siblinginbox.txtfirst, so any tool that can append a line (shell, iOS Shortcuts, cron) is also a capture source. - Vim keys, no surprises.
j/kto move,ddto delete,gg/Gto jump,uto undo (50 levels), chord prompts (gg,dd,fp,fc) with a 600 ms window. - Command palette.
:orCtrl-Popens a fuzzy palette over every action — type a few letters, hit Enter. Same matcher as/search, ranked so start-of-label hits beat word-boundary hits beat mid-word hits. - Atomic, sync-friendly writes. Every change goes through write-temp-then-rename. If another process — Dropbox, an editor, a script — modifies the file, tuxedo reloads on the next keypress (or within ~250 ms while idle) and flashes a notice.
- Sibling-file archive.
Amoves completed tasks todone.txtnext to your file, atomically. - Filter, sort, multi-select. Cycle by
+projector@context, sort by priority / due / file order, and bulk-complete or bulk-delete in visual mode. - Saved searches. Name the active
/-search withfs, then recall it any time by cycling saved filters withff. Stored as plainfilter.lines in the config — hand-editable like everything else. - Five themes, three densities. Cycle with
TandD. Choices persist across runs and hot-reload when you editconfig.tomlexternally. - No daemon, no database, no cloud. One file in, one file out.
Screens
| Empty state • cell-bowtie mark and quick-start when the file has no tasks | |
| List • list of todos, optionally grouped | |
| Archive • completed tasks grouped by completion date | |
Filter sidebar active • fp cycles projects with j/k, fc cycles contexts; saved searches list under a SAVED heading with live match counts |
|
Command palette • : or Ctrl-P opens a fuzzy palette over every action |
|
Help • ? opens the full keybindings overlay |
How to generate the screenshots and demo
The screenshots in the table above are checked-in SVGs. Regenerate them with:
mise run screenshots
The hero GIF at the top is recorded with vhs from docs/demo.tape. Regenerate it with:
mise run demo
Themes
T opens a picker over five built-in themes, including Terminal, which respects your terminal palette.
| Muted Slate (default) | Dawn |
|---|---|
| Nord | Matrix |
Custom themes
Beyond the built-ins, tuxedo loads any *.toml file you drop in
${XDG_CONFIG_HOME:-$HOME/.config}/tuxedo/themes/. Each one joins the T
picker in sorted filename order. Ready-made themes live in
docs/themes/ — copy one in and press T:
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.toml
Theme file format and field reference
A theme file is one key = value per line. name is the label shown in the
picker; every other field is a color value. All fields are required: a file
missing one, carrying an unparseable color, or whose name collides with
another theme is skipped with a warning at startup.
Color values accept two forms:
#rrggbb— a solid hex color (case-insensitive).resetortransparent— inherits the terminal emulator's own background color. Useful forbg,panel, andstatusbarwhen you want your terminal's opacity, blur, or wallpaper to show through while keeping a custom text palette. Both keywords are case-insensitive and behave identically (same effect as the built-in Terminal theme).
| Field | Colors |
|---|---|
name |
label shown in the T picker (the only non-color field) |
bg |
window background |
panel |
filter and detail panel background |
border |
panel and modal borders |
fg |
primary text |
dim |
secondary / muted text |
accent |
logo, headings, hints, and selection markers |
cursor |
current row, and the highlighted row in the T picker |
selection |
set to the same value as selected |
statusbar |
status bar background |
status_fg |
status bar text |
mode_fg / mode_bg |
mode chip text / background |
pri_a pri_b pri_c pri_d |
priorities A through D |
pri_other |
priorities E through Z |
project |
+project tags |
context |
@context tags |
due |
due: date |
overdue |
past-due date |
today |
date due today |
done |
completed tasks |
selected |
selected-row background (visual mode) and the active filter |
matched |
search-match highlight |
Install
Homebrew (macOS, Linux)
brew install tuxedo
Prebuilt binaries
Download the archive for your platform from the latest release and put tuxedo on your PATH.
Targets: x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu, x86_64-apple-darwin, aarch64-apple-darwin, x86_64-pc-windows-msvc. Each archive ships with a .sha256 checksum.
From source
cargo install --git https://github.com/webstonehq/tuxedo
Or clone and build:
git clone https://github.com/webstonehq/tuxedo
cd tuxedo
cargo build --release
./target/release/tuxedo [FILE]
Requires the Rust 2024 edition (recent stable toolchain).
Usage
tuxedo is two things in one binary: an interactive TUI, and a one-shot
command line. With no subcommand it launches the TUI; with a recognized
subcommand it runs the command line and exits.
tuxedo [FILE] # launch the TUI on FILE (created if missing)
tuxedo # TUI on the default file (see resolution below)
tuxedo --sample # open the bundled sample file in the temp dir
tuxedo <command> # run a one-shot CLI command — see "Command-line interface"
tuxedo update # print upgrade instructions for your install
tuxedo --help
tuxedo --version
When a newer release is available, the status bar shows ↑ (tuxedo update) next to the version. The check runs in the background, is cached at
$XDG_CACHE_HOME/tuxedo/latest_version.json for 24 h, and fails silently
when offline. Set TUXEDO_NO_UPDATE_CHECK=1 to disable.
Which file tuxedo opens
Both the TUI and the CLI resolve the todo file the same way, in order:
- An explicit
FILEargument (TUI only). $TODO_FILE, if set.$TODO_DIR/todo.txt, if$TODO_DIRis set../todo.txtin the current directory, if it exists.- Otherwise the TUI shows a first-run prompt — press
cto create./todo.txthere, or `s