@serwist/next, @serwist/sw, serwist, workbox-* | None — PWA removed |
web-push package, VAPID_* env vars | None — Web Push removed |
navigator.serviceWorker, sw.register(), public/sw.js, public/manifest.json | None |
src/lib/offline-notes.ts, storePendingNote, getPendingNotes, removePendingNote, PendingNote | None — IndexedDB queue removed |
/api/notes/sync endpoint | None — only /api/notes/stream (SSE) exists in notes/api/ |
push:subscription:{author} Redis key | push:fcm:{author} only |
prisma, @prisma/client, SQL migrations | Upstash Redis is the sole datastore; /src/generated/prisma is a stale gitignore entry |
| Light-mode Tailwind variants | Dark theme is forced via forcedTheme="dark" |
tailwind.config.ts / tailwind.config.js | Tailwind v4 is CSS-first; tokens live in src/app/globals.css |
pages/ directory, getServerSideProps, getStaticProps | App Router only |
VoiceNote type, voiceNote field, MediaRecorder + RECORD_AUDIO permission for /permissions | None — voice notes prototyped on permissions and explicitly removed |
Telegram bot, Telegram fallback push, TELEGRAM_BOT_TOKEN / TELEGRAM_*_CHAT_ID env vars, WhatsApp / Signal / any third-party messenger as a notification channel | None — FCM is the sole sanctioned push transport (§ 3.2). Out-of-band messenger fallbacks were considered and explicitly banned |
TZ primitives in @/lib/rituals (dateKeyInTz, todayKeyCairo, tzWallClockToUtcMs, previousDateKey, nextDateKey, weekdayOfDateKey) | @/lib/cairo-time — the migration relocated all TZ math; importing from rituals will fail |
Inline todayInCairo(), secondsUntilMidnight(), or per-callsite Intl.DateTimeFormat date-key helpers | @/lib/cairo-time exports the canonical versions — never reinvent |
Standalone routes /admin/inspector, /admin/sessions, /admin/cooldowns, /admin/time, /admin/timezone, /admin/activity, /admin/notifications, /admin/restraint-history, /admin/auth-log | /admin/devices (Right now + Sessions sections) for inspector + sessions; /admin/health (Cooldowns + Time tabs; Time tab also hosts the Cairo↔Tabuk converter) for the three time/cooldown routes; /admin/logs (Activity / Outbound / Restraint / Auth failures tabs) for the four append-only log routes |
currentReviewWeekDate for rewards bucketing | currentWeekKey in @/lib/obedience (containing-week semantic, NOT just-completed) |
beforeSend with stack-frame string check (fetchServerAction / server-action-reducer) | ignoreErrors in Sentry.init — message-based, invariant under Turbopack minification |
void pingDevice(...) (or any void asyncCall()) for unhandled-rejection-safe fetch | someAsync(...).catch(() => {}) — void discards the return value but does NOT catch rejections |