This repository has no description

feat: add Web Push notifications alongside Firebase master

Add Web Push (VAPID + Push API) as a second notification transport, so web users get the same livestream/beta-invite pushes mobile users get. Backend: - Add Type column to the notifications table ("firebase"/"web", defaults to "firebase" for backward compat). CreateNotification now takes a notifType; GetManyNotifications returns full rows with type info; DeleteNotification prunes a subscription on opt-out. - Introduce a unified Notifier interface taking []NotificationTarget (token + type) instead of []string. FirebaseNotifier filters to firebase targets; new WebPushNotifier (SherClockHolmes/webpush-go) handles web targets, fanning out in parallel and surfacing 410 Gone as ExpiredSubscriptionError so dead subscriptions can be pruned. - MultiNotifier wraps both transports and fans each target to the correct one — the single Notifier the rest of the codebase holds. - VAPID keys auto-generate on first run and persist in the Config table via EnsureVAPIDKeys, following the EnsureJWK pattern. No env vars required; keys survive restarts so subscriptions stay valid. - New API endpoints: DELETE /api/notification (prune on opt-out) and GET /api/notification/vapid-public-key (hand the public key to the browser). POST /api/notification now accepts a type field. - Both blast call sites (livestream-goes-live, beta invite) updated to load typed targets and blast through the unified notifier. Frontend: - Implement the web platformSlice (was a stub): initPushNotifications registers a service worker; enableWebNotifications requests permission, fetches the VAPID key, subscribes via PushManager, and registers the subscription; disableWebNotifications unsubscribes + prunes the server row. - Add public/sw.js service worker handling push events (show notification) and notificationclick (focus/navigate to the stream). - Add a Notifications settings screen with a toggle that works on both web (subscribe/unsubscribe) and mobile (reflects OS permission state). Wired into the settings navigator, linking config, and nav types. Translations added for all 7 locales. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>