mdtodo
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.
- [ ] 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.@activemarks a task you're working on now.@nextadds a task to the pool of tasks you plan to pick up next.due:YYYY-MM-DDsets 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
Inboxproject. Prose, notes, and code blocks are ignored.
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:
--file PATH, which can go before or after the command;- the
MDTODO_FILEenvironment variable; ~/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.
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 |
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.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| mdtodo-0.1.0.tar.gz | 12.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mdtodo-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 27.9 kB
Release files / mdtodo-0.1.0.tar.gz
| Download URL | mdtodo-0.1.0.tar.gz |
|---|---|
| Size | 12.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
148c10aa6b0120e774005fa248af7548f1d893a89b12298dc59839cee298cf28
|
|
BLAKE2b-256 checksum How to use checksums |
7a6ff0d35a298f03cd1ed3c1c914ef0ece20f256538fb47b5fcc39c5b28b2f02
|
| 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.1.0-py3-none-any.whl
| Download URL | mdtodo-0.1.0-py3-none-any.whl |
|---|---|
| Size | 15.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ede823eb1e25ef96aa14dbe5065a75c311370eb6a881b031a2beb4818898a9ad
|
|
BLAKE2b-256 checksum How to use checksums |
39eb4ef22ac472b3da85b086edc8a9c00b76f21b61f802ec50a9d2431f4accb3
|
| 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.1.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.