# Release Notes ## Summary This release brings major workflow enhancements, including calendar feed integration, a new TransPas reservation UI, and the ability for boarders to add their own horses and co‑riders. Performance is boosted by loading horse and contact summaries, and the app bundle size has been significantly reduced. Several security and stability fixes improve reliability across invoicing, storage, and edge functions. ## Highlights - Calendar feed integration lets you sync activities with external calendars - Boarders can now add their own horses and assign co‑riders - TransPas facility reservation UI adds dedicated edit and move screens - Horse and contact lists now load lightweight summaries, speeding up pages - App bundle size reduced, cutting download times for native apps - Invoices can now include a personalised WhatsApp message ## Features - **Sync your agenda with external calendars** You can now generate iCal feeds for your activities and add them to calendars like Google or Outlook, enabling easy synchronization of your schedule. - **Contact list now shows roles, duplicate count and filters** The contacts overview includes role badges, a duplicate count, and new filter options, providing richer information at a glance. - **New UI for TransPas facility reservations** Provides dedicated forms for editing, moving, and viewing TransPas reservations, with improved grid view and colour coding by leg number. - **Open day actions directly from the calendar header** Clicking a day header opens its actions menu, and empty column headers are hidden in mobile full‑day view. - **Invitation flow now prompts existing users to log in** When an invitation targets an email already in the system, the page shows a login screen instead of the signup form, simplifying acceptance. - **Boarders can add their own horses and assign co‑riders** A new 'Add own horse(s)' button lets users create horses they own, and co‑rider management allows adding riders to those horses. - **Expenses module now supports creating invoice items and clearer UI** New badges, redesigned expense list, and the ability to generate invoice items directly from expenses streamline financial workflows. - **Recurring activity text now respects your language** RRule descriptions are shown in the app’s language, with translated day and month names. - **Invitations prompt login when the email already has an account** The invitation page shows a login screen and guides users to accept the invite after signing in. - **Invoice messages on WhatsApp now include the recipient’s name** WhatsApp invoices greet customers by first name, improving personalization. - **Horse files now have a SharePoint‑style browser with folders** You can create, rename, move and delete folders, see previews, and share files directly from the horse file tile. - **Feed report now shows quantities, totals and Excel export** The monthly feed report includes detailed amounts per horse, overall totals, and a downloadable XLSX file. - **Tasks can now be assigned to a specific staff member** When creating a task, you can select an employee responsible for it. - **Contacts can now have a separate invoice email address** An optional invoice email field is added to contact forms, allowing invoices to be sent to a different address. - **Employment records now include a start date field** When creating an employment entry, you can specify the original start date of the employee with the stable. - **Recurring services can be filtered by customer** A new filter lets you view recurring service items for a selected contact, improving financial overview. - **API now returns the previous release's commit hash** The /api/version endpoint includes a previousCommitHash field for easier change tracking. - **You can now delete a specific amount of semen stock** The destroy stock dialog allows entering a custom portion count instead of removing all remaining stock. - **Release notes are generated in English, German and Dutch** The notes generator creates multilingual releases and links users to notes in their language. ## Improvements - **Country dropdowns are now searchable with flags** All country selectors have been replaced with a searchable component that shows flags and returns undefined for cleared optional fields, fixing validation issues. - **Horse list now works smoothly on mobile devices** Single‑tap navigation, refined selection handling, scroll restoration, and better spacing improve the mobile experience. ## Fixes - **Day‑part errors now appear next to the correct row** Validation errors from the API are displayed inline on the specific day‑part line, making it clear which entry needs correction. - **Contact initials always visible and used in sidebar avatars** The initials field is always shown when editing contacts, and profile avatars now display the contact’s initials for quick identification. - **Search results now show the correct source name** The multi‑result modal now displays a generic source label and correctly lists which sources returned each result. - **Finalized invoices now lock currency and sync changes** When an invoice is finalized, the currency field is disabled and changes to the customer are reflected in the PDF, ensuring consistency. - **Invoice sending now shows progress and warns on failure** The system polls the send status and notifies you if the invoice was not confirmed, reducing wait times. - **Missing public invoices display a friendly 404 page** When a public invoice URL is invalid, users see a clear not‑found page instead of a generic error. - **Picklist no longer shows semen collected after the order date** Only stock available up to the order’s shipping date is displayed, preventing selection of future stock. - **Disallowed CORS origins now return 404 instead of errors** Edge functions gracefully reject unknown origins with a 404 and now accept requests from shop domains. - **Local and session storage access now guarded against security errors** The app safely handles cases where browser storage is unavailable, preventing crashes. - **Phones are locked to portrait orientation while tablets stay landscape‑capable** The mobile app now enforces portrait mode on phones, improving layout stability on handheld devices. - **Saving a facility event without a horse retains its slots** The form no longer clears slots when no horse is selected, preserving event details. - **Version check network failures are logged as warnings** Failed min‑version fetches no longer generate Sentry errors, reducing noise from harmless network issues. - **Failed sound playback no longer triggers error reports** Audio playback failures are logged as warnings, preventing unnecessary error alerts. - **Image uploads fall back to the original file when EXIF fails** If orientation data cannot be read, the original image is used and a warning is logged. - **Activity form validation now displays errors in‑app instead of logging them** User‑visible validation messages replace Sentry error reports for activity form issues. - **Profile loading avoids excessive stable queries** When a user belongs to many organisations, the app stops fetching stables to prevent resource‑exhaustion errors. - **Sticky elements stay visible above the impersonation banner** Layout offsets now ensure that sticky headers and sidebars are not hidden by the fixed impersonation bar. - **API cache now closes stale connections and times out on version changes** Database connections are properly closed and timed out, preventing pages from hanging on load. - **KMAR phase now appears in horse status dialogs** The missing KMAR label has been added so the phase can be selected and displayed correctly. - **Box number field now accepts numeric input** The edit form correctly parses box numbers as numbers, removing validation errors. - **Facility events keep slots when saved without a horse** The form no longer clears slots when no horse is selected, preserving the event’s slot information. - **Manure calculation brochure now hosted internally** The broken external link is replaced by an internal copy of the RVO brochure. - **Feed reports show quantity units in the selected language** Abbreviations are replaced with localized terms, improving clarity in feed schedules. - **Web app manifest now includes a text description** The description field is a string, eliminating browser warnings. - **Horse auto‑complete runs only when you press the button** The search against external databases is triggered manually, reducing unnecessary backend calls. - **Calendar rider filter now shows only riders from the selected stable** When a stable is chosen, the default rider list is limited to that stable’s horses. - **Connecting bookkeeping services now requires the Accounting module** Attempting to add Moneybird, Exact, Snelstart or Yuki prompts an upgrade modal if the subscription lacks the Accounting feature. - **Signup shows an error when passwords do not match** The repeat password field now correctly displays a mismatch warning. - **Translation job aborts on parser errors and folder file count key fixed** The CI script now stops the build when translation extraction fails, and a missing default for folder‑file‑count is added. - **To‑invoice list on mobile now shows more details** Compact rows display additional information and headers align correctly, making mobile invoicing clearer. - **Fresh portions row remains visible even when stock is zero** The row now shows a dash instead of disappearing, keeping the layout consistent. ## Security - **Prevent open‑redirect attacks and hide PDF token in logs** Redirect URLs are validated to block open redirects, and PDF generation no longer logs the authentication token, improving security. ## Performance - **Native app bundles are now significantly smaller** Startup images and source maps have been removed from native builds, cutting iOS IPA size from up to 39 MB to around 11 MB and Android APK size similarly. - **Horse lists load summaries instead of full records** Filters and lookups now fetch lightweight horse summary data, speeding up pages that previously loaded all horse fields. ## Other - **Repeated orders now default to the most recent order** When creating a repeat order, the system pre‑populates fields with data from the last order, streamlining the ordering process. - **Android build now supports R8 optimisation** The Android project is configured to use the R8 code shrinker. - **TS configuration now targets ESNext modules** The TypeScript project now uses ESNext module syntax. - **feat(breedingPlans): filter on plans without agent / insemination station** - **ResizeObserver loop errors are ignored in error tracking** Benign ResizeObserver warnings no longer create Sentry alerts. - **TS target set to ES2022 and PDF worker loaded from package** The project now compiles to ES2022 and uses pdfjs-dist for PDF handling. - **Release‑notes generator now falls back to alternate Ollama API keys** If the primary key is rejected, the system tries additional keys, ensuring release note generation continues.