One sentence in, typed items out
Say "dentist tomorrow at 3, pick up the prescription Thursday, and the furnace filter every three months" and Upkeep sorts it into four kinds, each with the fields that kind actually needs. An appointment with no stated end gets an hour; a reminder with no stated time lands at 9:00 am. Because dates are resolved by ordinary arithmetic rather than left to the model, "next Tuesday" means next Tuesday, and Jan 31 plus a month lands on the last day of February.
| Event | Dentist — starts tomorrow 3:00 pm, ends 4:00 pm |
| Reminder | Pick up prescription — due Thursday 9:00 am |
| Chore | Furnace filter — every 90 days from completion |
Nothing is written until you say so
Every captured item lands in a review inbox first, with a confidence score, the fields Upkeep extracted, and the sentence it came from. One function in the codebase is allowed to write to Calendar and Reminders — it re-reads the item first and refuses anything you haven't confirmed.
| Capture | Speak it, or type it. On macOS, transcription runs on the device. |
| Extract | The transcript becomes typed items — event, reminder, chore or note — then a deterministic pass repairs the dates. |
| Review | You see exactly what it understood, next to what you actually said. Confirm, or reject. Confirm all if it got everything right. |
| Write | The one trust gate: it re-reads the row and throws for anything whose status is not confirmed. |
Chores that count from when you did them
Set a repeating reminder to change the oil every 90 days and it fires every 90 days whether or not you did it — so it drifts, you start ignoring it, and eventually you turn it off. An Upkeep chore is due 90 days after you actually finished it. Tick it off and the next one is scheduled from that moment. Every time you open the app, Upkeep reconciles: if you completed the reminder in Reminders.app it records the completion and schedules the next, and if you deleted it, it notices the orphan and puts a fresh one back.
A read-back of what's coming
A short briefing over the day, week or month you pick, built from a fact sheet of your real events and reminders — so it can summarise them, not invent them. Overlapping events are detected and called out by name, so a double-booking surfaces before the day does.
Works without a key
No API key, or the call fails? The digest falls back to a plain deterministic summary rather than showing you nothing.
Your keys, your device
Bring your own LLM provider key. It's held in the system Keychain, and your data stays in a local database on the machine.