- PanelLeftOpen in mobile header now opens Quick Settings (left panel)
- Added "Icon Rail" link at bottom of Quick Settings to open the icon sidebar
- Mobile icon sidebar now matches collapsed desktop left rail: View, Columns,
Slot, Plus, Repeat, Goal, Visibility, Appearance flyouts (tap-to-toggle),
Undo, Redo, Refresh, Print, dark mode, Settings, Sign out
v1.110.1
- Someday task edit: add icon/checkbox column spacers before the
textarea so the edit field aligns exactly with the task text column
- Settings tabs: remove outer padding, use space-around + nowrap so all
9 icons fit in a single row without wrapping
- Mobile: left sidebar rail (PanelLeftOpen button) — slides in from
left with nav controls (prev/next day/week, today), actions (search,
calendar jump, projects, focus, quick settings), and bottom controls
(dark mode, settings, sign out). CSS class .mobile-left-sidebar and
.mobile-rail-btn added for easy customization.
v1.110.0
SomedayAddTask now accepts showProjectIcons and showTaskCheckboxes props.
The bottom add-task row renders as a flex layout with matching spacers
for the icon column (18px) and checkbox column (16px), so the input
field left-edge exactly aligns with the task name column. Right-padding
keeps the input from extending into the provider icon column.
v1.109.1
- Completed tasks in someday lists now always render below all active
tasks. Slot system builds from incomplete tasks only; done tasks get
their own section at the bottom outside the droppable slots.
- "Add task..." input right margin increased to 24px so its right edge
stops before the provider icon (G) column, matching task row layout.
v1.109.0
The ANY DAY label/icon div sits at the flex-end of the tab bar but
appeared misaligned with the tab buttons. margin-bottom: 6px brings
it to the correct visual baseline.
v1.108.4
ListVisualsPopover used position:absolute which was clipped by the
weekly-someday-list card's overflow:hidden. Now uses position:fixed
anchored to the card's bounding rect. IconPicker sub-panel also
updated to position:fixed. Stabilized mousedown listener (onCloseRef
pattern, empty deps).
v1.108.3
The ⚡ priority and delegation icons were still rendering inside the
text span (after the checkbox). Now ALL task icons (project, priority,
delegation) are consolidated into the single fixed-width 18px column
before the checkbox for someday tasks. Tasks with no icon get an empty
placeholder so checkboxes and task names stay column-aligned.
v1.108.1
- Fix tab double-click popover not showing: tab bar overflow-x:auto was
clipping the position:absolute popover. Now uses position:fixed anchored
to the button's bounding rect, captured on dblclick. Also stabilizes
the outside-click listener (onCloseRef pattern, empty deps).
- Restructure someday task item order to: [project icon column] [checkbox]
[task name]. Fixed-width 18px icon column (placeholder when no project)
keeps all checkboxes and task names vertically aligned.
v1.108.0
CSS:
- Active tab no longer shows accent underline; instead border-bottom matches
the someday area bg (#f9f9f9 / #1a1a1b dark), creating a raised browser-tab
look where the active tab visually merges with the content below
- margin-bottom: -1px to cover the tab bar border-bottom on active tab
JSX:
- Double-click on any tab now opens TabVisualsPopover (edit tab)
- Pencil icon and dissolve-X button removed from tab wrappers
- TabVisualsPopover extended with: rename input, dissolve button
(dissolve removes the tab grouping; lists are kept)
- onRename and onDissolve props added to TabVisualsPopover
v1.107.3
Tabs:
- Pill-shaped tabs (border-radius: 20px) with proper background on inactive
- Inactive tabs now use readable dark text (--weekly-text) instead of
barely-visible --weekly-text-light
- Active tab: accent color + white text + glow shadow (box-shadow)
- Count badges: larger, higher contrast, 700 font-weight
- Tab bar: taller padding (8px), thicker bottom border (2px)
Cards:
- Rounded corners (10px), border + subtle drop shadow
- Cards now 240px wide (was 300px) for better density
- Grid padding changed from padding-bottom only to full 12px padding
- List header has subtle tinted background + reduced height (48px)
- Title font tweaked to 0.85rem/700 (was 1.15rem/800) to match card size
- Add-task button padding aligned to card edges (12px horizontal)
- Removed p-2 Tailwind class that was double-padding the card
v1.107.0
Left section was missing opacity-0 group-hover:opacity-100 Tailwind classes
after the useLeftRail display:none change. Restored fade-in-on-hover
conditionally when top-toolbar mode is active.
v1.106.6
- Remove hover blur/opacity on header center section when left rail is active
(group-hover:opacity-20 blur only applies in top-toolbar mode)
- Add min-height to desktop header so it doesn't collapse when both left/right
sections are hidden in left-rail mode
- User icon in left rail now opens Settings on the Account tab directly
- Add Menu Position toggle (Left/Top) to Settings > General tab so users
can find and change toolbar layout from the settings menu
- Replace FolderPlus with Briefcase icon for Projects in left rail to match
the Settings sidebar's Projects tab icon
v1.106.4
- Right header section now also gets display:none when useLeftRail is true,
so neither the left nor right header controls are visible in left-rail mode
- Replaced UserMenu (which positions from the right edge) with an inline
dropdown in the left rail that opens to the right of the rail at left:52px,
correctly positioned and functional
- Added LogOut icon to lucide imports
v1.106.3
1. Header left-section (view switcher, days, slot) is now display:none when
in left-rail mode — previously it was opacity-0 on hover so both were
visible simultaneously.
2. Left rail bottom now has two distinct buttons:
- ⚙ Settings (cogwheel) → opens full SettingsSidebar
- 👤 User → opens UserMenu (same as header avatar, with profile/sign-out)
Previously a single User icon opened the settings instead.
v1.106.2
Add a "Menüposition / Menu position" segmented toggle (Left / Top) in
the expanded left-rail preferences panel and in the top-mode overlay.
- "Left" (default): persistent left rail; header toolbar controls are
de-emphasised (fade in on hover only since they are duplicated).
- "Top": left rail hidden entirely; header controls always visible;
PanelLeftOpen button in header opens the full settings overlay.
Persisted via saveSetting("menuPosition", …) so the choice survives
page reloads.
v1.106.1
Replace the overlay quick-settings panel with a persistent fixed-left
toolbar on desktop. Collapsed (44 px) shows icon-only buttons; expanded
(240 px) shows the full labelled panel. Hovering a settings icon in
collapsed mode opens a flyout panel (view, columns, slot, visibility,
appearance). Mobile overlay behaviour is unchanged.
v1.106.0
Switch panel background to --paper, all dividers to --line, section
labels to --ink-3, active view/days/slot buttons to --accent/--ink.
Soften panel shadow to 4% opacity. No logic, structure, or API changes.
v1.105.2
Trim desktop header height (py-2 → py-1.5) and switch border to --line
token. Update .weekly-header CSS class to use --line. Add baseline
letter-spacing: -0.005em to body. No logic, structure, or API changes.
v1.105.1
Give the bottom-of-list "Add task..." input a framed background (white
with a subtle border in light mode, slate-800 with a darker border in
night mode) plus a small radius and padding, so it visually matches user
expectations of an input. The inline slot-editor that appears when you
click on an empty slot keeps the transparent look so it blends with the
surrounding task rows.
v1.104.1
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Pull-sync now runs on visibilitychange + window focus (in addition to mount
and the slow 15-min safety-net interval), throttled to one call per 5s. The
moment the user returns to the tab the app reconciles, so an Outlook-side
checkbox/star/title change shows up within a second of refocusing the tab
instead of after a 15-minute wait.
To keep this cheap, the Microsoft Graph delta endpoint
(/me/todo/lists/{id}/tasks/delta) is used when we have a stored deltaToken
for a synced list — typically a few hundred bytes per call when nothing
changed. Tokens are persisted on SomedayList.syncDeltaToken (new column,
migration applied) and refreshed each call. On 410 Gone (token expired
>30 days) we fall back to a full fetch and prime a new chain. Delta also
brings remote deletions (@removed) so they propagate locally without
needing a full list scan.
v1.104.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The previous timestamp gate (`if (remoteUpdated <= localUpdated) continue`)
hid genuine remote-side changes because every prior no-op pull bumped
lastSyncedAt to "now", making it newer than the Outlook lastModifiedDateTime
of a subsequent star toggle. Now the pull does a per-field comparison and
only writes lastSyncedAt when at least one field actually changed. Same fix
applied to the Google Tasks pull branch for consistency.
Also run a pull-sync once on mount instead of waiting up to 15 min, so
remote-side changes show up immediately on next page load.
v1.103.2
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- deleteCachedEvent now removes every cached row that belongs to the same
recurring series (master id + all "<masterId>::*" instances + rows whose
recurringEventId matches the master), so deleting "all occurrences" no
longer leaves orphan rows that resurface on the next read.
- getPriorityBadge: surface the yellow star whenever a task is marked
important (e.g. a starred Outlook To-Do task pulled in via sync), even
when the active priority style is Eisenhower / ABCDE / Ivy Lee.
v1.103.1
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Outlook recurring delete: also delete the specific instance after the master
to clean up orphaned first occurrences.
- CachedCalendarEvent gains busyStatus column (migration applied) so showAs
changes from Outlook flow back into the weekly view.
- Outlook create/update now round-trip the full event (busyStatus, visibility,
attendees, reminders, recurrence link) via a shared response mapper.
- MS To-Do importance ('high' star) ⇄ local importance flag in pull-sync,
push-sync, initial import, and local-task POST/PATCH; dueDateTime ⇄
scheduledDate added to pull-sync.
- Local task PATCH now fires a best-effort push to Outlook/Google/Synology so
any field change keeps both sides aligned.
- AnyDay list delete dialog now offers Cancel / hide locally / delete on both
sides; new deleteMsTodoList + deleteGoogleTaskList helpers.
v1.103.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add Show/Hide Priority Icons toggle in left settings panel under Project Icons
- Projects sidebar: move Add Project form to the top, add per-project
filter button (filters tasks across all views), expand/collapse to show
tasks underneath each project name, active-filter banner with clear
- Intro hints on first load: briefly reveal hidden header controls then
fade out, and bounce-scroll the main grid to reveal off-screen tasks
v1.102.0
Wave-2 user feedback (points 4–6):
- Language picker: replace emoji flags (which don't render reliably on
Windows) with inline-SVG flag components for GB/DE/FR/ES/IT. Used
in both the Settings localisation tab and the onboarding wizard.
- Timezone: replace the read-only Intl.DateTimeFormat display with a
real <select> over a curated list of major IANA zones. Each option
shows "(UTC±hh:mm) CODE — Region" and the list is sorted by current
offset, then code, then IANA name.
- Multi-timezone: new ExtraTimezonesEditor in the localisation tab lets
users pin additional zones (stored in user.viewSettings.extraTimezones
to avoid a migration). The time-grid axis now renders the equivalent
hour for each pinned zone next to the local label, helpful for
scheduling across regions.
v1.100.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- color now renders as a tinted background (alpha 0x1f) plus a 4px
accent border, matching the user's "background colorcoded" request.
- Migration 20260501 was unapplied locally; mark prior failed
20260403_add_task_url as applied and deploy 20260501. Without it
the API silently dropped color/icon and the SSE refetch wiped the
optimistic update, so visuals never appeared.
v1.99.1
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Wave-1 user feedback (points 7–10):
- Settings: new Projects tab with full CRUD (name, color, icon picker)
- Priority Icons render in simple/calendar/list views with style-specific
visuals (Eisenhower icons, ABCDE letters, Ivy Lee 1–6, Pareto star).
Toggle + style selector in Settings; Ivy Lee ranks now persist to
task.priority so cross-view badges stay consistent.
- Someday Lists gain optional icon (left of title) and color (left
border tint), edited via a pencil-popup with IconPicker + color picker.
- Tabs gain optional icon and color, stored in user.viewSettings JSON
and edited via the same popup pattern.
Schema: SomedayList.color/icon, User.showPriorityIcons/priorityStyle.
v1.99.0
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix weather toggle disabled when lat/lon set but weatherEnabled=false:
now enabled whenever a weather location is configured
- Default task duration: no-endTime tasks default to 30min (not 60min)
- Tasks without a project: remove left border entirely — only project-
assigned tasks show a colored left border; this matches the user's
explicit request that only calendar events have background/indicators
- Header order: show date first (top), then weekday name below — matches
webapp "above" date layout setting
- Lighten grid lines (#ececec) and stripes (#fafafa/#f0f7ff) to reduce
the heavy calendar-grid appearance; remove half-hour separator lines
- Lighten outer grid border and time-column border/bg to match
v1.96.1
saveSetting() for DEVICE_SETTINGS_KEYS (viewDays, cellDuration, startHour,
endHour, fontSize, showSubHourSlots) was saving to the cookie but returning
early before calling setProfile — so profile.fontSize never changed and the
CSS class font-size-s/m/l was never applied. Adding setProfile() to the
device-settings path fixes all of these keys at once while still keeping
the setting out of the DB.
v1.95.6
Adds a print/export modal (WeekPrintModal) accessible via a Printer icon
in the header toolbar. Users can configure date range, time window (startHour–endHour),
number of days, and toggle all-day, no-time, and weather sections. A live
CSS-grid preview updates as settings change. The PDF is generated server-side
via @react-pdf/renderer on the /api/user/export-week-view route:
- Landscape A4 with absolute-positioned time-spanning task blocks
- Day headers use the user's weekdayColor/dateColor/headlineFontWeight from DB
- Oswald font loaded dynamically from Google Fonts (falls back to Helvetica-Bold)
- Timezone-aware task grouping (±1 day query buffer + local date key)
- Optional weather line (Open-Meteo) and all-day strip
- Footer with date range, username, and page numbers
v1.95.0
viewStyle, showTimeGrid, and startDayOffset now also write to a device
cookie so each device remembers its own view independently. Cookie
wins over DB on load, giving phone/desktop their own default view
without losing the cross-device DB fallback.
- DEVICE_ALSO_COOKIE_KEYS: viewStyle, showTimeGrid, startDayOffset
- saveSetting writes cookie for these in addition to DB
- viewStyle and showTimeGrid lazy-init from cookie on first render
- Both fetchProfile and fetchUserInfo apply cookie overrides last
v1.94.1
The sidebar eye-toggles (Someday, All-day, Checkboxes, Project Icons,
Weather) and the sub-hour slots toggle now save to a device-local
cookie instead of the DB, so phone and desktop can have independent
display preferences.
- DEVICE_SETTINGS_KEYS extended with showSubHourSlots
- New DEVICE_VIEW_SETTINGS_KEYS for per-view sidebar toggles
(showSomeday, showAllDayEvents, showTaskCheckboxes, showProjectIcons, weatherEnabled)
- saveViewSetting writes cookie-only for device keys; DB untouched
- getEffective checks device cookie before DB per-view overrides
- Cookie restores applied after DB load in both fetchProfile and
fetchUserInfo so device preference always wins
v1.94.0
Font size (S/M/L) is now stored in the browser cookie
'setting_fontSize' alongside the other per-device settings
(viewDays, cellDuration, startHour, endHour).
This means mobile and desktop can each keep their own preferred font
size — changing it on your phone no longer overwrites the setting on
your desktop monitor and vice versa.
The cookie is read immediately at component init (before the DB load),
so there is no flash of the wrong size on page load. The DB value is
still written so that the setting has a reasonable default on new
devices before a local preference is set.
v1.93.1
Disconnecting a synced list (Google/Outlook/Synology) now uses a
soft-disconnect: tasks are soft-deleted and the external link is
cleared, but the SomedayList record is kept with its tab assignment
intact. When the user reconnects, the import route finds the list by
title, re-links the external provider, and restores tasks (clearing
deletedAt). Tabs survive the full disconnect/reconnect cycle without
the user needing to drag lists back to tabs.
Also clears deletedAt on task re-import so previously disconnected
tasks become visible again on reconnect.
v1.89.0
A small icon appears before each task title whenever priority has been set
in the Priority View. Works in simple, calendar, list, someday, and kanban.
Icon + color mapping
⚡ Zap red #ef4444 Sofort erledigen (urgent + important / ABCDE A)
🕐 CalendarClock blue #3b82f6 Planen (important, not urgent / B)
↗ CornerUpRight orange #f97316 Delegieren (urgent, not important / D)
📦 Archive gray #9ca3af Eliminieren (neither / E)
🕐 Clock yellow #eab308 ABCDE C only
Delegation badge
🤖 Bot purple task.delegatedTo === "AI"
👤 User purple task.delegatedTo = person name
Hover tooltip shows the full label (e.g. "Sofort erledigen", "Planen").
Icons are 11–12 px so they sit inline without disrupting the task row.
v1.88.2
Resize handle:
- Drag the divider between priority panel and calendar to resize it
- Height persists in cookie (priorityViewHeight)
Dense task cards:
- Single-row compact layout: [✓] date · title · action icons
- Date shown before the title
- Action icon bar: rename (✏), note (📝), link (🔗), project (📁), delegate (👤), remove (×)
- Inline title editing: double-click or click ✏ icon
- Inline note textarea: toggles on 📝 click, saves on blur
- Inline URL input with open-link button: toggles on 🔗 click
- Inline project selector: toggles on 📁 click
- Icons colored when field has a value (note, url, project, delegate)
- Export/import now round-trips url, kanbanStage, recurrenceDays fields
v1.88.0
New "Priority View" (Target icon in toolbar) fusing four prioritization
frameworks into a single, filterable view:
- Eisenhower Matrix: 4 quadrants (Do/Schedule/Delegate/Delete) based on
urgency × importance; unclassified tasks shown below for quick assignment
- ABCDE Method: five collapsible groups (A=Critical → E=Eliminate) with
inline grade assignment buttons
- Ivy Lee Method: pick exactly 6 tasks for tomorrow, ordered by priority
- Pareto 80/20: highlights the important 20% of tasks with a progress bar
and one-click "mark as important" for the rest
New DB fields: urgency (Boolean), importance (Boolean), priority (A–E),
delegatedTo, delegationNote — all persisted via Prisma + API.
Filters: by project, someday list (incl. scheduled / unscheduled), and
timespan (today / this week / next week / all).
Delegation modal: assign to a named person or to AI with optional
instruction notes; displayed as inline badge on task cards.
v1.87.0
- Fix heading hierarchy: modal titles h3→h2 (RecurrenceModal, two WeeklyView dialogs),
SettingsSidebar h4→h3 for Localisation, Data Export, Backup & Restore sections
- Add keyboard resize handle: role=slider, tabIndex, aria-valuemin/max/now/text,
ArrowUp/Down keys to adjust task duration in 15-min increments
- Add aria-label to CalendarEventModal notes textarea fallback
- Color contrast: raise --weekly-text-light from #a6a6a7 (~2.4:1) to #767676 (~4.5:1)
on white background to meet WCAG AA
v1.86.0
Remove the per-field weather checkboxes from the quick-settings sidebar;
those belong in the full settings modal only.
Also make the toggle more reliable: it now updates both the per-view
viewSettings override (saveViewSetting) AND the local profile state
(setProfile) so that effectiveWeatherEnabled is guaranteed to flip on
the next render regardless of which branch getEffective() takes.
v1.83.4
The previous condition only checked weatherLat || weatherLon, so users
who enabled weather in settings but hadn't picked a city yet would never
see the sidebar toggle. Now shows if weatherEnabled OR lat/lon is set.
v1.83.3
When weather is enabled and a location is configured, the sidebar now
shows per-item checkboxes (Symbol, Temperatur, Gefühlt, Wind, Böen,
Regenw., Niederschlag, Luftfeuchte, UV) below the weather toggle.
Checkboxes are hidden when weather is toggled off. All changes go
through saveViewSetting("weatherDisplay", ..., true) — same path as
the settings modal — so they stay view-specific and persist correctly.
v1.83.2
Someday, All-day, Checkboxes, Project-Icons, and Weather toggles in the
left quick-settings panel were calling saveSetting() (global profile PATCH)
instead of saveViewSetting(..., true) (per-view override).
getEffective() checks the per-view override first, so whenever a per-view
setting existed (set via the settings modal) the global update was silently
ignored and the toggle appeared broken.
All five toggles now call saveViewSetting(key, !value, true) which updates
viewSettings[currentView][key] directly — matching exactly what the settings
modal's view-tab checkboxes do.
v1.83.1
- Fix onNotes prop in all three TaskItem render sites: was calling
setSelectedTaskForNotes (ignoring HTML), now correctly calls
updateTaskNotes so inline RichTextEditor saves on every change
- NotesSidebar: replace plain markdown textarea+toolbar with RichTextEditor;
add URL field with open/clear actions
- Kanban detail modal: add URL field; replace plain textarea with RichTextEditor
- Tasks API: add sanitizeUrl() helper — strips javascript:/data: schemes,
normalises missing protocol to https:// before storing
- Remove dead code in TaskItem: notesRef, handleNotesBlur, insertMarkdown
(all replaced by RichTextEditor)
v1.83.0
TaskItem (used for all someday list tasks) was missing URL support entirely.
Added:
- onUrl prop wired to updateTaskUrl at both someday TaskItem render sites
(slot tasks and unindexed/remaining tasks)
- URL indicator (clickable link badge) shown inline on the task row
- Link action button in the task-actions bar that opens an inline URL editor
- URL popup with input, clear button, and open-in-new-tab shortcut
Also upgraded TaskItem's notes editor from plain markdown textarea to
RichTextEditor (same as GridTaskBlock), so inline hyperlinks in notes work
in the someday area too.
v1.82.1
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