Notifications are a contract. Every one you ship is the user agreeing, in advance, to be interrupted by you. The cost of a missed interruption is small. The cost of a wrongly-timed one — repeated, weekly — is your tab being closed for good.
The three surfaces
There are three things Vist will, by default, notify you about — picked deliberately small, because the budget for "things this app is allowed to ping me about" should not start anywhere near maximum.
- Daily digest — one email, once a day, at a time you choose. Today's tasks, anything new on tasks you own, a one-line summary of the day's calendar if you've connected Google Calendar.
- Per-task reminders — opt-in per task. "Remind me 30 minutes before this is due." Or one hour, one day, one week. Sensible defaults; tweakable per task.
- Real-time push — browser-native, Web Push API. Used sparingly: a reminder firing, a task someone else completed in a shared workspace, a sync conflict we couldn't auto-resolve. Off by default outside your own account.
Why daily digests came first
Email is a low-cost, high-trust channel. Users don't need to grant permissions; they don't need a tab open; they don't need a service worker to behave. Shipping the digest first let us learn what people actually wanted to see — without the cost of getting the loud channels wrong.
The scheduling is per-user-timezone: not all digests at 08:00 UTC — each one fires when that user's clock reads their chosen time.
Per-task reminders
The data model is the trickiest piece of the three. A task has zero or more reminders. A reminder is a one-shot: it fires at a computed fire_at time, derived from the task's due date plus an offset (-30m, -1h, -1d, -1w). When the task's due date moves, all its reminders move with it. When the task completes, pending reminders cancel.
Each reminder is a scheduled background job, created at save time and cancellable on update. Cancellation was the thing we got wrong first — early versions checked "should I fire?" at execution time, which meant a reminder for a task that had moved three weeks would still fire on the old schedule, silently. The fix was to cancel the job explicitly when the due date changes, rather than letting the job decide for itself.
Real-time push, sparingly
Web Push requires service-worker registration, a VAPID key pair, and explicit user consent. The friction is, deliberately, high. We treat it as the channel for things you actively asked to be notified about right now — primarily the firing of a per-task reminder you set yourself.
The push payload is intentionally thin: title, body, deep-link URL. We don't put task content in the payload because push payloads aren't end-to-end-encrypted (the user agent's push service sees them in transit). The deep link opens the task in Vist, where the full content is rendered behind your session.
The "politely" rule
Quiet hours. Each user has a quiet window (default 22:00–07:00 in their local time) during which no push fires. Digests still send — they were scheduled by the user — but reminders queue and fire on the other side of the window.
Don't stack. If two reminders would land in the same five-minute slot for the same user, they collapse into one notification with "+1 more" text. Stacking is the failure mode that turns a useful channel into noise faster than any other.
Single daily reminder by default. When you add a task without an explicit reminder, we don't auto-attach one. The cost of not nagging beats the cost of nagging the user about every task they meant to keep loose.
What we deliberately didn't build
- Slack / Discord / Teams nudges. Tempting; doubles your blast radius. Vist doesn't sync your tasks into another chat tool.
- Per-task email notifications. Two emails a day is two emails a day too many. The digest covers it.
- "Smart" reminder suggestions. A daily digest plus opt-in per-task reminders is enough surface area to learn from. We can revisit the AI angle once we have a year of opt-in data, not before.
What's next
The next iteration is granularity: a per-tag reminder rule ("nag me about anything in the urgent label one hour before due"), and a digest section for "tasks created yesterday but not scheduled" — the quietest failure mode in personal productivity.
But the floor first. Three surfaces, three latencies, one rule. The point of notifications is that they have to be earned, every time you ship one.