Transport bookings on trips without calendar dates (relative "Day N" mode)
stored a malformed "T10:00" string in reservation_time. Every display
surface used includes('T') + new Date() which yielded Invalid Date.
Add splitReservationDateTime() helper that classifies any reservation_time
shape (full datetime, date-only, bare HH:MM, or legacy "T10:00") into
{ date, time } parts. Fix TransportModal to store a clean bare HH:MM
instead of "T10:00" and update the read-back path. Route all display
surfaces (ReservationsPanel, DayDetailPanel, DayPlanSidebar,
PlaceInspector, SharedTripPage, TripPDF) through the helper, gating the
DATE column on a real calendar date and the TIME column on a time part.
Guard the ICS export to skip time-only reservation_time values instead of
emitting a malformed DTSTART. Backward-compatible: existing saved rows
with "T10:00" render correctly without a data migration.
Date-only strings parsed with new Date(dateStr + 'T00:00:00') were
interpreted relative to the local timezone, causing off-by-one day
display for users west of UTC. Fixed across 16 files by parsing as
UTC ('T00:00:00Z') and displaying with timeZone: 'UTC'.
Add UI controls for configuring auto-backup schedule with hour, day of
week, and day of month pickers. The hour picker respects the user's
12h/24h time format preference from settings.
Add TZ environment variable support via docker-compose so the container
runs in the configured timezone. The timezone is passed to node-cron for
accurate scheduling and exposed via the API so the UI displays it.
Fix SQLite UTC timestamp handling by appending Z suffix to all timestamps
sent to the client, ensuring proper timezone conversion in the browser.
Made-with: Cursor