mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-08 12:32:43 +00:00
Extend the dashboard's RSC server-prefetch pattern to three more route roots so their above-the-fold content paints populated on first load instead of flashing a shell that fills in on mount. Each route gains a thin RSC wrapper that runs the same cached read its API route uses, dehydrates the result under the exact client query key, and hands it to the client leaf through a HydrationBoundary. Every wrapper fails soft to today's client-fetch path on any error and honours the DASHBOARD_SSR_PREFETCH kill-switch the e2e server sets. - /insights: prefetch the dashboard snapshot — the same locale-keyed cell the dashboard warms, resolved once server-side so the key matches by construction. The AI briefing and the heavy analytics aggregations stay client-lazy (the briefing must never trigger generation; a cold analytics read would trade FCP for TTFB). - /medications: prefetch the medications list through the shared caches.medications cell (extracted to src/lib/medications/list-read.ts). The list cell keeps refetchOnMount: "always" — a cross-device take/skip produces no client mutation event, so the mount refetch is a correctness gate; the prefetch removes the initial skeleton flash without dropping that guarantee. - /coach: prefetch the nudge status (extracted to src/lib/ai/coach/nudge-status.ts) so the auto-open-most-recent decision is ready at hydrate, collapsing the one sequential waterfall. Only runs when the Coach surface is reachable; the streaming conversation is never warmed. Add per-route tests pinning server-key === client-key, JSON wire-shape round-trip, and the fail-soft / module-gate paths. Repoint the source-reading insights, take-all-due, and Coach gate-cascade tests at the client leaves.
src/lib/
The server and runtime toolkit. Everything that is not a page, component, or route handler lives here: the API kit, auth, crypto, the rollup tier, AI providers, notifications, background jobs, and the integration clients. Route handlers and RSC pages compose these modules; the modules never reach back into app/.
Core request kit
api-handler.ts— theapiHandlerwrapper every route uses. Auth resolver (cookie OR Bearer),requireAuth/requireAdmin(admin is cookie-only by construction), idempotency plumbing, Wide-Event builder, GlitchTip forwarder.api-response.ts— the{ data, error, meta? }envelope:apiSuccess/apiError,safeJson, trusted-proxy IP resolver,returnAllZodIssues+sanitiseZodIssues.rate-limit.ts— Postgres-backed sliding-window limiter (single atomic upsert); multi-instance correct.idempotency.ts— user-scoped idempotency keys that refuse to cache secret-shaped responses.query-keys/— the only legal source of TanStack QueryqueryKey/mutationKeyarrays (enforced by an ESLint rule); per-feature files behind theindex.tsbarrel.safe-fetch.ts— the one documented outbound-egress entry (redirect: "manual"+ timeout; optional connect-time DNS-rebinding pin). Rawfetch(underlib/+app/is banned by ESLint.db.ts— the Prisma client singleton.crypto.ts— AES-256-GCM at rest with versioned key ids, fail-closed loader, rotation primitives.
Subsystems
auth/— Postgres sessions, secure-cookie flag policy, passkey (WebAuthn) + Argon2id password, per-device refresh-token rotation, HMAC Bearer tokens.ai/— multi-provider insight + Coach engine:provider-chain.ts, hand-rolled{openai,anthropic,local,codex,mock}-client.ts,coach/,prompts/, citation + confidence helpers.rollups/— DAY/WEEK/MONTH/YEAR pre-aggregations for measurements, mood, and medication compliance. Read-swap pattern: probe the rollup, fall back to live SQL on a coverage miss.notifications/— the dispatcher cascade (APNs → Telegram → ntfy → Web Push), per-channelsenders/, retry policy, VAPID config.jobs/— pg-boss workers: reminders, insight pre-generation, backups, retention sweeps, integration backfills. Recurring work belongs here, not inscripts/.integrations/,withings/,whoop/,fitbit/— OAuth clients and sync services for the device providers;sync/holds the shared delta-feed plumbing.analytics/— trend calculations, cadence-aware medicationcompliance.ts, correlations.insights/,fhir/,doctor-report-*.ts— insight pipeline, FHIR R4 export, client-side doctor-report PDF.openapi/— Zod registry that is the source of truth fordocs/api/openapi.yaml.logging/,observability/,monitoring/— Wide-Event transports and the central redaction denylists (redact at the egress boundary, not the call site).validations/— shared Zod schemas, including the SSRFisPublicUrlfloor.i18n/,tz/+timezone.ts,format*.ts— translations, timezone helpers (Berlin for display, UTC in DB), locale formatting.
Conventions
Kebab-case filenames. See ../../CLAUDE.md "Code conventions" and "Security-relevant patterns"; the critical-files map there cites the exact entry points. Most modules carry tests in a sibling __tests__/.