A minimalist, interactive command-line task manager built with Python.
- Interactive prompts — arrow-key navigable menus when you omit an argument
- Rich output — clean, formatted tables via the
richlibrary - Filtering & sorting — slice your task list by status, category, priority, or date
- Import / export — move tasks between machines with JSON
- Reports — generate Markdown or HTML reports with one command
- Scripting-friendly — machine-readable JSON output via a global
--jsonflag - Local first — SQLite-backed, zero-configuration, works offline
# uv (recommended)
uv tool install odot
# pipx
pipx install odot
# pip
pip install odotodot add "Buy groceries" -p medium -c home # add a task (database created automatically)
odot list # view all tasks
odot list --todo --sort priority # open tasks, sorted by priorityThe database defaults to
~/.odot/db.sqlite. Override with theODOT_DB_PATHenvironment variable.
odot add "Submit quarterly report" -p high -c work # add
odot show # interactive detail view
odot done 1 # mark task 1 as done
odot undo 1 # re-open task 1
odot update # interactive update
odot update 1 --content "Revised name" --done # explicit update
odot rm # interactive delete
odot rm 1 --force # skip confirmationodot search "groceries"
odot list --done # completed tasks only
odot list -c work --todo # open work tasks
odot list --sort priority --reverse # descending priority
odot count --todo -c work # count matches without a tableAdd --json to emit machine-readable JSON instead of a table, ready to pipe
into tools like jq:
odot list --json | jq '.[] | .content' # list open task titles
odot count --json # {"total": N, "pending": N, "done": N}
--jsonapplies tolist,show,add,update,done,undo,search,count,rm,clean,purge, andimport. It is ignored byexportandreport, which already produce their own artifacts.
odot export backup.json --todo # export open tasks
odot import backup.json # append from file
odot import backup.json --clear # replace all tasks
odot report tasks.md --sort priority # Markdown report
odot report work.html --todo -c work # filtered HTML reportodot clean # remove completed tasks (prompts for confirmation)
odot clean --force # skip confirmation
odot purge # remove all tasks (prompts for confirmation)
odot purge --force # skip confirmationgit clone https://github.com/jkomalley/odot.git && cd odot
uv syncjust test # run pytest, no coverage gate
just test-cov # enforce 100% coverage
just check # ruff + ty + testsContributions are welcome. See CONTRIBUTING.md for development setup, project layout, and the conventions this repo follows.
Released under the MIT License.
