Promises, both directions

A promise you remembered to write down was never the problem.

Reminders, Things, Todoist, a personal CRM, the apps built specifically for this — every one of them begins the moment you notice. They are good at the promises you caught. The ones that cost you something are the other kind: “I’ll send it tonight”, typed into WhatsApp at eleven, and then it is Thursday, and then it is Sunday and your mother has asked twice.

We make one of the tools below. Brownie is ours. The tools it is set against here are real and several of them are good — where one does something we do not, the table says so, and each links to its own site so you can check.

Where the gap actually is

It is not a memory problem. It is a capture problem.

The ones you type in

A reminder, a task, a line in a personal CRM. Completely reliable, and they contain exactly the promises you already knew about. The step that fails — noticing, at eleven at night, that the sentence you just sent was a commitment — happens before any of them start.

The ones email catches

Gmail nudges a thread you have not answered and a sent message nobody replied to. Boomerang will bring one back if no reply arrives. Both work and both are automatic. Both can also only see email, and they watch the thread rather than the sentence — a reply closes the nudge whether or not it was about the thing you promised.

The ones nobody catches

WhatsApp. iMessage. Telegram. The channels where you actually say “tonight”, to the people most likely to remember that you did. There is no API into any of them, so almost nothing is watching, and what is watching is usually a transcript dump rather than anything that understands a commitment.

That third column is not an accident, and it is the same wall we ran into counting Obsidian plugins: of 9,759 in the community registry, not one mentions iMessage. Email has an open protocol anyone can build against. The messaging apps have local databases on your own machine and nothing else, which means the only thing that can read them is a program running on that machine with your permission. It cannot be a web service, so almost nobody builds it.

Side by side

How a promise gets into each one.

Tool How a promise gets in Channels it can see Tracks what you are owed How it closes
Reminders, Things, Todoist You type it in Any — you are the input Only if you type that in too You tick it off
Gmail nudges Automatic Gmail only Yes — “sent, no reply yet” Any reply stops the nudge, on the thread not the promise
Boomerang You set it per message, before sending Gmail and Workspace; Outlook separately Yes — that is the whole feature A reply arrives, or the timer returns it to you
Monica You log the interaction yourself Any, by hand Only what you recorded You mark it done
followup-debt Automatic — reads your Sent mail and finds real commitments Gmail only No — your own commitments only Counts it resolved when you follow up again, not when they answer
Brownie Found in the message itself, on both sides of it WhatsApp, iMessage, Telegram, IMAP mail, Slack, Teams Yes — kept as its own side of the ledger The next night reads the replies and closes it

Checked 1 November 2026, from each tool’s own documentation. The dedicated promise-tracker apps on the iOS and Chrome stores are left out rather than guessed at: their listings describe manual logging, but we have not run them, and a row we cannot stand behind is worse than no row. Correct something by opening an issue.

The part that decides whether you keep using it

Every tracker dies the same death.

You set one up. It works for a fortnight. Then it fills with things you have already done but never went back to tick off, and the list stops matching reality. Once a list is wrong you stop trusting it, and once you stop trusting it you stop opening it. The failure was never capture — it was that closing a promise is a second chore, and nobody does the second chore.
So Brownie closes them itself. The promise was found in a message; the answer is in a message too. The next night’s read looks at what came after it, from both sides, and judges: answered by you, confirmed by them, declined, promised again for later, or still open. A reply that was not about the thing keeps it open. An answer that arrived on a different channel still counts — you said it on WhatsApp and sent the file by mail, and it closes.
If you already sent a nudge and the thing is still open at the next read, the card comes back marked Came back, and what it drafts is gentler rather than the same message twice. And it gives up on your behalf: an ask nobody answered in 45 days, or a promise of yours 90 days old, is quietly let go rather than sitting at the top of a list accusing you for a year.
What counts

“Let’s catch up soon” is not a promise.

The obvious way to build this is to match phrases — “I’ll”, “by Friday”, “tonight” — and the obvious result is a list of three hundred items, most of them pleasantries, which you abandon on day two. A promise tracker is only worth having if it is short enough to read.

So there is a test, and it is in the code rather than in a prompt: an entry has to have a deliverable that could be seen done. Sentiments do not qualify. Plans to make a plan do not qualify. Promises to nobody in particular do not qualify. “We should get dinner” never enters the ledger; “I’ll send the scan report tonight” does, because a later message can settle it either way.

Both directions, kept apart

Every person’s note carries a small ledger: ⏳ what is open — they asked you, or you promised them — ✅ what has been answered, shown for a fortnight and then folded into a one-line history, and ⌛ what has been let go. What you owe and what you are owed are different problems and they are tracked as different things, which almost no task manager does, because a task manager assumes every item is yours.

You can just ask

“What did I promise Meera?” is a question you can type into the app, and the answer comes out of your own notes with a citation on every claim — a chip that opens the actual message, in WhatsApp or Messages or Mail. Not a model’s impression of your life. The sentence you really sent, with its date. Claude Desktop and Cursor can ask the same question through MCP, on that Mac only.

Where Brownie fits

It reads at night. You get four things in the morning.

Loops is not a separate app you have to visit. At an hour you choose, a four-billion-parameter model on your own GPU reads everything new — messages, mail, notes, files, calendar — and almost all of it is thrown away. What survives becomes notes, and the promises in it become the ledger. In the morning there are a handful of cards, ranked: Amma has been waiting since Tuesday for a scan report that has been sitting in your Downloads since Monday. Karan said he would send his share of the villa on Friday and nothing has come. Each card shows why it is there, the message it came from, and a draft in your own voice.

Raw messages never leave the machine. Only short summaries go to whichever model you chose, and the app lists every byte that left, kept thirty days. Choose “This Mac only” and the figure is zero — no key, no account, nothing out. It drafts, and then it stops: there is no setting anywhere that lets it send on your behalf.

Free, AGPL-3.0, developed in the open, so the behaviour described here is readable rather than promised. Apple silicon, macOS 14 or later, 8 GB of memory, one 3.7 GB model download.

Download the beta for macOS Read how Loops is specified macOS 14 or later · Apple silicon · AGPL-3.0
Questions

The ones people actually ask.

How do I keep track of promises I make in WhatsApp?
On a Mac you can do it automatically, because WhatsApp Desktop keeps a local database that macOS will let a program read with your permission. On a phone you cannot, which is why the tools that exist for this are Mac-first or email-only. Brownie reads WhatsApp, iMessage, Telegram and IMAP mail on the machine, finds the sentences that are real commitments, and keeps them as a short list per person.
Can anything find commitments in my messages without me logging them?
For email, yes, and some of it is good: Gmail nudges threads nobody answered, and there are open-source pipelines that read your Sent mail and draft the follow-ups. For chat, almost nothing, because WhatsApp and iMessage have no API and can only be read locally on the machine they live on. That is the gap Brownie was built for, and it is why it is a Mac application rather than a service you log into.
Won’t it flag everything I say as a promise?
That is the usual failure, and the guard against it is a rule rather than a prompt: an entry has to have a deliverable that could be seen done by a later message. “We should get dinner” never enters the ledger. “I’ll send the scan report tonight” does. Sentiments, plans to make plans and promises to nobody in particular are all excluded, because a list you cannot read in ten seconds is a list you stop opening.
Do I have to mark things done?
No, and this is the point of it. The next night’s read looks at what came after the promise from both sides and decides whether it was answered by you, confirmed by them, declined, pushed back, or still open — including when the answer arrived on a different channel from the promise. You can override it by hand with Mark done or Not a promise, but you are not meant to need to, because the second chore is what kills every other tracker.

Related, if you are comparing more broadly: local AI assistants for Mac, and an AI assistant for Obsidian — where these notes live, and why nothing else fills a vault. And Apple Intelligence vs Brownie — it can search every promise you ever typed, the moment you think to ask.

Give it one night.

Tomorrow morning you will know what you owe people, what they owe you, and which of it has been sitting there longest — without having written any of it down.
Download the beta for macOS macOS 14 or later · Apple silicon · AGPL-3.0 · free, and no account
© 2026 Brownie · AGPL-3.0 · Inspired by all personal assistant apps and the architecture of Sentient OS · Made with ❤️ in India
HomePrivacyTermsGitHubSecurity