Option A — URL field per task:
- New url String? column in Task schema (migration: 20260403_add_task_url)
- Link icon button in GridTaskBlock action bar; click to open inline URL popup
with input, clear (×) button, and open-in-new-tab shortcut
- Blue link indicator shown inline on the task card when a URL is set
- updateTaskUrl() in WeeklyView persists to DB via PATCH /api/tasks
Option B — Rich text notes with inline hyperlinks:
- GridTaskBlock notes popup upgraded from plain markdown textarea to
RichTextEditor (Tiptap), which already has bold/italic/underline/
bullet/blockquote/link toolbar and full link support
- Notes now save on every change via onChange (no blur required)
v1.82.0
Project icons (faHeart, faBriefcase etc.) were rendering as literal text in
GridTaskBlock because the lookup skipped the legacy "faX" → "x" normalization
that ProjectIcon does. Added the same normalization before allIcons.find().
Someday list tabs now survive provider disconnects and reconnects:
- customTabs (empty tabs) saved to viewSettings in DB instead of localStorage only
- assignListToTab saves a title→tab mapping in viewSettings.somedayTabPrefs
- Profile load merges DB customTabs with localStorage for migration
- Import route reads somedayTabPrefs and auto-applies tab when creating/
relinking a SomedayList by title match
v1.81.20
- tasks/route.ts: add per-unit instance cap for virtual task projection
(daily: 60, weekly: 26, monthly: 12, yearly: 3) to prevent unbounded
generation from high-frequency recurring tasks
- WeeklyView: extract calendarEditabilityMap as a separate useMemo keyed
on connections; replace O(n²) nested find() loop with O(1) Map.get()
lookup in the calendarEvents deduplication useMemo
v1.79.0
- tasks/sync GET: batch Google/Outlook/Synology credential fetches with
Promise.all instead of sequential awaits; move per-list Synology
findMany outside the loop to eliminate N+1
- calendar/sync: replace fire-and-forget background refresh with 800ms
Promise.race so fast refreshes return fresh data without blocking
- Extract icon data to iconRegistry.ts; lazy-load IconPicker via
next/dynamic so picker UI code is deferred until needed
v1.78.0
The updatedMin optimization skipped tasks that were missed during
initial sync. Now does a full fetch when a someday list is linked,
ensuring all remote tasks are discovered.
v1.57.13
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a Google Tasks list returns 404 during sync, soft-delete all local
tasks linked to it and unlink the synced someday list instead of spamming
error logs.
v1.57.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add inline task creation in kanban view columns - creates tasks in a
"Kanban" someday list (or project-named list if filtered by project).
Optimize Google Tasks sync: use updatedMin to fetch only changed tasks,
increase sync interval to 5min, handle 429 quota errors gracefully.
v1.54.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds SSE-based push notifications so changes made on one device
appear instantly on all other connected devices for the same user.
- SSE notification hub (src/lib/sse.ts) with per-user client tracking
- Stream endpoint (/api/events/stream) with 30s heartbeat
- Task and list API routes notify connected clients on mutations
- Client auto-connects with 5s reconnect on connection loss
- Existing 2-minute polling sync remains as fallback
v1.53.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add emoji icon picker for projects (40 icons to choose from)
- Redesign project list in settings with color left-border, icon display
- Show project icons on task cards, project picker, and kanban cards
- Add New Project button to desktop header, tablet overflow menu, and mobile FAB
- Remove duplicate unused /api/tasks/projects route
v1.43.0
- Sync tasks to external provider when dragged to a synced Someday list (Google/Outlook/Synology)
- Add Synology support to POST /api/tasks/sync endpoint
- Edit recurring task series (title, interval, unit, time) all at once via new API
- Make Someday and all-day areas vertically resizable with drag handles (height persisted in cookies)
- Include Someday tasks in search results with list name display
- Instant calendar event appearance after creation (improved optimistic update + immediate cache refresh)
- Fix project color not updating on tasks when project color changes
- Add database backup script for Supabase LXC
v1.39.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New "Kanban" view style alongside Simple, Calendar, and List
- Drag tasks between columns to change their stage
- Customizable stages with colors in Settings > View Style
- Stage colors appear as left border indicators on tasks in weekly view
- Default stages: Backlog, To Do, In Progress, Review, Done
- Stages persist in database (User.kanbanStages as JSON)
- Task stage persists in database (Task.kanbanStage)
- Full i18n support (EN, DE, FR, ES, IT)
- Unassigned tasks shown in separate column
v1.28.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add createSynologyTask: new tasks in synced lists push to Synology CalDAV
- Wire Synology create into POST /api/tasks when somedayList is synced
- Fix someday list title input using width:100% instead of flex:1, which
pushed the delete button off-screen making lists undeletable
- Slightly improved provider icon styling
v1.16.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Added updateSynologyTask and deleteSynologyTask functions that modify
VTODOs on the Synology CalDAV server. Wired into the sync PATCH handler
so completing/editing/deleting a Synology-synced task pushes changes back.
Also slightly increased provider icon size for better visibility.
v1.16.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sync query filtered externalProvider for only 'google' and 'outlook',
missing 'synology'. This caused every sync cycle to treat all Synology
tasks as new, creating duplicates each time.
v1.15.10
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tasks created locally in a synced someday list may not have
externalProvider set (if the sync to Google/etc failed). Now when
moving such a task to a weekday slot, the provider is inherited
from the source list and persisted to the DB.
v1.15.7
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move subtask indicator badge outside text span for visibility
- Prevent parent task from hijacking subtask drag events
- Restructure font settings to 2-row layout (font dropdown + size/weight)
- Fix someday horizontal scroll with callback ref wheel handler
- Sync new tasks in Google-linked someday lists to Google Tasks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v1.14.0
- Add touch-friendly task actions (tap-to-reveal toolbar)
- Add swipe gestures (right=complete, left=delete)
- Add compact mobile header with overflow menu
- Add FAB + bottom sheet for quick task creation
- Add mobile date picker as centered modal
- Add touch feedback CSS (scale on press, no sticky hover)
- Fix Google sign-in by adding allowDangerousEmailAccountLinking
- Fix Google Calendar OAuth using separate 'google-calendar' provider
to avoid collision with NextAuth's Account records
- Update all API routes to support both provider names
v1.11.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
New tasks created in synced someday lists are now pushed to Microsoft
To-Do automatically. Added createMsTodoTask() API function, POST
handler on /api/tasks/sync, and frontend wiring to call sync after
local task creation in externally-linked lists.
v1.3.0
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>
- Removed boxed background from grid tasks and added hover-only resize handle
- Fixed vertical drop calculation using correct cell sizes
- Aligned time column header perfectly using a structural ghost replica
- Added collision detection to prevent dragging tasks over occupied slots
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>
- 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>
- Added Task model to Prisma schema with id, title, description, completed, createdAt, updatedAt fields
- Created POST /api/tasks endpoint for task creation
- Created GET /api/tasks endpoint for retrieving all tasks
- Created PUT /api/tasks/:id endpoint for updating tasks
- Created DELETE /api/tasks/:id endpoint for deleting tasks
- Created PATCH /api/tasks/:id/complete endpoint for toggling task completion
- Created TaskItem component for displaying and editing tasks
- Defined Task TypeScript interface
- All endpoints include proper validation and error handling