Change cron schedule from 4x daily (0,6,12,18 UTC) to 8x daily
(every 3 hours) to keep body battery and other Garmin data fresher.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add 15-minute notification granularity (*/15 cron) so users get emails
at their configured time instead of rounding to the nearest hour
- Add DailyLog fallback to most recent when today's log doesn't exist,
preventing 100/100/Unknown default values before morning sync
- Show "Last synced" indicator when displaying stale data
- Change Garmin sync to 6-hour intervals (0,6,12,18 UTC) to ensure
data is available before European morning notifications
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sync at 08:00, 14:00, and 22:00 UTC instead of every hour.
Garmin data updates once daily so hourly was excessive.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace resend package with mailgun.js and form-data
- Update email.ts to use Mailgun API with lazy client initialization
- Add instrumentation.ts to schedule cron jobs (notifications :00, Garmin :30)
- Update tests for Mailgun mock structure
- Update .env.example with MAILGUN_API_KEY and MAILGUN_DOMAIN
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>