Aggregate TODO deadlines across multiple projects into a single agenda-style CLI view.
Project description
todo-hub
todo-hub is a lightweight CLI tool that aggregates TODO tasks across multiple projects and presents them as a deadline-focused agenda.
It scans TODO.md files from different repositories and shows tasks grouped by urgency in a clean, colorized terminal view.
Ideal for developers managing many small projects.
Features
- Scan TODO files across multiple projects
- Parse Markdown checkbox tasks
- Detect deadlines using
@YYYY-MM-DD - Optional priority tags:
!high,!medium,!low - Support nested tasks (parent tasks are ignored)
- Agenda-style weekly view
- Deterministic color per project
- Simple
config.tomlconfiguration - Fast and dependency-light
Installation
Recommended (pipx)
pipx installs CLI tools in isolated environments.
pipx install todo-hub
Run:
todo-hub
If pipx is not installed:
python -m pip install --user pipx
pipx ensurepath
Using pip
pip install todo-hub
Development install
git clone https://github.com/cwahyu/todo-hub.git
cd todo-hub
pipx install -e .
Usage
Run:
todo-hub
Example output:
Overdue:
- [ ] fix parser @2026-03-10 (-4d) #mudita
This week:
Today
- [ ] finish CLI @2026-03-14 (0d) #todo-hub
Tomorrow
- [ ] improve parser @2026-03-15 (1d) #mudita
Later:
- [ ] redesign module @2026-03-25 (11d) #todo-hub
Unscheduled:
- [ ] research API #blog
Additional commands:
todo-hub today
todo-hub week
todo-hub projects
todo-hub doctor
TODO Format
todo-hub scans Markdown files named:
TODO.md
todo.md
Tasks use Markdown checkboxes:
- [ ] task description
Optional metadata:
@YYYY-MM-DD deadline
!high priority
!medium
!low
Examples:
- [ ] implement CLI @2026-03-20
- [ ] fix production bug !high @2026-03-16
- [ ] improve documentation
Nested tasks are supported:
- [ ] version 0.3.0
- [ ] support indented tasks
- [ ] priority tags !medium
Parent tasks without deadlines are ignored.
Completed tasks are skipped:
- [x] finished task
Configuration
Projects are defined in config.toml.
Example:
[[project]]
name = "mudita"
path = "~/projects/mudita"
[[project]]
name = "todo-hub"
path = "~/projects/todo-hub"
Each project directory is scanned recursively for TODO files.
Philosophy
todo-hub is designed around a few simple principles.
Deadlines over task lists
Most task tools focus on managing tasks inside a single project.
todo-hub focuses on deadlines across projects.
The goal is to answer one question quickly:
What needs my attention today?
Plain text first
Tasks live in simple Markdown files:
TODO.md
This keeps the workflow:
- transparent
- version-controlled
- editor-friendly
- portable
No databases, no lock-in.
Terminal-first workflow
todo-hub is intentionally simple and optimized for terminal use:
- fast startup
- minimal dependencies
- readable CLI output
- color used only to highlight urgency
Run:
todo-hub
and immediately see what needs attention.
Small and maintainable
The architecture is intentionally minimal:
config → scan → parse → schedule → present
Each module has a single responsibility.
Development
Install dependencies:
poetry install
Run the CLI:
poetry run todo-hub
Run tests:
pytest
License
MIT License
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 todo_hub-0.3.2.tar.gz.
File metadata
- Download URL: todo_hub-0.3.2.tar.gz
- Upload date:
- Size: 7.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
abb4567e411fa6e8de1735b5978011789d5a3de654707f0e7198ea53aeda3d91
|
|
| MD5 |
39701a827b608833fa8b6d3ce8fead3e
|
|
| BLAKE2b-256 |
d653ab670f4ebf5baf9f9bf98cbdb51595e6c654a1f9fd102cedafe4304be0f7
|
Provenance
The following attestation bundles were made for todo_hub-0.3.2.tar.gz:
Publisher:
publish.yml on cwahyu/todo-hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todo_hub-0.3.2.tar.gz -
Subject digest:
abb4567e411fa6e8de1735b5978011789d5a3de654707f0e7198ea53aeda3d91 - Sigstore transparency entry: 1122344286
- Sigstore integration time:
-
Permalink:
cwahyu/todo-hub@37c976f5e7a6542043890436c451d7e74f228f70 -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/cwahyu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@37c976f5e7a6542043890436c451d7e74f228f70 -
Trigger Event:
push
-
Statement type:
File details
Details for the file todo_hub-0.3.2-py3-none-any.whl.
File metadata
- Download URL: todo_hub-0.3.2-py3-none-any.whl
- Upload date:
- Size: 10.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05c001fc1dc4350d948663f6513a350e093ea01f1ef8af0d460b550e1865ca6d
|
|
| MD5 |
7e321fe285757b7a3b8e729e00a25580
|
|
| BLAKE2b-256 |
894feae8c7c748eb7bcd42b191003f1f59b8df309030146a6f039c888d857937
|
Provenance
The following attestation bundles were made for todo_hub-0.3.2-py3-none-any.whl:
Publisher:
publish.yml on cwahyu/todo-hub
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todo_hub-0.3.2-py3-none-any.whl -
Subject digest:
05c001fc1dc4350d948663f6513a350e093ea01f1ef8af0d460b550e1865ca6d - Sigstore transparency entry: 1122344316
- Sigstore integration time:
-
Permalink:
cwahyu/todo-hub@37c976f5e7a6542043890436c451d7e74f228f70 -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/cwahyu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@37c976f5e7a6542043890436c451d7e74f228f70 -
Trigger Event:
push
-
Statement type: