3.0 KiB
Phase 18: Auto timezone detection and ability to change timezone - 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-14 Phase: 18-auto-timezone-detection-and-ability-to-change-timezone Areas discussed: Timezone scope, Detection & drift, Where to change it, Behavioral boundary
Timezone scope
| Option | Description | Selected |
|---|---|---|
| Single household tz | One value in app_config; matches existing implicit single-TZ model and the 2-person same-household reality | ✓ |
| Per-member timezone | users.timezone column; per-member 9 AM reminders; needs migration + per-row scheduler logic |
User's choice: Single household tz (app_config) Notes: Two-person same household — single value is the simplest correct model.
Detection & drift
| Option | Description | Selected |
|---|---|---|
| Seed on setup, manual after | Auto-detect during Phase 12 wizard/first run to seed; thereafter changes only via settings UI, no auto-overwrite | ✓ |
| Detect every login, prompt on drift | Compare browser tz to stored on each login; prompt to update when different | |
| Detect every login, silent update | Always overwrite stored tz with the browser's |
User's choice: Seed on setup, manual after Notes: Avoids travel/VPN silently shifting the "fires at 9 AM" guarantee.
Where to change it
| Option | Description | Selected |
|---|---|---|
| Admin Settings + wizard | Role-gated /admin Settings (Phase 10) + seeded by the Phase 12 setup wizard | ✓ |
| Any member, general settings | Non-admin settings area; fits per-member scope better |
User's choice: Admin Settings + wizard Notes: Single household-wide setting behind requireAdmin is the correct fit.
Behavioral boundary
| Option | Description | Selected |
|---|---|---|
| All-day reminder tz only | Stored tz is source of truth for server-side all-day 9 AM computation, overriding process.env.TZ; display + timed serialization stay browser-local | ✓ |
| Also override display / timed logic | Stored tz also drives display rendering and/or timed reminders |
User's choice: All-day reminder tz only Notes: Keeps blast radius small; protects the already-correct browser-local write/display path.
Claude's Discretion
- Timezone picker UX (recorded default: searchable IANA dropdown; validate IANA before storing).
- Exact app_config key name + read/cache strategy for the stored value in scheduler/outbox.
- Optional non-blocking "detected zone differs" login notice (allowed, not required).
Deferred Ideas
- Per-member timezones — only relevant if members live in different zones; own phase if ever true.
- Driving display/timed reminders off the stored tz — deliberately excluded to protect the browser-local path.