# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] ## [0.45.0] - 2026-05-04 ### Added - **CardDAV contacts integration** (#122): generic multi-account CardDAV sync for contacts. Connect multiple CardDAV servers (Nextcloud, iCloud, Radicale, Baikal) simultaneously. 8 new API routes for account management (`/api/v1/contacts/cardav/*`): create/delete accounts, test connections, discover/refresh addressbooks, toggle addressbook selection, sync contacts. Per-addressbook enable/disable via checkboxes. New service: `server/services/cardav-sync.js`. New router: `server/routes/cardav.js`. Database tables: `carddav_accounts`, `carddav_addressbook_selection`. - **Multi-value contact fields**: contacts now support multiple phones, emails, and addresses per contact. Each entry has a label (e.g., "mobile", "work", "home"), value, and optional `isPrimary` flag. Extends existing contact routes: `GET /contacts/:id`, `POST /contacts`, `PUT /contacts/:id`. Database tables: `contact_phones`, `contact_emails`, `contact_addresses`. Atomic transactions with replacement semantics on update. Backward compatible with legacy single-field contacts. Array validators: `validatePhones()`, `validateEmails()`, `validateAddresses()` with length limits, format checks, and type validation. ## [0.44.1] - 2026-05-04 ### Fixed - **CalDAV migration crash**: fixed CHECK constraint violation during v0.44.0 migration that caused container restart loop. The apple→caldav `external_source` conversion now happens during table rebuild instead of before, preventing the constraint error (#119, #120). ## [0.44.0] - 2026-05-04 ### Added - **Generic CalDAV multi-account sync** (#90): replaced single Apple CalDAV integration with a generic multi-account CalDAV solution. Connect multiple CalDAV servers (iCloud, Nextcloud, Radicale, Baikal) simultaneously. Per-account calendar selection via checkboxes in Settings → Calendar. Bidirectional sync with optional outbound target selection per event. Existing Apple CalDAV data is automatically migrated on upgrade. New database tables: `caldav_accounts`, `caldav_calendar_selection`. New service: `server/services/caldav-sync.js`. New API routes: `/calendar/caldav/*`. Enhanced UI in Settings and Calendar event modal. ### Changed - **Calendar feature description**: README.md and docs/SPEC.md updated to reflect multi-account CalDAV support instead of single Apple CalDAV integration. ## [0.43.0] - 2026-05-04 ### Added - **Automatic scheduled backups**: database backups are now created automatically on a configurable cron schedule (default: 2 AM daily). Old backups are rotated automatically, keeping only the last N copies (default: 7). Configuration via `.env` variables: `BACKUP_ENABLED`, `BACKUP_SCHEDULE`, `BACKUP_DIR`, `BACKUP_KEEP`. Settings → Backup displays scheduler status, schedule, retention policy, last backup timestamp, and a manual trigger button. ## [0.42.0] - 2026-05-04 ### Added - **Module toggles** (Settings → General, admin-only): individual modules (Tasks, Calendar, Shopping, Meals, Recipes, Birthdays, Notes, Contacts, Budget, Documents) can be disabled to hide them from the navigation. Data is preserved and reappears when the module is re-enabled. Dashboard and Settings remain essential and cannot be disabled. - **Bulk actions for tasks** (List view only): select multiple tasks via checkboxes and apply batch operations (mark done, mark open, archive, delete). Bulk select toggle appears in the toolbar; selected count and action bar appear when tasks are checked. Kanban view remains single-task oriented. ## [0.41.0] - 2026-05-01 ### Added - **Birthday badge**: the birthdays nav item now shows a badge when any family member has a birthday within the next 3 days. - **Recent filter chips**: the task filter bar now shows up to three recently used filters as quick-access chips, persisted in `localStorage`. - **Calendar icon search**: the event icon picker now includes a live search field to quickly find icons by keyword, with results grouped by category. - **Calendar icon categories**: event icons are now organised into labelled category groups (transport, sports, health, nature, leisure, social, work, home, food, other). - **Repeat indicator on calendar events**: events with a recurrence rule now display a small repeat icon in both month and week views. - **3-day week view on mobile**: the calendar week view automatically switches to a 3-day window on screens narrower than 640 px for better readability. - **Widget size presets**: the dashboard widget size selector uses named presets (Tiny, Narrow, Standard, Large, Full) instead of raw grid dimension values. ### Changed - **Required-field markers**: title fields in the task, event, and budget modals now show a required-field asterisk via the `.required-marker` CSS class. - **Modal drag handle touch target**: the bottom-sheet drag handle has a 44 px tall invisible hit area so it can be grabbed comfortably. - **Swipe affordance**: list rows with swipe actions show a subtle chevron hint to signal the gesture. - **Budget tab height**: budget tab buttons have a minimum height of 40 px to meet touch-target requirements. ## [0.40.1] - 2026-05-01 ### Changed - **Typography tightening**: page titles and modal titles use tighter letter-spacing (`-0.5 px` / `-0.8 px` on desktop) and `text-wrap: balance` to eliminate orphaned words on wrapped headings. - **Warm-tinted shadows**: all elevation shadows (`sm` through `xl`) now use a warm-tinted base colour (`rgba(18, 14, 8, …)`) that matches the warm neutral palette instead of pure black. - **Button radius**: regular buttons use `--radius-md` (12 px) instead of `--radius-sm` (8 px), creating a clear visual distinction from text inputs. - **Empty-state icons**: icons in empty states pick up a 40 % tint of the current module accent colour, making them feel contextually connected to each module rather than uniformly grey. - **Search section labels**: category headings inside the search overlay are now sentence-case instead of all-caps, improving readability. ### Fixed - **Tabular figures**: currency amounts (budget summary cards, transaction list, loan cards, chart rows), weather temperature, dashboard metrics, and calendar time labels now use `font-variant-numeric: tabular-nums` so digit columns remain visually aligned. ## [0.40.0] - 2026-05-01 ### Added - **Budget loans tracker** (PR #117 by @rafaelfoster): a new Loans tab in the Budget module lets you create instalment-based loans, record individual payments, track remaining balance and due months, and filter budget transactions by loan. Paid-off loans are automatically marked as closed. Full CRUD with confirmation modals. - **Dashboard widget sizes**: each dashboard widget now has a configurable size (columns × rows). Sizes are persisted in user preferences and survive page reloads. - **Extended date formats**: Settings → General now offers four additional date format options — `MM.DD.YYYY`, `YYYY.MM.DD`, `YYYY/MM/DD`, and `DD/MM/YYYY` — alongside the existing formats. ### Fixed - **`dmy` date format preserved**: the existing `DD.MM.YYYY` behaviour of the `dmy` preference is unchanged for all current users; a new `DD/MM/YYYY` option (`dmy_slash`) is available for those who want slashes. ## [0.39.2] - 2026-05-01 ### Fixed - **Budget date picker**: the date input in Budget → New Entry / Edit Entry now uses a native date picker on iOS and Android instead of a plain text field. ## [0.39.1] - 2026-05-01 ### Added - **Swedish translation completed** (PR #115 by @olsson82): all previously untranslated strings in `sv.json` now have Swedish equivalents (attachment fields, API token settings, budget categories, backup hint, onboarding, offline banner). - **i18n gap fix**: calendar and notes colour names, `emptyHint` texts, keyboard-shortcut labels, `tasks.navLabelOverdue`, and `birthdays.photoOptional` added to all 13 non-German locale files (ar, el, en, es, fr, hi, it, ja, pt, ru, tr, uk, zh). ## [0.39.0] - 2026-04-30 ### Added - **Time format preference**: Settings → General now includes a 24-hour / AM·PM toggle. The selected format is persisted in household preferences (backend) and localStorage, and takes effect globally for all time displays in calendar and tasks. Time inputs in modals accept both formats and normalise on blur. The calendar also remembers the last selected view (month / week / day) across sessions. ## [0.38.4] - 2026-04-30 ### Fixed - Dashboard portrait mode on mobile: layout no longer overflows to landscape width; `overflow: visible` override in the Admin Dashboard Layout CSS block has been removed so the correct `overflow: clip` takes effect, and `.app-content` now uses `overflow-x: hidden` (instead of `clip`) to properly contain layout overflow at the scroll container level ## [0.38.3] - 2026-04-30 ### Fixed - Dashboard portrait mode on Android: horizontal scrollbar no longer appears due to subpixel overflow in the main scroll container (`overflow-x: clip` added to `.app-content`) ## [0.38.2] - 2026-04-30 ### Fixed - Recurring calendar events with `FREQ=WEEKLY;INTERVAL=N;BYDAY=...` (N > 1) now correctly skip N−1 weeks between occurrences instead of repeating every week ## [0.38.1] - 2026-04-30 ### Changed - Docs: SPEC.md — `family_documents` and `family_document_access` tables added; `calendar_events` extended with `icon` and four attachment columns; `contacts` and `birthdays` extended with `family_user_id`; Tasks `status` includes `archived`; Documents module section added; Calendar section updated with icons, file attachments, and overlapping event rendering; Settings section updated with Backup Management tab and family member contact fields - Docs: BACKLOG.md — completed features table brought up to date through v0.38.0 (v0.30.0–v0.38.0 entries added) - Docs: README.md — Backup entry added to the feature table; Documents entry updated with exact category count - Docs: CONTRIBUTING.md — `innerHTML` security note updated to reflect current `insertAdjacentHTML`/`replaceChildren`/`esc()` pattern; individual test-suite commands listed ## [0.38.0] - 2026-04-30 ### Added - FAB entry animation now stops after 5 page views (long loop progressive reduction) - Search keyboard shortcut hint (`/`) hides permanently after first keyboard use - Success toasts are suppressed after 50 successful saves to reduce noise for power users - Empty state CTA button fades in with a short delay to draw attention as the primary action - Form fields pulse with a red glow on the second or subsequent validation failure on the same field - Shopping quick-add input shows a brief accent-colour glow after each successful item add ## [0.37.2] - 2026-04-30 ### Changed - Search bar in More sheet: added hover, active, and focus states with accent colour highlight and subtle scale feedback - Search bar icon changes to accent colour on hover and press for clearer trigger affordance - Keyboard shortcut hint (`/`) shown inside search bar on desktop as discoverability signal ## [0.37.1] - 2026-04-30 ### Changed - Bottom navigation: Tasks replaces Search as a primary tab bar item - More menu: layout changed from two columns to a three-column grid (two rows of three) - Search: embedded as a narrow bar at the top of the More sheet instead of a standalone bottom-nav button ## [0.37.0] - 2026-04-30 ### Added - Calendar: drag-and-drop file upload dropzone for event attachments (consistent with Documents module) - Calendar: popup positioning now fully viewport-aware (flips above anchor if insufficient space below) ### Fixed - Calendar: event attachments with raw base64 data (no `data:` prefix) now render correctly as images - Calendar: "file too large" error is now shown correctly when saving an oversized attachment ### Changed - Theme init script extracted from inline `