Skip to main content

April 2026 Release

· 7 min read
Sven Verweij
Project Manager @ NMI

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)

  • addFertilizerApplication and updateFertilizerApplication now accept the application value through a p_app_amount_display parameter, interpreted in the fertilizer's own unit instead of always kg/ha. The function converts to kg/ha internally for storage.
  • getFertilizer, getFertilizers and related functions now also return p_app_amount_unit.
  • getFertilizerApplication, getFertilizerApplications and related functions now additionally return p_app_amount_display and p_app_amount_unit for display purposes. The original p_app_amount (in kg/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_unit have 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 nsupply and dyna, 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)

  • exchangeToken now correctly returns tokenResponse.access_token. The previous camelCase property returned unknown.

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 fieldMetrics could be null has 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) in withCalculationCache are now fire-and-forget. This eliminates an INSERT bottleneck 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 getSomething functions.
  • Drop pglite: Support for pglite has 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 undefined crop 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 to undefined.
  • When Microsoft sign-in does not provide an email address, users are asked to use the magic link instead. Both fdm-core and fdm-app were updated to support this flow.
  • turf imports 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, and fdm-rvo have 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.