Users can now pick which weather data to show per time slot: icon,
temperature, feels like, wind speed, gusts, rain probability,
precipitation, humidity, and UV index. API now fetches all data
from Open-Meteo. Also fixed slot height for 20min duration.
v1.52.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The custom adapter wrapper that stubbed session methods was preventing
sessions from loading. Reverted to plain PrismaAdapter - the original
credentials login issue was caused by missing DB columns, not the adapter.
v1.51.6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Timeslot options are now 15min (4/hr), 20min (3/hr), 30min (2/hr),
and 1h (1/hr). Removed the 2h option which didn't make sense.
v1.51.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
viewSettings, weatherEnabled, weatherLat, weatherLon, weatherLocation,
lightTheme, darkTheme, emailVerificationCode, mobileFontScale, and
notificationsEnabled were in the Prisma schema but never had migrations,
causing all profile saves to fail on the server.
v1.51.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The weatherRecentCities field was added to the Prisma schema but no
migration was created, causing PrismaClientValidationError on the server.
v1.51.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix NextAuth CredentialsProvider + PrismaAdapter conflict by stubbing
adapter session methods (JWT strategy doesn't use DB sessions)
- Improve login error handling with redirect:false for real error messages
- Move all-day section resize bar to top when allDayPosition is "below"
- Fix resize drag direction for top-positioned all-day handle
v1.51.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Match the header view switcher icons (Calendar, CalendarDays, ListTodo,
Kanban) in the settings sidebar tab bar.
v1.51.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Per-view settings (cellDuration, showSomeday, etc.) now persist across
page reloads by using a ref to avoid stale closure bugs in saveViewSetting
and removing global state pollution from per-view onChange handlers.
Weather display fixed to use effectiveWeatherEnabled for fetch/render.
Added weatherRecentCities (max 8) as quick-switch pill buttons.
Kanban checkboxes now respect the showTaskCheckboxes per-view setting.
v1.51.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move view style selector (Simple/Calendar/List/Kanban) to the top
of the general settings tab. Settings below now automatically apply
to the selected view. Replaces the previous per-view badge approach
with a cleaner tab-based UI: switch to a view tab, adjust its
settings — done.
Per-view settings: hour format, sub-hour labels, weather, checkboxes.
v1.50.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The formatHour function was ignoring the format parameter in 24h
mode, always returning HH:MM. Now "short" returns just the hour
number without leading zero or :00.
v1.49.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add viewSettings JSON field to User model storing per-view overrides.
Settings like hour label format, sub-hour labels, weather, and task
checkboxes can now be set per view (simple/calendar/list/kanban) or
globally. A clickable badge next to each setting shows "All" (global)
or the current view name (per-view). Click to toggle scope.
Also fixes hourLabelFormat not actually being applied to time column
rendering (was hardcoded, now uses effective per-view value).
v1.49.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
In list mode there's no time column, so the all-day label was
causing a left offset mismatch. Removed the label so all-day
events grid lines up with the day columns below.
v1.48.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use trash icon instead of X for delete button
- Add cancel X next to the red confirm button
- Hide all-day calendar events in kanban view
v1.48.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
First click on X shows a red "Confirm" button inline. Second click
deletes the stage and moves all its tasks back to "no phase".
Clicking elsewhere resets the state.
v1.48.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Column headers are now editable: click the name to rename, click
the color dot to change color, hover to reveal delete button
- "+" column at the end to add new stages
- Removed kanban stages section from settings sidebar
v1.48.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The calendar-view time-slot-label override was clobbering the
hour-start font-weight and sub-hour font-size. Now properly
differentiates hour labels (bolder) from sub-hour labels (smaller,
lighter).
v1.47.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove display:none on time column so it shows again
- Remove all time-slot grid lines for a cleaner look
- Remove vertical column borders (no right borders)
- Bold uppercase headers with subtle bottom border
- Cleaner task items with more padding
v1.47.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Only show horizontal grid lines at full hour boundaries, matching
the clean Google Calendar aesthetic from the reference screenshot.
v1.47.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Put + icon (create project) on far left, followed by project drop
chips, then a spacer, then search/filters on the right — all in
one unified toolbar row.
v1.47.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace emoji project icons with FontAwesome solid icons (46 icons)
with proper icon picker grid and legacy emoji fallback
- Fix weather temperature unreadable on mobile (white on white) by
adding explicit dark/light color
- Fix weekday sticky header on mobile: correct top offset for
time-grid scroll container, use overflow-x: clip to not break sticky
- Swap mobile header: quick settings (PanelLeftOpen) on left,
burger menu (settings) on right, remove search icon (available
in left sidebar)
v1.46.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create dedicated Projects sidebar (separate from settings) with full
CRUD, emoji picker, and dark mode support
- Move all quick actions (nav, search, jump to date, calendar event,
recurring tasks, goal, focus, dark mode, view/days/slot/hours,
undo/redo/refresh) from right settings sidebar to left quick settings
- Remove projects tab from settings — all project management via sidebar
- Fix iPhone sticky headers: time-column-header no longer sticky on
mobile, weekly-day-header remains sticky
v1.45.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Apply maxHeight constraint to time-grid-wrapper on all devices,
not just desktop. iOS Safari needs an explicit height bound for
overflow-y: scroll to work within a flex container.
v1.44.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add weather feature with Open-Meteo API: hourly temp/icon overlay on time slots,
location search via geocoding, weather toggle in settings
- Move project management to dedicated settings tab with emoji icon picker
- Fix iPhone single-day view starting on yesterday instead of today
- Fix deleted Apple calendar events persisting until app reboot by
scheduling a delayed re-fetch after stale background sync
v1.44.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On tablet (≤1024px), hide days-to-show, time range, slot duration,
and goal/quote from header. Move days and slot controls into the
overflow menu. Only view switcher icons + KW/year + navigation remain
in the header bar.
v1.43.2
- 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
Desktop shows all action buttons inline. On tablet (≤1024px), secondary
actions collapse into a dropdown overflow menu with proper touch targets,
dark mode support, and fade-in animation.
v1.42.0
FAB now opens a fan menu with 4 options instead of directly adding tasks:
- Task: opens the existing bottom sheet for quick task entry
- Event: opens the calendar event modal
- Focus: enters focus mode
- Search: opens search modal
FAB rotates to X when menu is open, backdrop dismisses on tap.
Each menu item has a colored icon bubble with label.
v1.41.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Subtasks: slide-in animation, left border accent, hover highlights,
mini progress bar in indicator badge, scale effect on checkbox hover
- Notes: slide-in animation, cleaner toolbar with SVG icons instead of
emoji, proper dark mode support, focus ring on editor, max-height cap
- Both use CSS variables for consistent theming
v1.40.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix goToToday landing on yesterday in single-day view (skip startDayOffset)
- Add quick actions panel to settings sidebar for all screen sizes (not just mobile)
- Add view style switcher, visible hours, search, and new project to sidebar
- Change weekly-container to height:100vh for proper flex layout
- Someday/all-day sections use flex-shrink:0 for stable resize behavior
- Collapse uses height:30px!important to override inline styles
v1.40.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use 1px border style instead of thick background bar
- Switch from maxHeight to height for proper resize control
- Fix overflow conflict in expanded someday CSS
- Both all-day and someday areas now properly resizable
v1.39.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Handle now appears above the someday section as a visible bar with
background color. Dragging up increases height (inverted for top handle).
Handle styling improved with hover/active states for better discoverability.
v1.39.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Resize handles for all-day and someday areas were inside the
overflow:auto section, making them scroll away. Now placed
outside the section so they always sit at the bottom border.
v1.39.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rolling ran inside fetchTasks before profile.autoRolling was loaded,
so it always saw false and skipped. Now runs as a dedicated effect
that waits for both profile and tasks to be ready.
v1.39.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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 setting in Settings > Styling that scales all fonts on mobile
devices (75% / 85% / 100% / 115% / 130%). Applies to day names,
dates, tasks, events, and the mobile header date. Also scales the
CW/date display in the mobile header via scaleRem().
New DB field: mobileFontScale (Float, default 1.0)
v1.38.0
The global overflow-y:visible rule for time-grid-on was overriding
the mobile overflow-y:auto on .weekly-days-grid, which broke
position:sticky on day headers. Wrap desktop overflow rules in a
min-width media query and keep mobile scroll container intact.
v1.37.4
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
- Query both timed (startDateTime) and all-day (startDate) events
- All-day events treated as starting at 07:00 UTC (~09:00 CET)
- Log number of events found per user for debugging
- Skip already-passed events to avoid unnecessary checks
v1.37.2
- Use var(--weekly-bg) and var(--weekly-text) for sidebar background
and text color so it matches the calendar in both light/dark mode
- Add explicit label color rules for settings sidebar
- Change manifest theme_color from blue (#0ea5e9) to white
- Add responsive themeColor meta tags for light/dark preference
v1.37.1
- Service worker + Web Push API for browser/mobile notifications
- PWA manifest with icons for home screen install (iOS 16.4+)
- Push subscription management (subscribe/unsubscribe API routes)
- Notification toggle in Settings > General
- Push scheduler script (cron) checks cached events and sends
notifications at reminder times, with dedup tracking
- Test notification endpoint at /api/push/test
- Persists reminders in calendar event cache for scheduler access
- New DB models: PushSubscription, SentNotification
- New user field: notificationsEnabled
Setup: generate VAPID keys with `npx tsx scripts/generate-vapid-keys.ts`
and add to .env, then run scheduler via cron every minute.
v1.37.0
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>
Switch sidebar from flex column layout to block on mobile so the
quick actions, tabs, and settings content all flow in one scrollable
container instead of the content being trapped in a tiny flex:1 area.
v1.35.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Prevent desktop SimpleDatePicker from rendering on mobile (was
showing two date pickers simultaneously)
- Add overflow-y: auto to settings sidebar at 768px breakpoint so
the quick actions panel and content are scrollable on all mobile
- Add cols-2 CSS rules for weekly-days-grid and all-day-events-grid
so the 2-day view spreads columns correctly
v1.35.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ignore horizontal swipe gestures that originate inside the .weekly-someday
element so that horizontal scrolling of someday lists works without
triggering day navigation on mobile.
v1.35.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add 2-column option to view days selector (1,2,3,5,7)
- Make settings sidebar scrollable on mobile (overflow-y: auto)
- Fix someday section not visible on mobile by removing maxHeight
constraint from time-grid-wrapper on mobile devices, allowing
natural page scrolling to reach the someday area below
v1.35.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Set flex gap to 0px for column layouts (above/below) so the date sits
closer to the weekday. Remove default margin-bottom from .weekly-day-date
CSS to prevent extra spacing.
v1.34.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Compute vertical offset relative to the weekday headline font size
instead of the date's own small font. Top shifts up 55%, center 25%,
bottom stays at baseline — giving visible, proportional alignment.
v1.34.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use baseline alignment as anchor so the date positions relative to the
weekday text, not the container. Apply small em-based offsets for
top/center/bottom to fine-tune positioning without overshooting.
v1.34.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change "bottom" date vertical alignment from flex-end to baseline so
the date aligns to the weekday text baseline instead of the container
edge, giving a more natural and subtle positioning.
v1.34.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove default h3 margins from .weekly-day-name and clear margin-bottom
on .weekly-day-date when in horizontal (left/right) layout so that
flexbox alignItems (top/center/bottom) works correctly.
v1.34.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace crowded 7-element mobile header with clean 3-element layout:
hamburger menu (left), tappable date display (center), search (right).
All touch targets are 44px+ per Apple HIG.
Move navigation, quick actions, view controls, and utilities into a
new mobile quick actions panel at the top of the settings sidebar.
Add safe area insets for notch and home indicator on iOS devices.
v1.34.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mobile header now uses Calendar Week (KW) font family, size, weight,
and color settings instead of hardcoded styles. Year span also uses
separate Year font settings in KW mode.
v1.33.8
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move right navigation arrows outside scrollable time-grid-wrapper so
they remain visible on hover. Add explicit -webkit-text-fill-color for
all inputs/textareas to fix invisible text on iOS Safari.
v1.33.6
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add timeGridWrapperRef to scroll the correct container (wrapper has
overflow-y: scroll, inner elements have overflow: visible)
- Scroll wrapper to startHour offset on load and when startHour changes
- Time labels use translateY(-0.4em) so first/last hours aren't clipped
by the sticky header or container edge
- jumpToHour also targets the wrapper ref
v1.33.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Time-grid-wrapper max-height is set based on (endHour - startHour) so
only the selected time range is visible. Users can still scroll to see
hours outside the range. Tasks remain in their correct timeslots.
v1.33.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GridTaskBlock now positions tasks from hour 0, not from workingHoursStart
- Changing start/end hour only scrolls the view, doesn't shift task positions
- Calendar events and tasks now align on the same time slots
v1.33.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Swap simple/calendar icons in header view switcher
- Add calendar view button to header view switcher
- Reorder header: view switcher first, then days, hours, slot duration
- Add header display setting: calendar week (KW) or month name
- Show kanban stage color border on GridTaskBlock (week/simple views)
- Show date, weekday, and time on kanban cards
- Remove task swipe gestures on mobile (use container swipe for day nav)
- Fix mobile landscape 3-day grid overflow
- Add headerDisplay to schema, API, and settings UI
v1.30.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix stale closure in updateTaskFields causing tasks to disappear after
dragging between kanban columns. Add view switcher icons (Week/List/Kanban)
in the header on hover. Add search bar and filter dropdowns (project,
someday list, week) to the kanban board. Include someday list tasks in
kanban view.
v1.29.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>
Replace cryptic "—" with translated "No tab" label in the tab assign
dropdown (EN, DE, FR, ES, IT). Selecting it unassigns the list from
its current tab.
v1.27.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New tabs created via FolderPlus button are stored in localStorage as
custom tabs and merged with list-derived tabs. Dissolve and rename
also update custom tabs. Changed tab assign icon in list headers from
Tag to FolderPlus for consistency.
v1.27.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drag a someday list by its handle and drop it on a tab button to assign
it to that tab. Drop on "All" to unassign. Visual feedback with dashed
outline on hover during drag.
v1.27.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace the someday-label-column with a unified horizontal tab bar
containing: collapse chevron, "any day" label, new list icon (ListPlus),
new tab icon (FolderPlus), divider, then tab buttons. All icons have
tooltips. Inline input for creating new tabs directly in the bar.
v1.27.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Display number of lists per tab in a circle badge next to the tab name.
"All" shows total count, each tab shows its filtered count.
v1.26.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix tabs vanishing on reload by adding missing `tab` field in fetchTasks()
list mapping. Replace cramped vertical tabs in someday-label-column with
a readable horizontal tab bar above the someday grid, working in both
time-grid and non-time-grid modes. Double-click to rename, X to dissolve.
v1.26.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace browser confirm() popup when unchecking synced task lists with
an inline red confirmation banner. Add sync all / unsync all buttons
per provider for batch operations. i18n for EN, DE, FR, ES, IT.
v1.26.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix someday tabs disappearing on reload (include tab field in fetch mapping)
- Add dissolve/delete tab feature with X button on hover (all 5 languages)
- Fix Synology calendar "cannot find homeUrl" by falling back to derived homeUrl
when well-known CalDAV discovery fails
v1.25.2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show horizontal scrollable tab bar on mobile (≤768px) above someday
lists. Hide vertical tabs in label column on small screens.
Replace browser prompt for new tab name with inline input field.
v1.25.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add tab system for someday lists allowing categorization (e.g. Private,
Work, Family). Lists can be assigned to tabs via tag icon dropdown in
list headers. Tabs appear in the someday label column for filtering.
Double-click tab name to rename. Tabs persist in DB via new SomedayList.tab field.
Also add hover-overlay prev/next day/week navigation arrows on left and
right sides of the weekly grid, and fix first hour label clipping.
i18n: tab translations for EN, DE, FR, ES, IT.
v1.25.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Added 70+ translation keys across all 5 languages (EN/DE/FR/ES/IT)
- Replaced 45+ hardcoded strings in settings with translated versions
- Added flag emojis to language dropdown (🇬🇧🇩🇪🇫🇷🇪🇸🇮🇹)
- Fixed language dropdown jumping back to English (functional updater, correct fallback)
- Downgraded Synology calendar 405/404 errors to warnings for stale calendars
v1.24.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- API now handles two cases: send reset link (email only) and
reset password (token + newPassword)
- Generates UUID token stored on user with 1-hour expiry
- Sends styled HTML email with reset link via SMTP
- Prevents email enumeration (always returns success)
v1.23.0
- Fix setval(0) error in accountNumber migration (use GREATEST(..., 1))
- Add migration for dateVerticalAlign, dayHeaderGap, weekday settings, quoteLanguages
- Deploy scripts now fall back to db push if migrate deploy fails
v1.22.3
The standalone build already includes the correct server files.
Copying .next/server on top was overwriting middleware-manifest.json,
causing MODULE_NOT_FOUND errors at runtime.
v1.22.1
Users can now choose which languages their motivational quotes appear in
via toggle buttons in Settings. Added 45 curated quotes in French, Spanish,
and Italian. Quote language preference is stored per-user in the database.
v1.22.0
- Add French, Spanish, and Italian translations for full UI localization
- Add Italian to language selector; show native language names
- Fix Jump to Date calendar: use React portal with fixed positioning
to prevent clipping by overflow:hidden ancestors
- Fix font matching: time grid tasks inherit from task font settings
when at default values (0.75rem/500), matching someday list fonts
- CSS fallback chain: time-slot-task vars fall through to task vars
- Remove broken recite.vercel.app default quote URL
- Add date-fns locales (fr, es, it) for SimpleDatePicker
v1.21.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Show Account Number in Settings > Account for user identification
- Add weekly goals to JSON export/import with upsert-based merge
- Fix calendar events not appearing instantly (await cache ops, prevent
provider force-refresh from overwriting optimistic updates)
- Add Sign Out button in Settings > Account for mobile accessibility
- Fix dateVerticalAlign persistence in profile API
- Fix quote API error handling for non-JSON responses
- Add Synology to CalendarEvent source type union
v1.20.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add weekday case setting (Normal/Capitalize/Uppercase) with DB persistence
- Move provider icons to end of line (right-aligned with marginLeft: auto)
in both GridTaskBlock and TaskItem
- Make time grid task font inherit from task font settings as fallback
instead of separate hardcoded defaults (0.75rem/500 → task font values)
- Fix Jump to Date calendar: center-aligned dropdown, dark mode support
via CSS variables, proper border and shadow styling
- Add weekdayCase to Prisma schema, profile API, and translations (EN/DE)
v1.19.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add sync provider icons (Google, Microsoft, Apple, Synology) to
GridTaskBlock so they show in weekday time slots
- Add weekdayFormat and customWeekdayNames fields to Prisma schema
and profile API so custom weekday names persist across reloads
- Fix Jump to Date calendar z-index by elevating container when open
- Fix someday textarea font to inherit from CSS instead of hardcoded values
v1.18.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Show sync provider icons (Google, Microsoft, Apple, Synology) on both
someday and weekday tasks with fallback detection from externalId
- Remove hardcoded fontSize from someday tasks so they inherit CSS variables
- Remove line-height override for someday task text
- Bump day header z-index to 20 to prevent task overlap when scrolling
- Always propagate externalProvider when dragging tasks between slots
v1.17.2
- 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>
Synology tasks were not syncing because tsdav defaulted to VEVENT only.
Added explicit VTODO comp-filter to the CalDAV REPORT request.
Removed debug logging from sync routes.
v1.15.9
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Provider icon is now a sibling flex item inside .weekly-task-text
(same level as checkbox), not nested inside the title text span.
Larger size (11px) and higher opacity (0.6) for better visibility.
v1.15.8
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>
Place the provider logo (Google/Microsoft/Apple/Synology) right after
the task title text so it's always visible and not hidden by the
task-actions toolbar. Only shown on weekday slots, not in someday area.
v1.15.5
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use bottom: 100% instead of fixed top offset so toolbar always sits
above the task regardless of task height.
v1.15.4
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Show provider-specific icons (Google, Microsoft, Apple, Synology) before and after synced task titles
- Fix someday list reorder drag & drop: stable index calculation with drop indicator line
- Prevent dropping someday lists onto day slots (shows not-allowed cursor)
- Hide recurring button for someday tasks
- Fix Google Tasks subtask duplicates by filtering out child tasks from top-level list
v1.15.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both boot-update.sh and update-server.sh were missing the
cp -r .next/server step, causing middleware-manifest.json
not found errors after deployment.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
v1.14.1
- 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 ~30 curated quotes (15 DE + 15 EN) to local quote library. Goal API
now uses local quotes as fallback for all languages, with ZenQuotes only
for English users. Frontend fetchMotivationalQuote also falls back to
local quotes instead of hardcoded English string.
v1.13.0
- Add JSON export/import for all tasks, anyday lists, and projects (Settings > Account > Backup & Restore)
- Add merge and replace import modes with confirmation for destructive replace
- Add resizable notes sidebar with drag handle on left edge
- Add subtask count indicator (indigo pill) on tasks that toggles subtask list
- Add note indicator (amber pill) on tasks that toggles inline notes
- Show Account ID in Settings > Account as read-only identifier
- Fix goal save bug: saved goals matching default text are no longer ignored
- Fix calendar week number using Monday within visible range instead of middle day
- Fix calendar events not appearing instantly by delaying sync refresh 3s
- Grey out URL field when creating events on Google/Outlook calendars
v1.12.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
Replace input elements with textarea for task editing and creation.
Shift+Enter inserts a newline, Enter saves. Display uses pre-wrap.
v1.10.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>
- Add responsive CSS breakpoints (480px/768px/1024px)
- Auto-adjust viewDays based on screen width
- Keep time column visible on mobile (compact)
- Add boot-update.sh for auto-update on reboot
- Fix Suspense boundary in verify-email page
- Bump version to 1.7.0
- 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
When both fetchCalendarEvents and fetchTasks ran in parallel, whichever
finished first would set isSyncing=false, hiding the spinner while the
other was still running. Replaced boolean with a ref-based counter so
the spinner stays visible until all concurrent syncs complete.
v1.3.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
- Add externalProvider to SomedayList interface and fetch mapping
- Display a small provider icon (Microsoft/Google/Apple) next to the
list title with tooltip showing the sync source
- Icon appears at 50% opacity to stay subtle
v1.2.3
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 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>
- Add isSyncing state to fetchTasks() so spinner shows during task/list loading
- Remove !task.completed filter from getTasksForDate — completed tasks now stay
visible with strikethrough instead of vanishing
- Inject package.json version into NEXT_PUBLIC_APP_VERSION via next.config.js
so the Settings > About tab always shows the current version
v1.1.1
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add dark mode color adjustment helper for category colors
- Support multiple motivational quote source URLs
- Fix text wrapping for tasks/events to prevent horizontal overflow
- Improve someday list item layout for long text
- Add CLAUDE.md with semantic versioning and git workflow rules
- Update test/doc URLs and planning docs
v1.1.0
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Multi-stage Dockerfile: build stage + slim production runner
- Runs `next build` + `next start` instead of `npm run dev`
- Dev server on port 3001 to avoid conflict with production on 3000
- Deploy script with version bumping and health checks
- Explicit .env.production for docker-compose
- Updated .gitignore and .dockerignore
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>