- Skip optimistic UI update for new recurring events (causes duplicate
when force-sync fetches expanded instances with different IDs)
- Mobile sticky day bar: listen on gridRef scroll instead of window
(time-grid scrolls inside weekly-days-grid, not window)
- Remove broken position:sticky from mobile day headers (CSS sticky
doesn't work inside CSS grid scroll containers); use fixed overlay only
- Also propagate isRecurring flag in create response for Google/Outlook
v1.75.8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Apple sync was doing 2 logins per cycle: getAppleCalendars (to get calendar
list for filtering) + getUpcomingEventsBatch (to fetch events). Now uses
stored calendar metadata from DB for filtering, reducing to 1 login total.
Same optimization applied to Synology. Also adds 24:00 end-of-day line
to time grid, and throttles tab-focus sync to max once per 5 minutes.
v1.75.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Apple/Synology: batch fetch events with single client login instead of N separate connections
- Apple: add client cache (5min TTL) to reuse authenticated DAVClient across operations
- Apple: add retry with backoff for transient ConnectTimeoutError/SSL failures
- Increase cache stale threshold from 2min to 15min
- Increase background sync interval from 2min to 15min
- Throttle tab-focus sync to at most once per 5min
v1.75.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Log the event ID decomposition, update payload, and Graph API
response status to diagnose why recurring event updates aren't
persisting for Outlook.
v1.74.8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Drag on empty time slots to create calendar events with pre-filled time range
- Rolling tasks now work per-task without requiring global autoRolling setting
- Add firstDayOfWeek to Outlook weekly recurrence patterns
- Add debug logging for Outlook recurrence creation
v1.72.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Strip HTML tags from descriptions before sending to CalDAV providers (Apple/Synology)
- Show event location underneath time in calendar event blocks (like Google Calendar)
- Fix German umlaut rendering by adding latin-ext font subset
- Fix CalDAV event updates losing TZID on DTSTART/DTEND (Apple Calendar recurring edit fix)
- Add error logging for CalDAV PUT responses
- Reduce wasted space when all-day events section is collapsed (24px max)
- Fix quotes with missing umlauts (ä, ö, ü, ß)
v1.71.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Google: add timeZone to start/end objects when recurrence is present
(fixes "Missing time zone definition for start time" error)
- Outlook: pass user timezone instead of UTC for event create/update,
convert UTC dateTime to local representation (fixes +1h DST shift
on recurring instances)
- Outlook: use instance ID for single-occurrence delete instead of
series master ID (fixes ErrorItemNotFound on delete)
v1.63.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a fourth delete option for recurring events: delete this instance
and all past occurrences. For CalDAV (Apple/Synology), this moves
DTSTART forward to the next occurrence. Includes optimistic UI removal.
v1.63.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Outlook returns dateTime without Z suffix despite timeZone being UTC,
causing JS to parse as local time (1h shift). Now appends Z for UTC dates.
- Added frontend deduplication to prevent stacked rendering of duplicate events.
- Added Outlook event debug logging for recurring event investigation.
v1.62.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Google and Outlook event mappings were missing isRecurring and
recurringEventId fields, so the modal never showed recurring delete
options and displayed recurring events as "Repeat: Never".
v1.62.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When deleting a recurring calendar event, users now choose between
deleting just this instance, this and future instances, or all instances.
Supports Google, Apple (iCloud), and Synology CalDAV providers.
v1.62.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use TZID-based local time (instead of UTC 'Z') for DTSTART/DTEND
when creating recurring CalDAV events, preventing DST-related time
shifts (e.g. 13:40 CET showing as 14:40 CEST after clock change)
- Send browser timezone from CalendarEventModal to server
- Guard against NaN event duration (missing/invalid endTime) which
caused event blocks to stretch to end of day
v1.61.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Store calendar colors (backgroundColor) from Apple and Synology
during connection setup
- Auto-refresh missing colors for existing Apple/Synology connections
- Show color dots next to calendar names in settings
- Add "Custom..." recurrence option with interval (every N days/weeks/
months/years) and day-of-week selection for weekly recurrence
- Generate proper RRULE with INTERVAL and BYDAY for all providers
- Generate proper Outlook Graph recurrence with custom intervals
v1.61.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fetch and display Outlook calendar colors from Microsoft Graph API
instead of hardcoded blue
- Add recurrence end options to calendar event modal: Never, On Date
(UNTIL), or After X occurrences (COUNT)
- Pass recurrence end parameters through to RRULE generation for all
providers (Google, Apple, Synology, Outlook)
v1.60.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Apple calendar events were fetched from ALL calendars regardless of the
user's Display checkbox selection. Now respects the stored selected state,
matching the behavior of Synology/Google/Outlook providers.
Also reverts the title-based deduplication which was too aggressive.
v1.57.7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a Synology calendar returns 404 during event fetch, remove it from
the stored calendar list instead of silently returning empty results.
v1.57.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Notion OAuth integration: start/callback routes, calendar-events dispatch,
CRUD operations (create/update/delete via Notion API)
- New notion-calendar.ts provider library with database discovery
- Onboarding wizard: expanded to 6 steps (header/tasks/display design),
improved preview fidelity, universal dummy content, Notion in connect step
- Apple Calendar: label changed to "events only", added warning that
Reminders are unsupported since iOS 13 (no CalDAV/API from Apple)
- Fixed 12h time format on now-line, wizard settings apply on completion
v1.57.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When fetching events, refresh the calendar list from the Synology
server and remove any stored calendars that no longer exist. This
stops repeated "Calendar unavailable" errors from deleted calendars.
v1.37.3
Support extended calendar event properties across all providers:
- Alerts/Reminders: VALARM for CalDAV, reminders API for Google, reminderMinutes for Outlook
- Invitees/Attendees: ATTENDEE for CalDAV, attendees API for Google/Outlook
- Attachments: ATTACH (URL-based) for CalDAV (Apple/Synology)
- Busy Status: TRANSP for CalDAV, transparency for Google, showAs for Outlook
- Visibility: CLASS for CalDAV, visibility for Google, sensitivity for Outlook
Updated CalendarEventModal with new UI fields including expandable
Invitees & Attachments section and reminder/status/visibility dropdowns.
v1.36.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mobile fixes:
- Add viewport meta tag (was missing, causing broken mobile rendering)
- Make header nav controls visible on mobile (opacity-0 group-hover was invisible on touch)
- Add touch swipe gestures for day navigation on mobile
- Fix viewDays responsive override after profile load
Bug fixes:
- Fix goal save (WeeklyView used POST but route only had GET/PUT; fix to use PUT, add POST alias)
- Fix body key mismatch (goal → text) in goal save request
Auth & identity (Task 1):
- Add accountNumber (auto-increment) to User model for stable identity
- Fix OAuth flows: pass user CUID in state instead of email
- Google/Outlook callbacks now look up users by ID, not email
- Non-Gmail users can now connect Google Calendar/Tasks
CalDAV performance (Task 5):
- Embed CalDAV object URL in Apple event IDs (caldav::<url>::<uid> format)
- Delete/update now use O(1) direct URL access instead of O(n) full calendar scan
- Optimistic UI removal on delete (no blocking force-refresh)
- Legacy fallback for old-format IDs during transition
Apple Calendar data (Task 2):
- Pass URL, location, recurringEventId, isRecurring through full pipeline
- Add url, recurringEventId, isRecurring to CachedCalendarEvent schema
- Calendar cache now reads/writes all new fields
Projects (Task 6):
- New Project model (name, icon, color, description, order)
- CRUD API at /api/tasks/projects
- Tasks now support optional projectId with cascading nullify
Quotes (Task 4):
- Curated local quote database (50 quotes, DE+EN) with tag filtering
- Preset quote source APIs (ZenQuotes, Quotable, Forismatic, Type.fit)
Fonts (Task 7):
- FontPicker component with searchable dropdown and live preview
- /api/fonts endpoint (Google Fonts API proxy with 24h cache, fallback to 40 popular fonts)
Quick Settings (Task 8):
- QuickSettingsSidebar component (font size, spacing, show completed, start day, show lines)
- New user preferences: showCompletedTasks, showLines, startDayOffset, quoteSourceUrls
v1.9.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix All Day checkbox positioning in CalendarEventModal (own row)
- Add provider name to calendar dropdown (Google/Apple/Outlook)
- Optimistic UI updates after event save/delete (no reload needed)
- Force-refresh calendar cache after event mutations
- Reduce background sync interval from 5min to 2min
- Support forceRefresh in background-sync API
- Use shared Prisma singleton in tasks sync route
- Add per-provider task list fetching and sync checkboxes
- Add allDay support to event creation and editing
v1.4.0
- Apple calendar parser now checks ICAL.js isDate flag and emits
date-only strings (YYYY-MM-DD) for all-day events instead of
full ISO datetime — fixes all-day detection in the frontend
- Calendar events mapper routes date-only Apple events to the
date field instead of always using dateTime
- Manual refresh button now sends forceRefresh=true which makes
the sync endpoint wait for live data instead of returning stale cache
- Automatic background syncs still use fire-and-forget for performance
v1.2.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds full OAuth2 flow, bidirectional task sync, calendar event CRUD,
caching with background refresh, and shared token management for
Microsoft/Outlook services. Extracts common token refresh logic into
shared outlook-token.ts utility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add soft-delete support for tasks with deletedAt field and migration.
Remove Apple Reminders iCloud integration entirely (API routes, lib,
UI modal, and Python script) in favor of CalDAV approach. Add periodic
pull-sync from Google Tasks every 2 minutes with deletion detection.
Fix orphaned someday task rescue and cross-list task toggle/edit.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Google Tasks integration and Apple Reminders support
- Add task import/export with list management APIs
- Add goal API for weekly goals
- Add German holidays library
- Add ImportListModal component
- Enhance WeeklyView with major UI improvements
- Enhance CalendarSettings with new connection options
- Add external task fields to database schema
- Add Playwright test suites for auth and tasks
- Add iCloud reminders Python scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>