Uses the existing bot token to send DMs to users by their Discord user ID
instead of posting to a channel webhook.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Issue #4 — Skip not clearing med
File: synculous-client/src/app/dashboard/medications/page.tsx Root cause: Skipped medications were routed to the "Upcoming" section (status === 'skipped' in the
upcoming condition), so they appeared as if still pending.
Fix: Removed || status === 'skipped' from the grouping condition. Now skipped meds go to the "Due"
section where they properly render with the "Skipped" label — same pattern as taken meds showing
"Taken".
Issue #5 — "Invested -359m in yourself"
Files: api/routes/routines.py, synculous-client/src/app/dashboard/page.tsx,
synculous-client/src/app/dashboard/stats/page.tsx
Root cause: Session duration was calculated by comparing a naive UTC created_at from PostgreSQL with
the user's local time (after stripping timezone). For users behind UTC (e.g., CST/UTC-6), this
produced negative durations (~-359 minutes ≈ -6 hours offset).
Fix: Added _make_aware_utc() helper that treats naive datetimes as UTC before comparison. Also clamped
durations to max(0, ...) on both backend and frontend formatTime as a safety net.
Issue #6 — Push notifications not working
File: api/routes/notifications.py
Root cause: Subscribing to push notifications created a push_subscriptions row but never set
web_push_enabled: true in the notifications table. The scheduler daemon checks web_push_enabled before
sending, so push notifications were always skipped.
Fix: When subscribing, also call notifications.setNotificationSettings() to enable web_push_enabled.
When unsubscribing (and no subscriptions remain), disable it.