Skip to main content

Minimal TUI todo app

Project description

td

A fast, keyboard-driven TUI todo manager for the terminal. Multi-list, encrypted, scriptable.

td demo

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:

listsname (PK), position, max_tasks

tasksid, 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

td_task-0.1.5.tar.gz (142.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

td_task-0.1.5-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

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

Hashes for td_task-0.1.5.tar.gz
Algorithm Hash digest
SHA256 222ca004f31efc4a73907dbf231b75e9d67f8764f9682892c181d6334161085d
MD5 7502dff0bc85a8de2d3b917ae69a3149
BLAKE2b-256 945b0e78928c58f9e634f12f27209fcb29f8bea6a8630ebd2d3ff33febc6bcc7

See more details on using hashes here.

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

Hashes for td_task-0.1.5-py3-none-any.whl
Algorithm Hash digest
SHA256 51b3a7198d108131d0e7d25c18a49b6baffb0c5b0b4c21cc48c4ee576145ceae
MD5 67419b4529684faa41a333b0f12a2e5b
BLAKE2b-256 d191d5fb781f85e26a05e3ac5bbf842e2f1fc5b50659249325e9b688d2500747

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page