Skip to main content

mdtodo

mdtodo is a command-line todo manager that keeps everything in one plain markdown file. mdtodo is a command-line todo manager that keeps everything in one plain markdown file. Headings are projects and checkbox items are tasks. You can edit the file in any editor, or use the mdtodo commands. Either way, it stays readable markdown. use the mdtodo commands. Either way, it stays readable markdown.

- [ ] Call the bank due:2026-10-20

## Website
- [ ] Write landing copy @active due:2026-10-18
- [ ] Pick a color palette @next
  - [ ] Shortlist 3 palettes
- [x] Buy domain
  • [ ] means open, and [x] means completed.
  • @active marks a task you're working on now. @next adds a task to the pool of tasks you plan to pick up next.
  • due:YYYY-MM-DD sets a deadline. Open tasks are flagged as overdue, or as due soon (today through the next 3 days).
  • Tasks above the first heading go into the Inbox project. Prose, notes, and code blocks are ignored.

Listings show each task with its reference. A subtask is labelled with its parent's name, as <parent>: <task>, so you can tell which task it belongs to:

$ mdtodo list --project Website
## Website
bbdb3a  Write landing copy  (due 2026-10-18, overdue)
b1b77f  Pick a color palette
  aa0d81  Pick a color palette: Shortlist 3 palettes

The full syntax is in specs/001-markdown-todo-manager/contracts/file-format.md.

Install

With uv installed:

uv tool install mdtodo   # puts `mdtodo` on your PATH (~/.local/bin)
mdtodo --version

If you don't have a suitable Python, uv downloads one for you.

uv tool install mdtodo==X.Y.Z   # install a specific version
uv tool upgrade mdtodo          # move to the latest release
uv tool uninstall mdtodo        # remove the command

Uninstalling removes only the command. Your todo file (~/tracker.md, or whatever --file or MDTODO_FILE points at) is left untouched.

Switching from an editable install: if you installed with uv tool install --editable ., run uv tool uninstall mdtodo first, or replace it in one step with uv tool install --force mdtodo.

Which file is used

The first match wins:

  1. --file PATH, which can go before or after the command;
  2. the MDTODO_FILE environment variable;
  3. ~/tracker.md.

If you used an earlier version that read ~/TODO.md, rename that file to ~/tracker.md, or point --file or MDTODO_FILE at it. 2. the MDTODO_FILE environment variable; 3. ~/tracker.md.

If you used an earlier version that read ~/TODO.md, rename that file to ~/tracker.md, or point --file or MDTODO_FILE at it.

mdtodo init creates a starter file. Nothing else ever creates the file. mdtodo init creates a starter file. Nothing else ever creates the file.

Commands

Command What it does
mdtodo / mdtodo summary Active, Next, Overdue, and Due soon tasks, plus counts per project
mdtodo list [--all] [--project NAME] Tasks grouped by project, each with its reference
mdtodo next The next pool, ordered by deadline
mdtodo due Open tasks ordered by deadline
mdtodo start REF / mdtodo stop REF Add or remove @active
mdtodo next add REF / mdtodo next rm REF Add or remove @next
mdtodo done REF Check the box, and remove @active and @next
mdtodo init Create a starter file
mdtodo / mdtodo summary Active, Next, Overdue, and Due soon tasks, plus counts per project
mdtodo list [--all] [--project NAME] Tasks grouped by project, each with its reference
mdtodo next The next pool, ordered by deadline
mdtodo due Open tasks ordered by deadline
mdtodo start REF / mdtodo stop REF Add or remove @active
mdtodo next add REF / mdtodo next rm REF Add or remove @next
mdtodo done REF Check the box, and remove @active and @next
mdtodo init Create a starter file

REF is the 6-character reference shown in every listing. It stays the same when markers change. If you edit a task's text, its reference changes, and the old one is refused rather than applied to the wrong task. Each command changes only the task's own line. If the file changed while the command was running, nothing is written.

Details, including output formats and exit codes, are in contracts/cli.md.

Development

uv sync
uv tool install --editable .       # installs this working tree as the `mdtodo` command
scripts/check.sh                   # format, lint, mypy --strict, tests (coverage ≥ 80%)
uv run pytest -m perf --no-cov     # timing checks (SC-002), kept out of the default run

The design documents are in specs/001-markdown-todo-manager/, and the project principles are in .specify/memory/constitution.md.

Releasing

Releases go to PyPI with scripts/release.sh. See docs/releasing.md.

Metadata

Release files for mdtodo 0.2.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 mdtodo 0.2.0
File Size Uploaded Provenance
mdtodo-0.2.0.tar.gz 12.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for mdtodo 0.2.0
File Interpreter ABI Platform
mdtodo-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 28.6 kB

Release files / mdtodo-0.2.0.tar.gz

Download URL mdtodo-0.2.0.tar.gz
Size 12.4 kB
Tags Source
SHA-256 checksum
How to use checksums
5431d877b3d357e33037209e6c875abce0b80b415bbbd7814e4f351a02c48e37
BLAKE2b-256 checksum
How to use checksums
f21e48eee3896eb84efe9394a5332957c915028b610fae87417556c9bf5e8596
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","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}

Release files / mdtodo-0.2.0-py3-none-any.whl

Download URL mdtodo-0.2.0-py3-none-any.whl
Size 16.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4921b034580481c580bd2a40e9822f82f41d69aa4e4a20c54a406b4dfab62857
BLAKE2b-256 checksum
How to use checksums
b98d45d5fcdfc37415a38f59f985c13442b12982ba7951d05c1ce622337589ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","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}

Security for mdtodo 0.2.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files No provenance

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