People
The people graph, who is waiting on you, when it is a reasonable hour to call, and cadence drift.
Live.
Otto's notes are free text with no subject, so "who is Marco and when did we last talk" has no answer. The people graph gives every human one record.
What a person record holds
Built from email senders and recipients, calendar attendees, and names you say in conversation:
- every address and alias that resolves to the same person
- the organisation, taken from the signature block or the domain
- first and last contact in each direction, which is the difference between "I forgot" and "they never replied"
- the median gap between contacts, per person
- city and timezone
Addresses are normalised so that one human with three addresses is one record rather than three.
Good hour to call
Each contact's timezone and working hours are inferred from the UTC offsets in
their email Date headers. This costs nothing, needs no location data, and
self-corrects when they travel.
The practical effect: Otto never proposes a slot or nudges you to ring somebody at 04:00 their time, and a person card can say "her evening is 14:00 to 21:00 BRT" without you ever having told it.
Cadence drift
A person is flagged when the silence exceeds 2.5 times their own historical gap, not against a global threshold. A weekly call with your mother and a twice-a-year friend are judged on different clocks, which is the only way this signal is anything other than noise.
Drift alone is not a reason to speak. The intended use is a monthly pass that surfaces at most two names, and only those who also have a hook: a birthday soon, a city you are visiting, an unanswered thing they said.
Not built yet
These do not exist. The substrate each one reads is live, so every item below is a self-contained piece of work rather than a rewrite. The button copies a prompt that builds it in your own checkout.
A brief section computed every 5 min listing threads where the last message is theirs, addressed to them, unanswered past a threshold, ranked by correspondent weight × age and rendered as three lines max ("landlord 4d · accountant 2d · Ana 26h"); costs zero interruptions and turns "is anyone waiting on me" into a fact.
Loops gain `with` (person) and `direction`, splitting the brief into "You owe" and "Waiting on" each aged in days, with a [chase] button that drafts the follow-up in the original thread — and the same record covers social debt (an intro made, a dinner covered); the difference between "I forgot" and "they never replied" is currently invisible.
Before any event with external attendees, one four-line card: who they are, when you last spoke and about what, what you promised them, what they promised you, and the doc linked in the invite — sent only when it contains something they don't already know, silent for solo blocks and unchanged standups, and cheap to precompute overnight.
The scan watches for the rare high-stakes sentences buried in threads they'd skim — a birth, a death, an illness, a wedding, a layoff — and offers one warm note with a [draft it] button and nothing else; the one category where being three days late is worse than being silent.
A `gift` note written silently whenever someone's want surfaces in a message or voice note, storing the quote, the date, the person and a rough price in both currencies, with an explicit rule never to acknowledge the capture; six months later the birthday nudge hands them three real ideas in their own words.
Birthdays harvested from macOS Contacts, recurring events and things they mention, each arming a pair of triggers sized by logistics — three weeks if the gift ships Brazil→Italy, three days if it's a message — with the stored gift shortlist attached and a [draft the message] button; no annual calendar clutter.
Monthly, flag people whose silence exceeds 2.5× their own historical gap and who also have a hook — a birthday soon, a city they're visiting, an unanswered thing they said — and send at most two names with a [say hi] button that drafts an opener referencing what they last talked about; keyed to their baseline, so weekly-call parent and twice-a-year friend are judged on different clocks.
When a booking or calendar block shows they'll be in a city more than a day, one message names the two or three people there they haven't seen longest, each with a [draft a ping] — fired once, at booking time, while the calendar is still empty enough to matter; aimed straight at the recurring "I was in Milan last week" regret.
A designated partner in access.json unlocks a `Together` section fed by their shared calendar: the next shared commitment, anything of theirs colliding with their, and joint decisions still open ("flights for December — neither of you has booked"), with plans made by voice becoming joint loops; silent when nothing is joint.
A trip object with participants and budget owning a flight/stay price watch, a per-person status board, and a thread watcher that parses "I booked" and "I can't make it" into status changes, plus one-tap nudges to whoever's silent; turns group-chat archaeology into "four in, Marco silent since the 3rd, flights up €40".