- Dynamic start/end hours computed from actual events (+1h padding each
side) instead of hard-coded 5 AM–11 PM; falls back to 7 AM–10 PM
when no events are scheduled
- Lane algorithm (greedy interval scheduling) prevents overlapping events
from hiding each other; routines and med groups share the same lane
pool so conflicts split the column width side by side
- Outer container locked to h-screen overflow-hidden to eliminate the
page-level scrollbar; timeline inner scrollbar hidden via
[&::-webkit-scrollbar]:hidden + scrollbarWidth:none
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replaces the flat routine card list with a day-oriented timeline showing
scheduled routines at their time slots, with week strip navigation and
a live "now" indicator. Adds bulk schedules API endpoint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add all 14 missing database tables (medications, med_logs, routines, etc.)
- Rewrite medication scheduling: support specific days, every N days, as-needed (PRN)
- Fix taken_times matching: match by created_at date, not scheduled_time string
- Fix adherence calculation: taken / expected doses, not taken / (taken + skipped)
- Add formatSchedule() helper for readable display
- Update client types and API layer
- Rename brilli-ins-client → synculous-client
- Make client PWA: add manifest, service worker, icons
- Bind dev server to 0.0.0.0 for network access
- Fix SVG icon bugs in Icons.tsx
- Add .dockerignore for client npm caching
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>