# Release Notes ## Summary This release brings a suite of new capabilities and refinements across planning, finance, and horse management. Users can now sync their agenda via iCal, enjoy faster loading with summary endpoints, and benefit from a redesigned expense interface and mobile‑optimized horse list. Several security, performance, and stability improvements further enhance reliability. ## Highlights - iCal calendar feed added for easy external syncing - New TransPas facility reservation UI with edit and move actions - Contact list now includes duplicate count, role badges, and better filters - Mobile horse list optimized for single‑tap opening and scroll restoration - WhatsApp invoice messages are personalized with the recipient’s name ## Features - **Add iCal calendar feed for activities** Users can generate and manage iCal streams for their agenda, allowing easy syncing of activities with external calendars such as Google or Outlook. - **Contact list now includes duplicate count, role badges, and better filters** The overview shows how many duplicates exist, displays role badges under names, adds a role column and improves filter handling. - **New TransPas facility reservation UI with dedicated edit modal and move actions** TransPas reservations now have a custom edit form, hidden creation options, and a ‘move to facility’ action, streamlining reservation management. - **Boarders can add their own horses and assign co‑riders** Users with the appropriate rights can add horses they own and manage co‑riders directly from the horse page. - **Redesigned Expenses UI with invoice creation and item allocation** Expenses now show a ‘not invoiced’ badge, allow creating invoice items, and let users allocate costs to horses, customers or general categories. - **Recurrence descriptions are now displayed in the selected language** RRule text is translated using UI language strings, providing localized recurrence summaries. - **Invitation flow prompts existing users to log in instead of signing up** When an invitation email matches an existing account, the page prompts the user to log in instead of signing up, simplifying acceptance. - **WhatsApp invoice messages now include the recipient’s name** WhatsApp invoice notifications now greet the recipient by name in the appropriate language. - **Allow inviting users without stables and show deleted charge in expense delete confirmation** Invitations can be sent even when no stables are selected, and expense deletion dialogs now indicate which charge was removed. - **File browser now supports folders, previews and sharing like SharePoint** Horse file tiles include a folder hierarchy, rich previews, editable names/descriptions, and device sharing options. - **Monthly feed report shows quantities, totals and can be exported to Excel** The feed report now lists per‑horse quantities, aggregates totals and provides an XLSX export. - **Assign tasks to specific staff members** When creating a task, users can select a staff member to own the task. - **Allow inviting users without stables and show deleted charge in expense delete confirmation** Invitations can be created without selecting stables, and expense deletion dialogs now mention the removed charge. - **Add invoice email field to contact forms** Contacts can now have a separate email address for receiving invoices, leaving the regular email unchanged. - **Employment form includes start date input** When creating an employment record, users can specify the original employment start date. - **Filter recurring services by customer** The recurring services view now includes a customer filter to show services linked to a specific contact. ## Improvements - **Repeat orders now start from the last order as a base** When creating a repeat order, the system pre‑populates fields using the most recent order, streamlining the repetition process. - **Country selectors upgraded to searchable dropdowns with flags** All country pickers now use a searchable component that shows country flags and returns undefined for cleared fields, improving usability and validation. - **Open day actions menu by clicking header and hide empty column header on mobile** In the planning calendar, the day actions menu opens via the header, and empty column headers are removed in mobile full‑day view. - **Horse auto‑complete runs only on button press** The external horse search is triggered by an explicit button, reducing unnecessary backend calls. - **Mobile horse list now supports single‑tap opening and scroll restoration** Tap opens a horse directly, selection starts only via the button, sticky bar shadow works, and navigation back restores scroll position. ## Fixes - **Show day‑part validation errors next to the correct row** API errors are now displayed inline on the specific day‑part row, making it clear which entry has an issue. - **Always display contact initials and use profile initials in sidebar** Contact profiles now consistently show the initials field, and the sidebar avatar reflects the profile initials. - **Disable currency editing on finalized invoices and refresh customer data** The currency field is locked on a finalized invoice and changes to the customer automatically refresh related historic data. - **Show warning if invoice sending isn’t confirmed and poll send status** When finalising and sending an invoice takes long, the UI now warns users and polls the send status for updates. - **Display a friendly 404 page for missing public invoices** Users accessing an unknown public invoice see a clear ‘not found’ page, and the brand name typo is corrected. - **Hide future semen stock in picklist after order shipping date** Picklists no longer show semen collected after the order’s shipping date, preventing selection of unavailable stock. - **Gracefully handle disallowed origins and allow shop domains** Requests from unapproved origins now receive a clear 404 response and shop domains are accepted, preventing unexpected server errors. - **Safely access browser storage to avoid crashes when blocked** LocalStorage and SessionStorage access is wrapped to prevent SecurityError exceptions, keeping the app stable. - **Lock phones to portrait orientation while allowing landscape on tablets** Phones stay locked in portrait mode while tablets can rotate, matching device expectations. - **Log missing related horse as warning instead of error in invoices** When an invoice references a missing horse, the situation is logged as a warning, reducing false error alerts. - **Do not report network failures from version check as errors** Network errors during the minimum version check are logged as warnings, preventing unnecessary error reports. - **Do not treat failed sound playback as an error** Audio playback failures are now logged as warnings, avoiding noisy error tracking. - **Fallback to original image when EXIF parsing fails** If EXIF orientation cannot be read, the upload uses the original file and logs a warning. - **Show activity form validation errors to the user instead of reporting them** Input validation errors are now displayed inline on the form, improving user feedback. - **Skip fetching stables when a user belongs to many organisations** The profile page no longer issues a large batch of stable requests, preventing resource errors for super‑admin users. - **Keep sticky page elements below the impersonation banner** Sticky headers and sidebars now respect the banner height, ensuring content isn’t covered. - **Fix IndexedDB cache hangs by closing connections on version change** The API cache now properly closes old IndexedDB connections, preventing pages from getting stuck on loading. - **Add missing KMAR phase label to horse phase selector** The KMAR phase now appears in the horse phase list and UI components. - **Box number field now validated as a number in horse edit form** The edit form correctly parses the box number as a numeric value, fixing validation errors. - **Saving a facility event without a horse preserves its slots** Saving a facility event without selecting a horse now keeps any existing slots, preventing accidental data loss. - **Host the RVO manure calculation brochure internally** The manure calculation brochure is now served from within the app, ensuring the link remains functional. - **Feed reports display translated quantity units** Quantity measures in feed schedules are shown in the user’s language rather than cryptic abbreviations. - **Set PWA manifest description to a non‑null string** The manifest now contains a valid description field, removing browser warnings. - **Rider filter in calendar limited to selected stable’s riders** The default rider dropdown now shows only riders belonging to horses in the chosen stable, simplifying selection. - **Require Accounting module to connect bookkeeping integrations** Connecting Moneybird, Exact Online, Snelstart or Yuki now requires an active Accounting subscription, otherwise an upgrade prompt is shown. - **Show password‑mismatch error on the repeat password field** The signup form now highlights when the repeated password does not match the original. ## Security - **Prevent token leakage in PDFs and block open‑redirect attacks** Redacts tokens from PDF logs and blocks open‑redirect URLs, protecting user data. ## Performance - **Shrink native app size by removing unused startup images and sourcemaps** Reduces native app download size by removing unused assets and sourcemaps, resulting in much smaller iOS and Android binaries. - **Load horse summaries instead of full records on breeding screens** Breeding‑related screens now request lightweight horse summaries, cutting load time from seconds to fractions of a second. - **Load contact summaries instead of full contacts on breeding screens** Breeding screens now fetch concise contact summaries, speeding up data loading. ## Other - **Enable R8 optimizer for Android builds** The Android build now supports the R8 code shrinker. - **Switch TypeScript module setting from CommonJS to ESNext** The tsconfig module option was changed to ESNext. - **feat(breedingPlans): filter on plans without agent / insemination station** - **Ignore benign ResizeObserver loop errors in Sentry** ResizeObserver loop errors are filtered out to keep error tracking meaningful. - **Update TypeScript target to ES2022 and load PDF worker from package** tsconfig target set to ES2022 and PDF.js worker is now loaded from the library.