Open source · runs in your terminal · zero dependencies

Never choose what to
work on again.

mm is a to-do list that shows you exactly one task — the one you said mattered. Everything easier stays out of reach until it is done. You still decide when to work; mm decides what.

$ pipx install git+https://github.com/Toseef-Ahmad/mm.git
Read the source

Zero dependencies Python 3.11+ MIT licensed macOS & Linux Your data stays in ~/.mm

mm real output

      

Every frame above is genuine output, recorded from the CLI by site/tools/capture.py. Nothing on this page is a mockup.


The problem

Your to-do list is a pile of decisions

Every list you keep is a choice you have to make again tomorrow. Ten open items is not ten tasks — it is ten arguments with yourself, and the one that wins is the easiest, not the one that mattered.

Most tools respond by adding structure: priorities, tags, dates, four quadrants. That is more input to the same argument. mm takes the argument away. You describe what matters once, in one file, and from then on the tool answers a single question — what now — with exactly one item.

A gate does not remind you to do the hard thing.
It makes the easy thing not an option.

Why this one

Other tools store your work. This one starts it.

If your problem is remembering things, a normal to-do app already solves it. mm is for the other problem: you know exactly what you should be doing, and you open the list anyway and pick something easier.

01 · It answers, it does not display

A list hands the decision back to you every time you look at it. mm returns one item. There is nothing to scan, compare, or reorder, so there is no moment where the easy task can win.

02 · Priority that actually binds

Everywhere else, "high priority" is a red label you are free to ignore. Here it is a gate: while one is open, mm will not offer you anything else. You set the constraint yourself, on a calm morning, and it holds at 3pm when you are looking for an excuse.

03 · Interruptions cannot become the plan

Urgent work goes on a stack that preempts everything, then unwinds — closing it returns you to the exact task you left. In a list app, an interruption just becomes another row and quietly replaces what you were doing.

04 · It does not ask you to move in

Habits sync both ways with the Obsidian daily note you already keep. No migration, no account, no subscription, no server. Your data is plain text files in a folder you own, and there is no network code in the tool at all.

How the approaches differ. All three are good at what they were built for.
mm List apps
Todoist, Things, TickTick
CLI task managers
Taskwarrior, todo.txt
What it shows you Exactly one task A list you choose from A list you query
What priority means A constraint that blocks everything else A label you can ignore A sort key
Interruptions A stack that unwinds back to your task Another row in the list Another row in the list
Habits and tasks The same object, queued automatically A separate feature, or a separate app Recurrence syntax
A cap on the day Capacity limits; overflow parks itself Add as many as you like Add as many as you like
Where your data lives Plain files on your disk Their servers Plain files on your disk
Price Free, MIT, no account Free tier, then a subscription Free, open source

How it works

Three containers, one rule each

The whole model fits in your head, which is the point. There is nothing to configure to make it behave.

  1. 01

    The interrupt stack — for genuine urgency

    LIFO. It preempts everything, then unwinds like a call stack, so an interruption cannot quietly become your new plan. When the fire is out you are returned to the exact thing you were doing.

  2. 02

    The queue — and the gates that hold it shut

    Default work, in order. Mark the things that actually matter as gate = true, and while any gate is open mm will not offer you anything else. Items behind it are shown, greyed, and labelled gate-locked — visible, but never what the pointer hands you.

  3. 03

    The quick queue — and a ceiling on the day

    Sub-one-minute trivia that never surfaces mid-task; you flush it at a checkpoint. And capacity limits stop the day growing past your energy — overflow parks in a backlog and returns when there is room.

The ritual

Two commands, forever

$ mm            # what to do right now
$ mm done       # finished — the next thing appears

There is no third step. No morning planning session, no inbox to process, no daily review you will abandon in a week.

The schedule

One file you own

[[habits]]
name = "Deep work"
repeat = 1        # daily; 3 = every third day
gate = true       # nothing else until this closes
order = 1         # front of the queue

Anything you return to — a book, a course, a walk — is the same object. Declare it once; mm re-queues it whenever it is due.


Obsidian

It shares your daily note instead of competing with it

If you already track habits as checkbox properties in an Obsidian daily note, mm reads and writes that same list. Tick the box in Obsidian and the item leaves your queue. Run mm done and the box gets ticked. Untick it and the habit comes back.

Your note
---
type: daily
reading: true
deep_work: false
---

Plain frontmatter. mm did not invent a format for you, and it registers the properties as checkbox types in your vault so Obsidian renders them as real checkboxes.

Why it does not fight you

Two sources of truth, resolved honestly

A property reading false is ambiguous: it could mean you unticked the box, or mm closed the item and has not written the note yet. Guess wrong and mm done undoes itself — which is exactly the bug that shaped this design.

So mm keeps a shadow of the values both sides last agreed on. Only a genuine change counts as your edit, and your ticks always win.

Live sync
$ mm obsidian watch              # live, in the foreground
$ mm obsidian autostart on       # background, across logins (macOS)

Sync also runs on every mm, mm status and mm done, so you can ignore all of this and it still works.


Honest fit

Who it is for — and who it is not

A tool this opinionated is wrong for plenty of people. Better you find out here than after installing it.

Use it if
  • You already live in a terminal.
  • Your problem is starting, not remembering.
  • You keep an Obsidian daily note and want habits in one place.
  • You want your data as files you can read, with no account.
  • You have a few things that genuinely matter each day, and a pile of small ones that keep eating them.
Skip it if
  • You do not use a command line. There is no GUI and no phone app.
  • You need due dates, reminders, or notifications.
  • You work off shared boards with a team.
  • You want to capture a hundred loose ideas — that is a list app's job, and it is good at it.
  • You like choosing what to work on. mm exists to take that away.

And what it deliberately is not

No dependencies

Standard library only, and CI proves it: a Python interpreter started with no site-packages must still import mm, on 3.11 through 3.13, on Linux and macOS.

No service

Nothing to sign up for, nothing that phones home, no account and no sync server. It is a program on your machine.

Your files stay yours

Config is TOML you edit. State is JSON you can read. mm never rewrites something you hand-edited without reading the current contents first.

Not a calendar

No times, no scheduling, no reminders, no notifications. mm answers what. You own when.

Not a team tool

Single user, single machine. There is no board to share and no assignee field to argue about.

Not a habit gamifier

Streaks exist because a broken one is information. There are no points to farm, badges, or encouraging notifications.


Install

Two minutes, then never think about it again

Python 3.11 or newer. Nothing else.

With pipx

Isolated, and mm lands on your PATH.

pipx install git+https://github.com/Toseef-Ahmad/mm.git
mm init
mm

From a clone

Editable checkout, plus the mm(1) manual.

git clone https://github.com/Toseef-Ahmad/mm.git
cd mm && ./install.sh
mm init && man mm

mm init writes an annotated ~/.mm/mm.toml. Edit the habits, run mm, and the tool takes it from there.


Questions

The honest answers

How is this different from Todoist, Things or other to-do apps?

They show you every task and make you choose. That moment of choosing is exactly where the day goes wrong: the easiest item wins, and it is never the one that mattered. mm shows one task.

The other difference is what priority means. In a list app it is a red label you are free to ignore. Here it is a gate — while one is open, mm will not offer you anything else, so the decision you made calmly in the morning is the one that holds at 3pm.

How is this different from Taskwarrior or todo.txt?

Those are excellent at storing and querying tasks. They will happily show you forty items and let you pick — which is the moment mm is built to remove. mm shows you one thing, and while a gate is open it refuses to offer the easy alternatives.

It is also much smaller in scope on purpose: no dates, no recurrence language, no query syntax. If you want a database of tasks, use Taskwarrior. If you want something that answers what now and will not negotiate, use mm.

Can I just override a gate?

Yes. mm done <id> closes anything by id, and mm reset --park-gates suspends leftovers. Gates govern what mm offers, not what it permits — a tool that locked you out of your own machine would just get uninstalled.

The value is that skipping becomes a deliberate act you have to type, instead of the default outcome of a glance at a list.

Do I have to use Obsidian?

No. The sync is off unless you add an [obsidian] block to your config. mm is complete without it.

What happens if I miss a day?

When the calendar day rolls over, mm drops yesterday's unfinished copies, marks those due dates missed, and queues one fresh copy of everything due today. Nothing piles up and nothing is queued twice.

Streaks are gap-aware: a repeat = 3 habit is never punished for the two days it was not due. A broken streak means you missed something you actually committed to.

Is my data going anywhere?

No. Everything lives in ~/.mm as plain JSON and TOML. There is no network code in the tool at all — you can check, it is about 5,000 lines and MIT licensed.

Does it work on Windows?

Untested. The core is portable Python and file locking degrades gracefully without fcntl, but CI only covers macOS and Linux, so it is not claimed. WSL works.