# Phase 5: Web Push Notifications - Discussion Log > **Audit trail only.** Do not use as input to planning, research, or execution agents. > Decisions are captured in CONTEXT.md — this log preserves the alternatives considered. **Date:** 2026-06-09 **Phase:** 5-web-push-notifications **Areas discussed:** Copy & anti-spam, Reminder scope & timing, Onboarding & opt-out --- ## Area selection | Option | Description | Selected | |--------|-------------|----------| | Copy & anti-spam | Wording per type + coalescing | ✓ | | Reminder scope & timing | Whose events, fixed/custom lead, all-day | ✓ | | Quiet hours / DND | Suppress non-urgent in a quiet window | | | Onboarding & opt-out | When to prompt, toggle granularity | ✓ | **Notes:** Quiet hours/DND left to Claude's discretion (v1 = no quiet hours). --- ## Copy & anti-spam ### List-change batching | Option | Description | Selected | |--------|-------------|----------| | Coalesce per list | Batch same-list changes in ~30–60s into one push | ✓ | | Coalesce + skip check-offs | Same, but check-offs never push | | | One push per change | Immediate, no batching | | ### Detail level | Option | Description | Selected | |--------|-------------|----------| | Specific details | Full specifics for everything | | | Specific events, generic lists | Events show detail; list pings generic | ✓ | | Generic only | Everything generic | | ### Attribution | Option | Description | Selected | |--------|-------------|----------| | Name the actor | "Wife checked off…" | ✓ | | No name | "Milk checked off…" | | ### Event-change granularity | Option | Description | Selected | |--------|-------------|----------| | Meaningful changes only | new/delete/time/date/title/location; description silent | ✓ | | Time/date only | only reschedules + add/delete | | | Any change | including description edits | | **User's choice:** Coalesce per list; specific-for-events/generic-for-lists; name the actor; meaningful changes only. **Notes:** Generic-list + name-actor reconciled as "Wife made 3 changes to Groceries" (actor + list + count, no item text). --- ## Reminder scope & timing ### Whose events remind | Option | Description | Selected | |--------|-------------|----------| | Own + shared | Own personal + shared Family | | | Everything visible | Incl. partner's personal events | | | Shared only | Shared Family calendar only | ✓ | ### Lead time | Option | Description | Selected | |--------|-------------|----------| | Fixed 15 min (v1) | Always ~15 min | ✓ | | User default, changeable | One global offset | | | Per-event lead time | Per-event offset field | | ### All-day events | Option | Description | Selected | |--------|-------------|----------| | Morning-of | Fixed AM time | | | No reminder | Never push | ✓ | | Evening before | ~6pm prior day | | **User's choice:** Shared-only; fixed 15 min; no all-day reminder. **Notes (load-bearing rationale, free-text):** "the native mail client on the device will still send notifications. we dont want to duplicate that." Personal-calendar reminders are already covered by each member's native device calendar app; FamilySync owns reminders for the shared Family calendar only. Confirmed deliberately after a challenge that this narrows NOTIF-01. --- ## Onboarding & opt-out ### Permission prompt timing | Option | Description | Selected | |--------|-------------|----------| | Contextual, after install | Explainer + tap right after install | ✓ | | On first relevant action | After first event create | | | Settings toggle only | No auto-prompt | | ### Opt-out granularity | Option | Description | Selected | |--------|-------------|----------| | Single master toggle | One on/off | ✓ | | Per-category toggles | reminders/event/list switches | | | Master + categories | Both | | ### Dead-subscription recovery | Option | Description | Selected | |--------|-------------|----------| | Silent auto re-subscribe | Background re-subscribe if permission granted | ✓ | | Silent, then banner fallback | Banner if silent fails | | | Always prompt | Banner on every death | | **User's choice:** Contextual after-install prompt; single master toggle; silent auto re-subscribe. --- ## Claude's Discretion - No quiet-hours / DND in v1 (reminders/alerts always fire). - Tap-to-open deep-link targets (reminder/event-change → event; list-change → `/lists/:id`). - Service-worker strategy (generateSW vs injectManifest for push handler). - VAPID key generation/storage, push-subscription table schema, reminder-scheduler mechanism, coalescing debounce, event-change detection source (poller vs outbox). ## Deferred Ideas - Quiet hours / DND — v1.x - Per-event / custom reminder lead time — v1.x - Per-category opt-out — v1.x - Reminders for personal-calendar events — intentionally excluded (native clients cover these) - Notifying on own changes — out of scope **Reviewed todos (not folded):** drizzle generate+migrate (false-positive "push" match, but schema constraint noted); new-project kickoff (stale).