Skip to main content

The Getting Things Done Terminal User Interface

A TUI/CLI/API for personal productivity built around GTD (Getting Things Done).

What it does

  • Capture items to an inbox and triage them into projects
  • Track projects with contexts, next actions, and follow-up dates
  • Log completions and auto-reschedule recurring items
  • Defer, snooze, and review Someday/Maybe lists, grouped by Area of Focus
  • Filter by context for focused work sessions
  • Organize reference lists (books, restaurants, etc.) by List Category
  • Manage Areas of Focus and List Categories directly from the TUI or CLI
  • Track @Person agendas

Screenshots

Next Steps tab

Next Steps — the always-present Weekly Review reminder plus everything actionable right now, grouped by context.

More tabs Inbox tab

Inbox — unprocessed captures waiting to be triaged.

Projects tab

Projects — all Current Project and Waiting For items.

Waiting For tab

Waiting For — items delegated and waiting on someone else.

Incubation tab

Incubation — current projects snoozed past today's follow-up date.

Recurring tab

Recurring — habits and chores that repeat on their own schedule.

Someday tab

Someday — parked ideas, grouped by Area of Focus.

Lists tab

Lists — books to read, restaurants to try, and other reference lists, grouped by category.

(Screenshots use fictional demo data — see scripts/seed_demo_data.py and scripts/capture_screenshots.py to regenerate them.)

Requirements

fzf powers the interactive menus (legacy gtd fzf menu and several CLI prompts), but you don't need to install it separately — iterfzf ships a bundled fzf binary as a dependency. If you already have your own fzf on PATH, that one is used instead (so your existing config/theme/version wins).

Installation

From PyPI (recommended)

uv tool install gtd-tui

This installs the gtd command as an isolated tool, with fzf bundled in — no extra setup needed. Upgrade with uv tool upgrade gtd-tui.

From source

For local development, or to run an unreleased version:

git clone https://github.com/dannybrown37/gtd.git
cd gtd
uv tool install -e .

The -e flag installs in editable mode, so code changes take effect after re-running the command (no reinstall needed unless dependencies change).

Usage

Default: the TUI

gtd

With no subcommand, gtd launches the Textual TUI — tabs for Next Steps, Inbox, Projects, Waiting For, Incubation, Recurring, Someday, and Lists, plus a guided Weekly Review. This is the primary interface.

CLI subcommands

Each of these also works standalone, e.g. for scripting or quick one-offs without opening the TUI:

Command Description
gtd init Set up or upgrade the GTD Notion database.
gtd triage Interactively process items needing triage.
gtd filter Filter by context name (e.g. gtd filter Phone).
gtd today Show actionable items for today.
gtd snooze Snooze today's items until tomorrow.
gtd log Log a note and reschedule a recurring item.
gtd done Mark a current project as done (archives it).
gtd review Run the GTD weekly review ritual.
gtd update Update fields on an existing project.
gtd defer Defer a project by setting a follow-up date.
gtd someday Review Someday/Maybe items — keep, activate, or drop.
gtd capture Quick-capture an item to the GTD inbox.
gtd areas Manage Areas of Focus (Notion 'Area' select options).
gtd areas add Add a new Area of Focus.
gtd areas remove Remove an Area of Focus.
gtd contexts Manage GTD contexts (Computer, Home, Phone, etc.).
gtd contexts add Add a new context.
gtd contexts remove Remove a context.
gtd contexts rename Rename a context and update all items with that context.
gtd dump Rapid-fire brain dump — capture everything, triage later.
gtd config View or set GTD configuration.
gtd config notes-editor Set notes editor: inline (TUI TextArea) or external (uses $EDITOR).
gtd fzf Launch the legacy fzf-based interactive GTD menu.
gtd tui Launch the interactive GTD TUI.
gtd api Start the GTD HTTP API server (requires: gtd-tui[api]).

Legacy fzf menu

gtd fzf

An older fzf-driven menu predating the TUI, kept for anyone who prefers it:

Category Action
Do Today
Do Log & Reschedule
Do Snooze until tomorrow
Do Capture new item
Do Brain dump
Do Triage inbox
Manage Update project
Manage Defer project until date
Manage Waiting For
Manage Mark done (delete)
Review Weekly Review
Review Review Someday/Maybe
View View all projects
View Filter by context

HTTP API

A small Flask app (gtd api) exposes GTD operations over HTTP, primarily so you can drive gtd from iOS Shortcuts (or any other HTTP client) without opening a terminal — capture a thought, check today's actionable items, or triage the inbox from your phone.

There's no central server in the loop: you run this yourself, against your own Notion integration and database. Your GTD data lives in your Notion account under your own token.

Install: uv tool install "gtd-tui[api]" Run: gtd api (default 0.0.0.0:8000) or gtd api --port 9000 Auth: Bearer token — set GTD_API_KEY on the server, then pass Authorization: Bearer <key> on every request.

Method Path Description
GET / Serve the mobile web app shell.
GET /app.js Serve the web app's client-side JS.
POST /capture Add an item to the inbox. Body: {"header": "..."}.
GET /contexts Get active contexts.
POST /done/<page_id> Mark an entry done (archives the page).
GET /icons/<path:filename> Serve the web app's PWA icons.
GET /inbox Get all Triage entries (inbox).
GET /list-categories Return canonical list categories from Notion (for debugging/UI use).
GET /list/<category> Get all entries in a specific list category.
GET /manifest.json Serve the PWA manifest.
GET /next-steps Get actionable next steps, optionally filtered by context.
GET /styles.css Serve the web app's stylesheet.
GET /triage-schema Get schema for triage workflow: statuses and contexts per status.
POST /triage/<page_id> Atomically triage an entry with full data.

Updating this README

The fzf menu table, CLI command table, project tree, and HTTP API table above are all extracted from source: cli.py's menu_items list and click command tree, module docstrings under src/gtd/ and scripts/, and the @app.get/@app.post/... routes in api.py, respectively. After changing any of these, regenerate everything:

python scripts/update_readme.py

A pre-commit hook (sync-readme) runs this automatically whenever any src/gtd/**/*.py, scripts/**/*.py, or README.md file changes, so these sections shouldn't drift in practice.

Data storage

  • GTD projects/inbox, Areas of Focus, List Categories: Notion database (configured via gtd init or NOTION_NOTES_TOKEN / NOTION_PROJECTS_DB_ID env vars) — Areas and List Categories are select-field options on that database, managed via gtd areas/the Someday tab and the Lists tab respectively, not separate files
  • Weekly review state: JSON file in ~/.local/share/gtd/

Project structure

src/gtd/
├── api.py          # Thin Flask wrapper around GTD Notion operations for iOS Shortcuts.
├── cli.py          # GTD CLI — David Allen's Getting Things Done powered by Notion.
├── gtd_tui.py      # Unified GTD TUI.
├── storage.py      # Local JSON I/O for weekly review state and habit dates.
├── tui.py          # Shared Textual widgets and modals for the GTD TUI.
├── ui.py           # fzf helpers, prompts, and formatting shared across CLI commands.
├── notion/
│   ├── capture.py  # Quick-capture items to the GTD inbox (Notion Projects table).
│   ├── client.py   # Notion REST API client (httpx).
│   ├── commands.py # Manage commands: mark done, defer, waiting for, notion dispatch.
│   ├── config.py   # Configuration management for GTD CLI.
│   ├── display.py  # Display formatting for Notion entries.
│   ├── entries.py  # Entry listing, selection, and field editing.
│   ├── init.py     # Database initialization and schema management for GTD CLI.
│   ├── log.py      # Log, reschedule, and recurring-item utilities.
│   ├── models.py   # Parse Notion page properties into simple data structures.
│   ├── review.py   # Weekly review and Someday/Maybe review flows.
│   ├── schema.py   # GTD Notion database schema definition — single source of truth.
│   ├── today.py    # Today view and snooze commands.
│   └── triage.py   # Interactive triage flow for processing inbox items.
└── webapp/
    └── icons/
scripts/
├── capture_screenshots.py # Capture SVG screenshots of every GTD TUI tab, for docs/README.
├── seed_demo_data.py      # Create/reseed a demo GTD Notion database with fake data, for screenshots.
└── update_readme.py       # Update README.md menu, CLI, tree, and HTTP API sections from source.

Metadata

Release files for gtd-tui 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gtd-tui 0.6.0
File Size Uploaded
gtd_tui-0.6.0.tar.gz 97.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gtd-tui 0.6.0
File Interpreter ABI Platform
gtd_tui-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 177.9 kB

Release files / gtd_tui-0.6.0.tar.gz

Download URL gtd_tui-0.6.0.tar.gz
Size 97.9 kB
Tags Source
SHA-256 checksum
How to use checksums
cc79b342abf9ae18e7b49188e14169c35e5d6983806505a18b23f178ad5b97b1
BLAKE2b-256 checksum
How to use checksums
b8713e056cc4fc4843edcdc7edefdb373ce14103d09948ea805d4166b245776a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Release files / gtd_tui-0.6.0-py3-none-any.whl

Download URL gtd_tui-0.6.0-py3-none-any.whl
Size 80.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
59e0c60f194b36c15894dec88ec1b657a432d92817a34955f1a01cfd2a4fdb32
BLAKE2b-256 checksum
How to use checksums
03bee8ba89cc38b9f5323e9d5089f4bf00318b952688b691ae7c85e3e00a505e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 5, 2026.

Transparency log

Release history Release notifications | RSS feed

0.13.1

2 release files

0.13.0

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.9

2 release files

0.10.8

2 release files

0.10.7

2 release files

0.10.6

2 release files

0.10.5

2 release files

0.10.4

2 release files

0.10.3

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.7

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

This release

0.6.0 This release

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page