Every open loop in my life, one decision at a time
A few times a day Claude reads my mail, messages, calendar and meeting notes and lists the replies, bills and promises I owe. Spark shows them one card at a time. Agents can do the prep, and nothing sends until I confirm the exact words.
Spark is on it
Claude sorts. Plain code checks its work.
The check runs at 7, 10, 1, 4 and 7, or when I press Check now. Claude gets the current list and what’s new since, with no tools, so all it can do is return text. Nothing it writes reaches the list until the check passes it.
Read
Every source is read, never written to. A source that can’t be read shows in amber instead of quietly missing.
Sort
Claude decides which threads are open loops, whose move each one is, what’s due and a next step, marked as a guess.
Check
The answer has to pass the list’s schema. If it fails, the old list stays and Spark shows the reason.
Compare
Plain code compares the old list with the new one and marks what changed, so a reworded next step doesn’t count as news.
One card, and every option says what it will do
The whole Mac window is there to show what needs me next. Each card’s bar shows its first option and at most two others, and each option says in one line what it will do.
- ↩Decide holds one card in ranked order: an agent waiting on me first, then anything due by tomorrow, then work that’s already prepared.
- LLater holds the card until tomorrow, next week or someday, with its evidence, draft and conversation intact. U undoes it for eight seconds.
- ZEverything zooms out to every open ask, grouped by space, with the next decision ringed.


Agents work on the card and ask before they act
Any card can go to Claude or Codex. Reading mail, the calendar, meeting notes or the web happens on its own. Anything else waits on the card for me to allow or deny, and the agent waits with it.
“Always allow” covers a kind of command from then on. It can’t cover sending, submitting, paying, posting or deleting, which ask every time. Return can never grant an approval, so a keystroke meant for another card can’t either.
Claude wants to write a file: case-study-notes.md
Read the onboarding case study and say whether the metrics section lands.
A message counts as sent once it’s in the thread
Spark sends email through Gmail and chats through Beeper. Before anything goes, the card’s bar turns into one line naming the recipient and the channel, over the exact text. Afterward Spark looks for the new message in the thread, and every send leaves a receipt.
If a send may have gone out but can’t be confirmed, Spark holds every later send on that channel until I check.
Ask a question in the bar, and the list answers without an agent
A question like “what did Jordan send me about the case study?” finds the ask by plain word matching and shows the sources and the words that matched. Ask Claude is one press further. Anything that isn’t a question goes to the tray, and Send to Spark puts a selection from any app there too.

The same list in my pocket, with names kept off the lock screen
The iPhone syncs with the Mac through iCloud, and sends still run on the Mac. Widgets and a Live Activity count what needs me and when the first thing is due. Lock Screen widgets never show a name or a message, and nothing in a widget can send.







Nothing goes out in my name unless I send it
- Claude reads, on my subscriptionNew messages go to Claude to be sorted, with no tools in that call. Agents run through the Claude and Codex command-line tools on the subscriptions I already have.
- Nothing sends on its ownNot the check, not an agent, not Siri. The command-line tool agents use has no send action at all, only a way to propose one for me to confirm.
- Client work stays outSpark covers my own life. Work for clients and employers is left out of every source.
- Mine to take outEverything lives in one folder on my Mac. Settings exports all of it as a zip, or deletes every file Spark made and names each one.