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>
- Email verification: 6-digit code + one-click link on signup
- SMTP integration with nodemailer (lazy-init, auto-detect TLS)
- Verify-email page with 6 input boxes, paste support, auto-submit
- Resend verification with 60s rate limiting
- Block login for unverified email accounts
- Auto-save settings: debounced 800ms save on all profile changes
- Redirect to calendar settings after OAuth connection
- Fix Google Calendar connection display after connecting
- Task actions hover toolbar: fix z-index/overflow clipping on first row
- Make day header sticky with proper stacking context
- Fix Docker build: resolve hooks-rules-of-hooks in GridTaskBlock, add Suspense
boundary for useSearchParams, fix non-root user home dir and prisma binary path
- Add comprehensive DB migrations for missing columns/tables (WeeklyGoal,
CachedCalendarEvent, User settings, SomedayList sync fields, Task subtasks)
- Fix Outlook OAuth redirect using NEXTAUTH_URL instead of request.url
- Fix CalendarEventModal preserving existing event dates (support flat format)
- Fix header z-index layering so goal text doesn't block hover controls
- Convert font size selects to free-form text inputs, add dayHeaderGap setting
- Add goal 2-line clamping with 500px max width
- Fix weekend colors not applying to date elements
v1.6.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>
Undo/Redo:
- Add undo/redo stacks tracking task and someday list state snapshots
- Undo/redo buttons appear on hover in header center section
- Keyboard shortcuts: Ctrl+Z (undo), Ctrl+Y / Ctrl+Shift+Z (redo)
- Snapshots taken before addTask, toggleTask, updateTask, deleteTask, toggleTaskRolling
Outlook OAuth fix:
- Redirect through /auth/oauth-complete client-side page instead of directly to /tasks
- Client page calls session.update() to refresh JWT before navigating
- Prevents session loss caused by SameSite cookie policy during cross-origin redirect
Microsoft To-Do import fix:
- Set externalId and externalProvider on SomedayList during import
- Link existing lists missing external metadata on re-import
- Enables pull-sync to find and update tasks in subsequent syncs
v1.2.0
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>
- Replace broken CloudKit/pyicloud Apple Reminders integration with
CalDAV-based approach (getAppleReminderLists, fetchTasks from
apple-calendar.ts) in tasks/lists, tasks/import, and tasks/sync routes
- Restore calendar date picker icon in header for jump-to-date navigation
- Add goalScope field to User model with migration
- Force-dynamic Google OAuth routes to fix redirect issues
- Update Google Tasks client and sync logic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix Google OAuth callback to redirect using NEXTAUTH_URL (prevents session loss behind reverse proxy)
- Create/update Account record during Google OAuth callback so Google Tasks API has access tokens
- Remove legacy CalDAV fallback from Apple Reminders - only use CloudKit (iOS 13+ Reminders app)
- Add debug command to icloud-reminders.py for diagnosing CloudKit connectivity
- Improve profile save error messages to show details
- Add better error logging throughout CloudKit reminders flow
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Save edited quotes as weekly goals on blur (header + settings panel)
- Fresh quote shown when navigating between weeks (no stale cache)
- Add goal font family, size, and weight settings with UI controls
- Lower calendar event z-index so tasks are always draggable on top
- Set line-height: initial on task items for consistent rendering
- Fix Google Tasks auth scope from tasks.readonly to tasks (read/write)
- Add Google Tasks update/delete functions for bidirectional sync
- Sync task renames and deletes back to Google Tasks
- Add goal font fields to Prisma schema and profile API
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>