Push could only reach one mobile device per user (a token file), quiet hours did not exist, and the web app had no service worker, so a closed tab never heard about finished work. This lands the shared interfaces first so onboarding can build on them: - push_subscriptions (web push endpoints and Expo tokens, one row per device) and user_notification_settings (quiet hours as minutes in the profile time zone, nudges, a per-day nudge counter), with CHECK constraints. - NotificationSettingsSchema and web push contracts, notifications.settings.get/update and notifications.webPush.config/subscribe/unsubscribe (owner-scoped, https endpoints only). - getNotificationSettings/updateNotificationSettings plus the policy and nudge-cap helpers. - VAPID keys from VAPID_PUBLIC_KEY/VAPID_PRIVATE_KEY or generated once and stored encrypted, and an SSRF-guarded web push sender built on the web-push package. - The web app links its manifest, registers a push-only service worker where supported (secure context, not the desktop app) and exposes webPushSupported/webPushEnabled/enableWebPush/ disableWebPush. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MRtGG9ARfqqhma3t85Ro2u
14 lines
372 B
JSON
14 lines
372 B
JSON
{
|
|
"name": "evOo",
|
|
"short_name": "evOo",
|
|
"description": "Deine Oos — immer da, immer wach.",
|
|
"start_url": "/",
|
|
"display": "standalone",
|
|
"background_color": "#0f1218",
|
|
"theme_color": "#0f1218",
|
|
"icons": [
|
|
{ "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
|
|
{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }
|
|
]
|
|
}
|