Minimal TUI todo app
Project description
td
A fast, keyboard-driven TUI todo manager for the terminal. Multi-list, encrypted, scriptable.
Install
uv tool install td-task # recommended
Or with pip:
pip install td-task
Run directly without installing:
uvx td-task
For the --dev file watcher, install the optional extra:
uv tool install 'td-task[dev-mode]'
Usage
td [command] [--list <name>]
| Command | Description |
|---|---|
td |
Open the TUI (defaults to first list) |
td add <text> |
Add a task to a list |
td list |
Print active tasks to stdout |
td archive |
Open the archive screen |
td export [file] |
Export database to JSON (stdout if no file) |
td import <file> |
Merge a JSON backup into the database |
td update |
Upgrade to the latest version |
td --version |
Print the installed version |
td --help |
Print the help menu |
The -l / --list flag scopes a command to a specific list. It is required for add, list, and archive.
td -l work # open TUI locked to the "work" list
td add "fix the flaky test" -l work
td list --list work
td export backup.json
TUI Keybindings
Tasks
| Key | Action |
|---|---|
a |
Add new task |
e / Enter |
Edit selected task |
d |
Delete selected task |
Space |
Toggle done / active |
s |
Star task (pin to top, bold yellow) |
c |
Archive all completed tasks |
y |
Copy task list to clipboard |
↑ / k ↓ / j |
Navigate tasks |
Ctrl+↑ / Ctrl+↓ |
Reorder task position |
Alt+↑ / Alt+↓ |
Duplicate task above / below |
← / → |
Switch to previous / next list |
l / Tab |
Open Lists Menu |
Ctrl+P |
Fuzzy-search lists |
, |
Open archive screen |
/ |
Open settings |
? |
Help screen |
q / Esc |
Quit |
Lists Menu
| Key | Action |
|---|---|
Enter |
Switch to highlighted list |
a |
Create new list |
e |
Rename list |
d |
Delete list (with all its tasks) |
Shift+↑ / Shift+↓ |
Reorder list position |
↑ / k ↓ / j |
Navigate lists |
q / Esc |
Quit |
Archive
| Key | Action |
|---|---|
↑ / k ↓ / j |
Navigate |
r |
Restore task to active list |
d |
Delete task permanently |
c |
Clear all archived tasks |
q / Esc |
Return to tasks |
Settings
| Key | Action |
|---|---|
e / Enter |
Edit selected setting |
↑ / ↓ |
Adjust numeric values (when editing) |
↑ / k ↓ / j |
Navigate settings |
q / Esc |
Return |
Settings you can change: max tasks per list (3–50), max starred tasks, database encryption (AES), and backup export / import.
Agent-friendly
td works well as a task layer for AI agents and shell scripts. The CLI commands are designed for scripting:
# add tasks from a script or agent
td add "review PR #42" -l work
td add "update dependencies" -l work
# read tasks as plain text
td list -l work
# dump the full database as JSON
td export | jq '.tasks[] | select(.status == "active")'
# point at a separate database — useful for testing or sandboxing
TD_DB_PATH=/tmp/agent.db td add "isolated task" -l inbox
The --help output is written to be LLM-readable, so agents can self-orient by running td --help.
Architecture
td is a single Python package with no framework dependencies:
| File | Role |
|---|---|
__main__.py |
CLI entry point, argument parsing, non-TUI commands |
tui.py |
Raw terminal render loop, all keybinding logic |
db.py |
SQLite layer — all reads and writes go through here |
terminal.py |
Low-level raw mode I/O and key decoding |
The TUI uses raw ANSI escape sequences directly rather than Curses or Textual. This keeps startup instant and the binary small.
Runtime dependencies: rich (terminal rendering), cryptography (AES encryption). watchdog is optional ([dev-mode] extra).
Works on macOS, Linux, and Windows. On Windows, use a terminal with ANSI support such as Windows Terminal for the best experience.
Data model
Two tables in a SQLite file:
lists — name (PK), position, max_tasks
tasks — id, text, status (active / done / archived), position, created_at, done_at, archived_at, starred, list_name (FK → lists, CASCADE DELETE)
Tasks keep their timestamps through the full lifecycle: created → done → archived. Deleting a list permanently removes all its tasks via the cascade.
Portability
Everything lives in ~/.td.db — a single SQLite file you can copy, back up, or move between machines.
# override the database path
export TD_DB_PATH=~/Dropbox/td.db
# back up
td export > backup.json
# restore on another machine
td import backup.json
You can encrypt the database with a password from the settings screen (/). If you forget the password, there is no recovery — your tasks are gone.
Show some love
Ethereum: 0x88a0e1b80B92F0cFaa89a936b827Ce291cFb0028
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file td_task-0.1.5.tar.gz.
File metadata
- Download URL: td_task-0.1.5.tar.gz
- Upload date:
- Size: 142.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
222ca004f31efc4a73907dbf231b75e9d67f8764f9682892c181d6334161085d
|
|
| MD5 |
7502dff0bc85a8de2d3b917ae69a3149
|
|
| BLAKE2b-256 |
945b0e78928c58f9e634f12f27209fcb29f8bea6a8630ebd2d3ff33febc6bcc7
|
File details
Details for the file td_task-0.1.5-py3-none-any.whl.
File metadata
- Download URL: td_task-0.1.5-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
51b3a7198d108131d0e7d25c18a49b6baffb0c5b0b4c21cc48c4ee576145ceae
|
|
| MD5 |
67419b4529684faa41a333b0f12a2e5b
|
|
| BLAKE2b-256 |
d191d5fb781f85e26a05e3ac5bbf842e2f1fc5b50659249325e9b688d2500747
|