GTD + 12-Week Year CLI powered by Notion
Project description
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
- Filter by context for focused work sessions
Requirements
- Python 3.12+
- fzf (for interactive menus)
- A Notion integration token (for
gtd)
Installation
cd gtd
uv sync
uv pip install -e .
This installs the gtd command.
Usage
GTD interactive mode
gtd
Opens the fzf-powered GTD menu:
| 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 |
GTD subcommands
gtd init # Set up a new GTD Notion database
gtd init --upgrade # Add missing properties/options to existing DB
gtd triage # Process inbox items
gtd review # Guided weekly review ritual
gtd dump # Rapid-fire brain dump
gtd filter work # Filter projects by context
gtd today # Show today's actionable items
gtd capture # Quick-capture to inbox
gtd done # Mark a project as done
gtd update # Update project fields
gtd defer # Defer a project
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 pip install "gtd[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 |
|---|---|---|
POST |
/capture |
Add an item to the inbox. Body: {"header": "..."}. |
GET |
/contexts |
Get active contexts. |
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 |
/next-steps |
Get actionable next steps, optionally filtered by context. |
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 menu table and the HTTP API table above are both extracted from source
(cli.py's menu_items and the @app.get/@app.post/... routes in
api.py, respectively). After changing either, regenerate both:
python scripts/update_readme.py
A pre-commit hook (sync-readme) runs this automatically whenever cli.py,
api.py, or README.md changes, so the tables shouldn't drift in practice.
Data storage
- GTD: Notion database (configured via
gtd initorNOTION_NOTES_TOKEN/NOTION_PROJECTS_DB_IDenv vars) - Weekly review state, Areas of Focus, list categories: JSON files in
~/.local/share/gtd/
Project structure
src/gtd/
├── gtd.py # GTD interactive menu and CLI commands
├── gtd_tui.py # Textual TUI
├── storage.py # File I/O and path management
├── ui.py # fzf helpers, prompts, formatting
└── notion/
├── client.py # Notion API client
├── config.py # Config file management (~/.config/gtd/)
├── schema.py # Database schema definition
├── init.py # Database creation and upgrades
├── models.py # ProjectEntry dataclass
├── commands.py # GTD command implementations
├── capture.py # Inbox capture
├── triage.py # Triage processing
└── display.py # Entry formatting
scripts/
└── update_readme.py # Auto-update README menu section
Project details
Release history Release notifications | RSS feed
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 gtd_tui-0.1.0.tar.gz.
File metadata
- Download URL: gtd_tui-0.1.0.tar.gz
- Upload date:
- Size: 76.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45be64ef32360ed97fbbd5e67694c1868547196cc2606a50bc2d4bb9f7fae586
|
|
| MD5 |
08a1f905527d8d2fd71402f4b68bc1cb
|
|
| BLAKE2b-256 |
9db418350a2ba5cda7b4ee04ef5102002d021b7ca154ba8c480ba7f175ba41cf
|
Provenance
The following attestation bundles were made for gtd_tui-0.1.0.tar.gz:
Publisher:
publish.yml on dannybrown37/gtd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gtd_tui-0.1.0.tar.gz -
Subject digest:
45be64ef32360ed97fbbd5e67694c1868547196cc2606a50bc2d4bb9f7fae586 - Sigstore transparency entry: 2273575615
- Sigstore integration time:
-
Permalink:
dannybrown37/gtd@ee53faef0acd70c9fc30da9091066ab3ff551761 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dannybrown37
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ee53faef0acd70c9fc30da9091066ab3ff551761 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gtd_tui-0.1.0-py3-none-any.whl.
File metadata
- Download URL: gtd_tui-0.1.0-py3-none-any.whl
- Upload date:
- Size: 64.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
280eb4418ea0ac0578a5059ff5c75434a9f76a71622e83078a78efc710245374
|
|
| MD5 |
c0985eb313e006b6bdecb43a00eda4ee
|
|
| BLAKE2b-256 |
f18bac7a44fceb4172bb426c2c6cb9fea3e75197c19ff4a8c5de2260d563d319
|
Provenance
The following attestation bundles were made for gtd_tui-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on dannybrown37/gtd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gtd_tui-0.1.0-py3-none-any.whl -
Subject digest:
280eb4418ea0ac0578a5059ff5c75434a9f76a71622e83078a78efc710245374 - Sigstore transparency entry: 2273575833
- Sigstore integration time:
-
Permalink:
dannybrown37/gtd@ee53faef0acd70c9fc30da9091066ab3ff551761 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/dannybrown37
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ee53faef0acd70c9fc30da9091066ab3ff551761 -
Trigger Event:
push
-
Statement type: