April 2026 Release
The April 2026 release reworks how fertilizer application amounts are recorded and displayed — moving from a single kg/ha convention to fertilizer-native units — and introduces a new Mineralisatie Labs feature backed by a Mineralization module in fdm-calculator. RVO field import becomes available to all users, the Atlas gains an advanced cultivation history view, and Gerrit receives a crop-specific preferences skill and a field-level plan explanation. The release also includes a number of performance, reliability, and tooling improvements that have been published as hotfixes since the previous release.
Fertilizer Application Units
Fertilizer application amounts are now expressed in the unit that is natural for the fertilizer in question — for example liquid manures in m³/ha and granular fertilizers in kg/ha — rather than always in kg/ha. This removes the need for users to convert amounts before entering them.
FDM Core (@nmi-agro/fdm-core)
addFertilizerApplicationandupdateFertilizerApplicationnow accept the application value through ap_app_amount_displayparameter, interpreted in the fertilizer's own unit instead of alwayskg/ha. The function converts tokg/hainternally for storage.getFertilizer,getFertilizersand related functions now also returnp_app_amount_unit.getFertilizerApplication,getFertilizerApplicationsand related functions now additionally returnp_app_amount_displayandp_app_amount_unitfor display purposes. The originalp_app_amount(inkg/ha) is still returned, so existing read-side consumers continue to work unchanged.
FDM Application (@nmi-agro/fdm-app)
- Application amounts in forms and tables are shown in the fertilizer's native unit.
FDM Data (@nmi-agro/fdm-data)
- Default values for
p_app_amount_unithave been added to the BAAT catalogue.
Mineralisatie and the Mineralization Module (Labs)
A new Labs feature, Mineralisatie, makes it possible to inspect mineralization at farm and field level using the MINIP and DYNA models. The feature is enabled through a PostHog feature flag.
FDM Calculator (@nmi-agro/fdm-calculator)
- A new Mineralization module exposes the NMI API endpoints
nsupplyanddyna, providing the calculation backbone for the Mineralisatie feature.
Atlas and Cultivation History
FDM Application (@nmi-agro/fdm-app)
- Advanced cultivation history view: The field-detail page in the Atlas now offers a tab control to switch between the existing simple timeline ("Eenvoudig") and a new advanced view ("Uitgebreid"). The advanced view shows, in a spatial flow diagram, which cultivations have been grown in earlier years on the geometry of the current field. Because that geometry may previously have belonged to a different parcel arrangement — a single larger field, several smaller fields, or other layouts — the view makes clear which cultivations covered which part of the current geometry. The selected tab is persisted in session storage.
- Cultivation history items are now correctly sorted by descending year.
- A persistent "Not a FlatGeobuf file" error caused by browser HTTP cache poisoning is now resolved automatically: the FGB fetch is retried with
nocache=true, recovering without user action.
RVO Field Import
FDM Application (@nmi-agro/fdm-app)
- Importing fields from RVO with eHerkenning sign-in is now available to all users. It is no longer behind a feature flag.
- The RVO OAuth callback redirect has been fixed: after eHerkenning sign-in users now return to the originating RVO page instead of the application root.
FDM RVO (@nmi-agro/fdm-rvo)
exchangeTokennow correctly returnstokenResponse.access_token. The previous camelCase property returnedunknown.
Shapefile Import
FDM Application (@nmi-agro/fdm-app)
- Shapefile upload is now also available after a farm has been created, not only during the farm-create wizard. A review table presents the differences between the uploaded parcels and the existing fields — additions, changes and removals — so the user can evaluate them before merging. The flow mirrors the eHerkenning RVO import.
Gerrit — AI Fertilizer Planning Assistant (Labs)
FDM Agents (@nmi-agro/fdm-agents)
- Crop-specific preferences: A new skill lets Gerrit take crop-specific fertilizer preferences into account when proposing a plan.
- Constrained planning: When constraints prevent satisfying every objective, Gerrit now prioritises supplying nitrogen, phosphorus and potassium over achieving a positive organic-matter balance.
- A type issue where
fieldMetricscould benullhas been fixed.
FDM Application (@nmi-agro/fdm-app)
- Each field in the generated plan now carries a short field-level explanation, providing more insight into why Gerrit proposed a particular set of applications.
Performance and Reliability
FDM Core (@nmi-agro/fdm-core)
- Calculator cache contention: Cache writes (
setCachedCalculation) and error logging (setCalculationError) inwithCalculationCacheare now fire-and-forget. This eliminates anINSERTbottleneck that previously caused PostgreSQL lock contention and ~90 s timeouts on the nitrogen balance page under concurrent load. - Database indices: Missing indices have been added on the field-acquiring and -discarding, cultivation-starting and -ending, fertilizer-catalogue-enabling, and cultivation-catalogue-selecting tables, improving the performance of the corresponding
getSomethingfunctions. - Drop pglite: Support for
pglitehas been removed; it is not used and there are no plans to use it.
FDM Calculator (@nmi-agro/fdm-calculator)
- GeoTIFF deposition fetches in the nitrogen-balance data collection now run outside the database transaction, freeing the database connection during HTTP and raster operations and reducing connection-pool pressure.
- A bug in the organic-matter supply calculation where
undefinedcrop residues yielded zero supply has been fixed; supply is now correctly calculated for residues that are not explicitly removed.
FDM Application (@nmi-agro/fdm-app)
- The SSR stream timeout has been raised from 90 s to 150 s to prevent React stream aborts for farms with many fields.
UI and Workflow Improvements
FDM Application (@nmi-agro/fdm-app)
- The cultivation and field-count list on field-selection Atlas pages becomes scrollable when there are too many cultivations to display, ensuring that the "Sla geselecteerde percelen op" button is always reachable.
- The buffer-strip filter on rotation tables works again. Search terms and the buffer-strip filter selection are now shared between the field and rotation tables, and the shared state is reflected consistently in the UI.
- The sorting of harvests within a multi-cut cultivation (for example grassland) in the rotation table has been corrected.
- The "Gewasresten achterlaten" input is now only shown when the cultivation belongs to the cereal crop-rotation category (
b_lu_croprotation === 'cereal'); when hidden its value defaults toundefined. - When Microsoft sign-in does not provide an email address, users are asked to use the magic link instead. Both
fdm-coreandfdm-appwere updated to support this flow. turfimports have been narrowed so that only the modules actually used are loaded.
Technical Improvements
- TypeScript v6: All packages in the monorepo have been bumped to TypeScript v6.
- Build tooling:
fdm-calculator,fdm-agents,fdm-core,fdm-data, andfdm-rvohave been migrated from rollup to tsdown. - Faster cold dev start: Heavy transitive dependencies that workspace packages pull in are now pre-bundled, so they are processed once instead of on every cold dev start.
- Docker images: The application Docker build now installs production dependencies only, reducing image size.
- Vite 8 / react-router: The application has been updated for Vite v8, including the corresponding react-router configuration changes.
For a detailed list of changes, please refer to the package-specific changelogs for fdm-app, fdm-calculator, fdm-core, fdm-data, fdm-rvo, and fdm-agents. Feedback and contributions are welcome on our GitHub repository.
