A simple per-directory todo list.
todo is a CLI for managing simple todo items stored in a Markdown file. Items are scoped to the directory where you run the command, so each project gets its own list.
brew install juanibiapina/taps/todogo install github.com/juanibiapina/todo@latestmake build # builds to dist/todo
make install # go installtodo add Buy groceries
todo add Fix the login bugSections are visual dividers that group items. They can't be checked or cleaned. They may optionally have a title, which appears inline with the divider.
todo add --section # untitled divider
todo add -s # short flag
todo add -s Planning # titled dividerUse todo edit <id> <title> to rename a section.
todo listOr just:
todoOutput:
3 [ ] Call dentist (active)
1 [ ] Buy groceries
2 [ ] Pick up milk
──────────
Active items appear at the top of the list. Indented items show extra spacing before the checkbox. In the TUI, press x to toggle an item as active. Checking an item as done automatically clears its active status.
todo edit 1 Buy eggs insteadtodo check 1
todo uncheck 1todo cleantodo tuiKeybindings:
j/kor arrows: move cursorJ/K(Shift): reorder itemsspace/enter: toggle checkedx: toggle active (active items float to top)tab: indent selected itemshift+tab: unindent selected itema: add new item (after cursor, no indent)o: add new item (after cursor, matches indent level)O(Shift): add new item (before cursor, inherits indent)tab/shift+tabin add/edit mode: adjust indent levelescin add/edit mode: save (same asenter)ctrl+cin add/edit mode: cancels: add section divider (after cursor)e: edit selected itemd: delete selected itemc: copy item text to clipboardC(Shift): clean (delete all checked items)/: filter items (fuzzy search)q/esc: quit
Items are stored in a Markdown file. The file is human-readable, version-controllable, and editable with any text editor.
## ~/project-a
- [ ] Fix the login bug
- [ ] Reproduce locally
- [ ] Check server logs
---
- [ ] Deploy to staging
## ~/project-b
- [x] Write tests
- [ ] Update docs @activeEach directory gets a ## heading section. Items use standard Markdown checkboxes (- [ ] / - [x]). Indented items use nested list syntax (2 spaces per level, up to 5 levels). Section dividers are ---. Active items are marked with @active.
Default: ~/.local/share/todo/todo.md
Override with the TODO_FILE environment variable:
export TODO_FILE=~/todo.mdThe value supports environment variable expansion ($HOME, $MY_VAR) and ~ for the home directory.
make build # Build binary to dist/todo
make test # Run all tests (unit + integration)
make unit-test # Run Go unit tests
make integration-test # Run bats integration tests