Skip to main content
Building in Public

Every feature. Every fix.

We're replacing a 20-year monopoly in UK flood hydrology software. Follow every decision, every line of code, as we build the platform practitioners actually deserve.

6,951

Tests passing

16

Packages

848

Commits

27 Jul 2026

Last updated

Changelog

What we shipped, fixed, and improved — week by week.

Week of 21 Jul 2026
Improvement

UK statutory return periods are now the default set

New analyses compute 2, 5, 10, 20, 30, 50, 75, 100, 200 and 1000 years — the set used by the Environment Agency’s own Flood Estimation Report template (LIT 65087). Q25 has been removed; Q20, Q30 and Q75 have been added.

  • Q30 is statutory in England and Wales and was previously missing. Q25 is a North American convention with no standing in UK practice
  • Saved analyses are unchanged — an existing assessment keeps the return periods it was computed with, both in the app and in its report
  • Regenerating a stale analysis adopts the current defaults, so a re-issued report will not match the return-period table of the original. Check the table before re-issuing to a client
  • Return periods remain fully selectable per analysis; only the default changed
27 Jul
Feature

Review workflow: durable lifecycle, a reviewer worklist, and the EA competence level

Requesting a review used to send an email and log an event, but persisted no state, so nothing tracked whether the request had been actioned. Review state is now persisted against the analysis, surfaced as a worklist on the dashboard, and given its own tab in the assessment workspace.

  • Lifecycle states — requested, in review, changes requested, complete, cancelled — are stored append-only, so the trail is auditable rather than overwritten in place
  • “Reviews awaiting you” on the dashboard aggregates across every project you are assigned to review
  • Review is now the third top-level tab in the workspace (Analysis · Maps · Review) instead of being appended to the bottom of the decision tree
  • Reviewer assignment is project-scoped, so a standalone analysis had no way to get a reviewer. Its Review tab can now attach it to an existing project or create one, after which the normal reviewer controls apply
  • The reviewer’s 1–5 grade has been replaced by the Environment Agency’s three-level analyst competence rating (Flood Estimation Guidelines v10, September 2025, §1.3). The 1–5 scale had no defined meaning and described the wrong thing — competence is a rating of the person doing the work, not a mark on the submission
27 Jul
Fix

Report maps render at a uniform scale, and both maps now reach the report

The report’s catchment map stretched its basemap whenever the catchment’s aspect ratio differed from the printed frame, because the mosaic was resized to fill while the boundary overlay was projected independently. The render window is now expanded to the output aspect and centred, so one scale applies on both axes.

  • Measured distortion before the fix ranged from 0.21× to 15.3× depending on catchment shape, and the printed scale bar was derived from the horizontal span alone
  • The QMED donor map is now a report figure in its own right, ranking donors by the same size law as the interactive map, and suppressed entirely when the donor transfer was not adopted
  • A figure gallery in the Maps tab shows the static figures this analysis will contribute, each with its caption, key, attribution and provenance, plus a tight / standard / wide framing control that round-trips into the render
  • The renderer version sits inside the hashed audit record, so this changes the record hash for every saved analysis whose report carries a catchment map. Existing sign-offs will read as not matching and need re-signing, and a previously signed report cannot be finalised again until it is
27 Jul
Fix

You are no longer locked out of your own work

Three access defects fixed under one rule: ownership is a floor, and a role row can only ever add rights, never subtract them.

  • A project owner who was also named a reviewer of their own project was denied mutation inside it — the role check returned before the owner grant was ever reached, and the denial surfaced as a 500
  • A standalone analysis has no project, so no reviewer can ever be assigned to it, and its author could never finalise their own report. Owners can now finalise and sign off their own work, with “Send for review” offered alongside rather than as a gate
  • An analysis is owned by whoever saved it, never inherited from the project it sits in. The inheritance sweep was re-running on every server cold start against the shared database; measured misattribution on our own development database was at or near zero and no ownership record was rewritten
  • A manual amendment no longer has to clear a review before the report can be finalised. The record is unchanged — who amended, when, the generated original and its hash, the amended text and its hash — and a section still only reads “Reviewed” when a reviewer is actually recorded against it
26 Jul
Fix

Amended descriptors were ignored on the ungauged route

On an ungauged assessment, editing a catchment descriptor changed what was displayed but not what was computed. QMED, the donor adjustment, the pooling group, growth curves, design flows and ReFH all kept using the descriptors as originally imported, and nothing disclosed it.

  • If you amended descriptors on an ungauged assessment before this fix, re-run it. The numbers it recorded were computed from the original imported descriptor set, not the values shown beside them
  • Cause: descriptor overrides were merged onto the catchment in a single pipeline step that only the gauged route runs. The ungauged route has no station to look up, skipped that step, and used the supplied catchment verbatim. Gauged analyses were never affected
  • A display-layer change made this harder to spot rather than causing it — amended values were swapped into the rendered descriptor table, so the area could visibly update while the flows beside it did not
  • Both routes now apply overrides through one shared helper, so they cannot diverge again
25 Jul
Feature

A project report is now a report

The compound multi-catchment report had no editor, no revisions, no finalisation and no reviewer surface, and its export was ungated — so an export blocked on a single catchment could be obtained from the project report one navigation away.

  • Editing, drafts, revision history, finalisation, the amendment audit and the reviewer view all work on a project report exactly as they do on a single analysis
  • Compound sign-off is the conjunction of the included catchments’ own sign-offs
  • PDF and Word export is now gated on report finalisation on both surfaces. The gate applies only where a review route genuinely exists — an owner with no team member has no way to obtain a review, so gating them would be a gate nobody could satisfy
  • Reports saved before this change keep resolving; nothing was migrated
25 Jul
Improvement

What the FER carries: design flows, climate, pooling diagnostics, descriptor amendments

A pass over the generated report, closing the places where the app knew something the document did not say.

  • Design flows table: AEP now rides in brackets inside the return-period column — 100 (1.0%) — rather than taking a column of its own, and the recommended-branch table carries the growth factor for every return period it prints. No value is derived differently; this is placement only
  • Climate change: the main section carries Q2, Q30 and Q100 for every epoch and scenario modelled, with the complete epoch × scenario × return-period matrix moved to an appendix rather than a 13-column table in the body. The management-catchment line now states why that catchment was selected
  • Growth curve section gains trend analysis, outlier detection, a pooling eligibility audit and rural L-moments, and each growth factor carries a confidence interval where one is available
  • Pooling exclusions sit with the pooling table instead of a separate block, and each catchment in a project report now carries its own audit record
  • The descriptor amendments table shows the real original values instead of “not recorded”, and amended descriptors are re-validated so the “outside validated range” text beside a value describes that value rather than the one it replaced
  • The “No station exclusions were applied” paragraph no longer prints on every analysis, and no longer once per catchment in a project report. Its absence is the statement; the machine-readable audit record still carries the empty list
25 Jul
Feature

Design hydrograph shapes in the report, with their provenance stated

Three hydrograph-shape sources now reach the report, each carrying what it is and what it is not.

  • Where the ReFH model has actually been computed the report shows the result instead of a “not computed” placeholder. It is headed “ReFH Rainfall-Runoff (2007 / ReFH1 coefficients — research preview)” and states that the estimate is excluded from the adopted flood-frequency estimates. The licensed ReFH2 coefficient release is not implemented and that name is not used
  • Gauged stations with a record in the observed shape field — roughly 519 English stations meeting a minimum event count — can render a design hydrograph on their own observed median shape
  • A closing section shows the shape as a separate chart for Q2, Q30, Q100, Q100 with climate change and Q1000, from a source the analyst chooses
  • Every figure caption states that the shape belongs to the chosen method and the peak comes from the FEH statistical analysis. Peaks are taken verbatim from the adopted design-flow branch and never recomputed
  • The CEFA source is stamped RESEARCH PREVIEW — NOT AUTHORISED FOR PRODUCTION USE in the heading, the body and every caption, and its authorisation flag is printed in the provenance table. Where a chosen source cannot be built the section does not render at all — no method ever quietly stands in for another
  • On an older analysis without Q30, the nearest computed return period is shown and labelled as what it actually is, with the substitution listed
25 Jul
Feature

Forks and warnings become part of the written record

Explored assessment routes now read as narrative in the report, and analysis flags can be acknowledged with that acknowledgement carried into the FER as evidence.

  • An “Assessment routes explored” section states, per route, what was examined, whether it was adopted, the analyst’s recorded reason with their name against it, and the route’s own QMED, method, growth curve and Q100
  • Every route including the default takes an explicit analyst decision note; the FEH2025 default column itself is now read-only, since branching off it is what forks are for
  • Warnings are no longer one page-dominating block. Descriptor-scoped flags render on the descriptor row they apply to, and the page-level strip collapses once every flag is acknowledged, always stating N open / M accepted
  • An acknowledgement names who accepted the flag and when, and reproduces their reason verbatim. An unacknowledged flag reads “Open — not acknowledged”; nothing synthesises an acknowledgement, and an acknowledgement for a flag the analysis no longer raises is not resurrected into the report
25 Jul
Feature

Environment Agency flood zone and surface water layers on the map

Flood Map for Planning (Rivers and Sea) zones 2 and 3, and NaFRA2 Risk of Flooding from Surface Water, are now toggleable overlays on both the assessment map and the project map. Both are off by default.

  • Served from the Environment Agency’s own endpoints, with the in-app key sampled from each service’s published legend so it matches what the EA renders
  • Both datasets are published above 1:50,000 only, so below that zoom the map states “Zoom in to view EA flood mapping” rather than showing a silently empty layer
  • The catchment boundary is now pinned above every raster layer. Any layer toggled after load — terrain, hillshade, the new flood overlays — previously landed on top of it, and an 85% opacity terrain layer painted it out
  • The 2 m LiDAR ramp moved off a palette whose lower half is blue. Over English lowland relief effectively every pixel rendered blue, which is what collided with the water layers
25 Jul
Feature

Edit a generated report section, without the edit landing in the FER

The block-based report editor is now reachable, and every generated section carries a per-section “Unlock to edit”. The exported FER stays a clean deliverable; the edit trail is kept on our servers for a reviewer to inspect.

  • Sections are locked by default and unlocked one at a time — there is no unlock-all — and “Revert to generated” discards an amendment
  • The exported report renders an amended section as an ordinary section. It carries no “manually amended by” notes and no amendments appendix; that was an earlier design and it has been removed from every export surface
  • The server keeps, per amended section, the machine-generated original and its hash, the amended text and its hash, who amended it and when. A reviewer sees them side by side in a “View report edits” panel, which opens by default when a report has any amendments
  • The Approval and Analysis audit record sections cannot be amended at all — they are the two sections that attest to the rest of the report. Enforced on the server on every save and on every read, not only hidden in the editor
  • Amended content is escaped, so a clean FER still cannot carry injected markup
  • In a project report, section identifiers are anchored to catchment identity rather than to position, so excluding a catchment can no longer silently re-attach commentary about one catchment to another
24 Jul
Fix

Report fixes: stale content, stuck drafts, renames and authorship

Four defects in the saved-report path, all found in testing.

  • Once a report had any saved revision, every surface rendered the frozen first draft and discarded freshly generated content, so an unsigned draft could never pick up anything computed after its first save. Unsigned drafts now refresh under normal edit rights; a signed report keeps its sign-off gate
  • A refresh now discloses what it changed, and a draft that could not be finalised — because commentary was anchored to a section the regenerated report no longer contained — can be recovered or discarded instead of being stuck
  • Renaming an analysis now propagates to its slug, page header, dashboard list and regenerated report. The rename previously wrote to a field that nothing read
  • The report Author is the authenticated user who generated it. It was previously taken from a URL query parameter on the station export routes, and simply blank on saved and project reports
24 Jul
Feature

TK assistant: a chat panel over the saved analysis

The assistant framework shipped without a visible surface. There is now a chat drawer on the analysis workspace and the saved report page, scoped to one saved analysis at a time.

  • Assistant prose is badged “TK · AI — not a computed platform figure”. Tool calls surface as citation chips naming what grounded the answer, and any figure it cannot trace is flagged for you to verify
  • The standing line under the composer: TK navigates and explains; the engine calculates; you decide and sign
  • Anything that would change the working analysis is proposed as a confirm/cancel card describing what it will do, and re-validated on the server when you confirm
  • Every tool is bound to the one analysis in context and to your identity as resolved from your session — the assistant has no way to address another account’s work
  • Conversations, including the tool calls made and their results, are stored against your account
23 Jul
Improvement

Method Space and decision-tree explanations

A clarity pass over the method-space panel driven by live review, plus the specifics behind the pooling-group diagnostic badges.

  • Units on every heading and annotation; urban treatment reads “Applied (UAF)” or “De-urbanised (rural)” rather than an unlabelled flag; the donor dimension states that it is the QMED donor set
  • An always-available glossary defines all seven method-choice dimensions whether or not they happen to vary for the catchment in front of you. Four of the seven could previously have their help text never shown at all
  • Explicit framing that the panel is for sensitivity, not for choosing a percentile: adopt the recommended estimate unless there is a stated reason not to
  • The pooling diagnostic badges carry their specifics — trend direction with the Mann–Kendall p-value, Sen’s slope and the stationarity caveat; outlier count with the flagged water years and flows — instead of the bare words “Trend” and “Outliers”
  • Clicking a point to pin it into the comparison set is now stated rather than being an undocumented affordance
23 Jul
Improvement

Dashboard entry points, and a database chip that was wrong everywhere

The dashboard now leads with the three ways to start an assessment, and two smaller corrections landed alongside it.

  • New Analysis (ungauged, from FEH XML or descriptors), Multi-Catchment Project, and Gauged Analysis via the station explorer now head the card grid, with the other tools following
  • The “Database: SQLite” chip was wrong in every environment including production Postgres. The health endpoint had deliberately stopped reporting its backend to unauthenticated callers, and the chip read the missing value as SQLite
  • On the confirm steps, Inspect details and Confirm are now an equal-height pair that take their hierarchy from fill against outline rather than from size
  • An expired session on an analysis deep link returns you to the dashboard instead of bouncing you back to the page that logged you out. Invites, projects and report links still restore
22 Jul
Week of 14 Jul 2026
Feature

Project-wide 2 m LiDAR maps and auditable FER exports

Added one consistent terrain-layer and export contract across catchment, donor, pooling, and project maps, with the same deterministic map artifact used in HTML, PDF, and DOCX reports.

  • 2 m LiDAR is lazy and zoom-gated, with explicit topographic fallback when coverage or tiles are unavailable
  • Current-view export is bound to the addressed map; standard export uses validated saved geometry
  • Saved reports share one captioned artifact and seal recipe, boundary, renderer, and fallback metadata at sign-off
  • Artifact preparation runs outside QMED and pooling persistence so map failures cannot roll back analysis saves
14 Jul
Week of 7 Jul 2026
Fix

Donor URBEXT eligibility follows WINFAP DonorURBEXTMax

The default maximum urbanisation for a QMED donor is now the subject catchment’s own URBEXT2015, matching WINFAP’s DonorURBEXTMax rule — replacing the previous flat 0.030 gate. A donor may no longer be more urbanised than the catchment it is adjusting.

  • Affects descriptor-based QMED with donor transfer on subjects whose URBEXT2015 differs from 0.030; gauged/AMAX QMED is unaffected
  • Urban subjects (URBEXT2015 > 0.030) now admit more donors — verified against WINFAP parity fixtures; rural subjects admit fewer, the WINFAP DonorURBEXTMax parameter semantics (subject URBEXT2015, no floor — as used by the parity harness) extended consistently to rural subjects; full rural-side WINFAP validation awaits a reference export
  • Analysts can still override the threshold manually in the overrides panel; only the default changed
  • QMED lock-down parity (97 tests) unchanged — they already pinned this rule explicitly
11 Jul
Week of 24 Feb 2026
Feature

Expanded QMED pathway coverage with FDC-statistics estimation

Added an additional QMED estimation route from flow-duration statistics for short-record and data-transfer workflows.

  • New QMED path supports Q5DMF, Q10DMF, DPSBAR, and gauged-flow BFI inputs
  • Method selection and reporting now include this route where complete inputs are provided
  • Input validation and fallback behavior hardened for partial or invalid inputs
25 Feb
Fix

Issue #243 parity refinements for SM2025 studies (for testing)

Improved candidate shortlisting consistency for modern descriptor runs to reduce divergence during external cross-checking. This item is currently marked for testing.

  • Shortlisting now prioritises the SM2025 similarity metric when available
  • Fallback behavior remains in place where modern descriptors are incomplete
  • Regression tests added for shortlist ordering and branch selection behavior
  • Issue #243 remains open until tester parity validation completes
25 Feb
Infrastructure

Railway hydro-faucet production alignment

Aligned hydro-faucet connectivity across preview and production with explicit environment checks and deployment runbooks.

  • Standardised HYDRO_FAUCET_URL handling for Vercel + Railway deployments
  • Added operator checklist for smoke verification and rollback readiness
  • Preview and production checks now include protected hydro endpoints
25 Feb
Fix

Auth continuity hardening for magic-link sessions

Fixed redirect loops after login by tightening host canonicalisation, server-side magic-link verification, and cookie domain handling.

  • Protected pages now preserve session continuity across dashboard, projects, and map-data
  • Authenticated users are redirected away from /login correctly
  • Added regression coverage for auth guards and protected route behavior
24 Feb
Feature

Entitlements and quota enforcement across compute routes

All compute and report entry points now enforce account entitlements with free-tier limits and server-side unlimited whitelisting.

  • Default account quota: 5 assessments
  • Unlimited usage for approved organisation/domain accounts
  • Blocked over-quota attempts are logged for audit and support
24 Feb
Improvement

Bulk upload moved to a dedicated dashboard workflow

Bulk import is now a first-class dashboard flow with clearer controls for naming, project placement, and import intent.

  • Bulk upload is no longer hidden inside the generic assessment flow
  • Improved UX for large batch descriptor and boundary ingestion
24 Feb
Infrastructure

Provenance capture and admin governance actions for imported data

Added data lineage tracking for bulk imports and internal governance tools to review, reconcile, and clean imported records.

  • Provenance metadata tracks archive and file lineage
  • Admin cleanup paths added for legacy or unlinked import records
  • Comparative export workflows expanded for multi-branch analysis outputs
24 Feb
Feature

Project intelligence: boundary map and catchment search

Project detail pages now include boundary-aware map views and search utilities so large project libraries are easier to navigate.

  • Catchment and place search improves project-level discoverability
  • Boundary rendering and map fit behavior hardened for mixed datasets
24 Feb
Improvement

Hydro service resilience and scheduled health monitoring

Improved degraded-mode handling when hydro services are unavailable and added automated monitoring/sync checks.

  • UI now surfaces hydro availability status rather than failing silently
  • Scheduled smoke monitoring and sync checks documented for operations
24 Feb
Week of 17 Feb 2026
Feature

Project workspaces with invite-based collaboration

Introduced project ownership, invite-based sharing, and per-user workspace isolation to keep active jobs separated by account.

  • Invite acceptance is tied to registered email identity
  • Cross-user project access now requires explicit project grant
  • Dashboard navigation is now project-first for faster team workflows
23 Feb
Feature

Bulk descriptor and boundary ingestion at production scale

Expanded import support for ZIP/XML/CSV/CD3 descriptors and multi-file shapefile boundaries with safer parsing and reprojection.

  • Batch ZIP ingestion handles mixed archives and links boundaries to analyses
  • Improved validation and error feedback for failed or partial uploads
  • Boundary layers persist and reload with saved analysis records
23 Feb
Feature

Map-data viewer and hex-grid integration

Unified station mapping with a hydro-faucet-backed hex grid layer and dedicated map-data explorer for fast catchment interrogation.

  • Hex layers can be toggled and queried by map viewport
  • Map stability improved for worker loading, bounds handling, and layer order
23 Feb
Improvement

Project management upgrade across dashboard and analysis

Added project detail pages, move/duplicate flows, report links, and stronger naming metadata for large analysis portfolios.

  • Project assignment and analysis naming are now explicit throughout the flow
  • Direct report links available from dashboard and analysis views
  • Project cards and map detail panels improved for faster triage
23 Feb
Infrastructure

Billing foundation scaffold for paid plans

Added the initial Stripe checkout, subscription webhook wiring, and dashboard billing panel to support paid rollout.

23 Feb
Feature

Decision journey canvas and parallel branch workflows

Shipped staged, confirmable analysis steps with side-by-side forked branches and a clearer audit trail for route comparison.

  • Fork-on-edit preserves baseline branches for transparent comparisons
  • Sticky navigation and contextual headers improve long-session usability
  • Decision Journey section added to exported report pages
20 Feb
Fix

Cloud runtime and build reliability hardening

Stabilised deployment/runtime behavior to reduce production regressions on hosted environments.

  • Moved ephemeral caches to /tmp for read-only hosting environments
  • Patched feedback widget behavior when integration tokens are unavailable
  • Resolved post-merge type/build regressions in analysis UI
20 Feb
Feature

FEH report proforma completion — all 11 standard sections

Added the 4 missing FEH technical note sections: Summary & Conclusions, Method Selection rationale, pooling diagnostics (D_i, H, Z tables), and descriptor attribution. Plus ReFH (research preview) initial conditions table, recommended branch marking, and OS grid reference in header.

  • PDF quality: page breaks, A4-safe chart widths, page footer with station name
  • Markdown download endpoint for non-PDF workflows
  • PDF route now uses saved analysis cache — no 10-15s re-run on download
  • Configurable author name via query parameter
19 Feb
Improvement

SSE progressive panel reveal — QMED in ~3s, not 15s

Analysis panels now appear progressively as data arrives via Server-Sent Events. The QMED panel renders within ~3 seconds instead of waiting for the full 10-15 second pipeline to complete.

  • Each panel appears as its *:ready event fires (qmed:ready, pooling:ready, etc.)
  • Donor candidate fetch shows live n/total progress counter
  • Step-key sync test prevents frontend/pipeline naming drift
19 Feb
Feature

Interactive QMED & growth curve selection with instant recompute

Click any QMED method or growth curve row to select it — design flows recompute instantly in the browser with zero server round-trip. Branch capture lets you snapshot the current state for comparison.

  • Fixed pooling "Rerun with modified group" losing all client-side state
  • Pooling exclusions now flow through SSE overrides instead of router.push()
  • Active overrides summary callout shows what was changed
19 Feb
Improvement

Decision tree intelligence — Z-stats, heterogeneity, AI suggestions

The decision tree sidebar now surfaces computed analysis intelligence: goodness-of-fit Z-stat badges, heterogeneity H colour-coded, discordant station counts, trend/outlier warnings, Q100 inline, and ReFH vs statistical comparison.

  • Z-stat badges: green (OK) / amber (FAIL) on each growth curve node
  • Heterogeneity H: green (<1) / amber (1-2) / red (>2) on pooling node
  • Two new AI suggestion rules: ReFH vs stat Q100 >30% discrepancy, short AMAX record
  • Warning and suggestion count badges in tree toolbar
19 Feb
Feature

Station detail page (/stations/[stationId])

Dedicated shareable station detail route with mini MapLibre map, AMAX summary statistics (mean, max, min, CV), and rule-based data quality warnings.

  • Quality warnings: short record, high rejection rate, urban, lakes, missing 2025 descriptors
  • "Run Analysis" button links directly to /analyse/[stationId]
  • "Full Details" link added to map slide-up panel
19 Feb
Fix

Equation comparison donor bug fix

Fixed the SM2025 donor-adjusted column showing the wrong number. Was applying SM2008 adjustment factor to both columns — now correctly uses the distinct SM2025 donor adjustment value.

  • Panel moved from bottom of page to immediately after QMED section
  • Donor methodology comparison explains SM2008 direct ratio vs SM2025 de-urbanise/re-urbanise
  • Shows "2025 descriptors unavailable" notice when appropriate
19 Feb
Infrastructure

Turbopack module resolution fix

Stripped .js extensions from all 148 internal imports across the monorepo. Turbopack doesn't perform the .js to .ts rewrite that tsc does — extensionless imports work for both.

19 Feb
Week of 10 Feb 2026
Improvement

Frontend polish — responsive layout, scroll sync, error handling

Mobile-responsive sidebar with hamburger drawer, decision tree scroll-to-panel on branch selection, map loading skeleton, error boundary on StationMap, and beforeunload warning for unsaved analysis state.

  • AEP toggle persisted in Zustand (survives panel switches)
  • Team pricing CTA now links to contact email
13 Feb
Fix

ReFH coefficient alignment with UKFE R

Cross-referenced every ReFH parameter against the UKFE R package (CRAN, Anthony Hammond). Found and fixed two discrepancies: Tp regression exponent (-0.25 → -0.28) and alpha parameter now uses season-specific power-law formulas.

  • Tp: 10-16% systematic bias corrected for steep catchments
  • Alpha: winter 1.166×T^-0.073, summer 1.444×T^-0.182 (was log-linear)
  • BL/BR intercept rounding aligned (25.47→25.5, 3.751→3.75)
13 Feb
Feature

SQLite-backed saved analyses

Replaced localStorage with SQLite for persisting saved analyses. No more 5 MB browser limit — save unlimited catchment analyses locally with instant retrieval.

12 Feb
Fix

SM2025 pooling and donor corrections

Pooling group formation now uses SM2025 similarity distance metric when 2025 descriptors are available. 800-year pooling target matches SM2025 specification. Donor selection prioritised by geographic distance.

  • Donor candidate shortlist increased from 20 to 100
  • SM2025 SDM includes BFIHOST as 5th component
12 Feb
Infrastructure

GitHub Actions CI pipeline

Automated testing on every push — 1,019 tests run across all packages in dependency order. TypeScript type-checking included.

11 Feb
Week of 3 Feb 2026
Feature

ReFH summer/winter seasonality

Implemented seasonal initial conditions for the ReFH (research preview) rainfall-runoff model. Winter and summer now produce different Cini (initial soil moisture) and BF0 (baseflow) values, matching UKFE R reference equations.

  • Seasonal Cini equations from UKFE R (distinct winter/summer formulas)
  • Seasonal BF0 with floor clamping for small summer catchments
  • Configurable coefficient architecture — drop-in swap when WHS coefficients confirmed
8 Feb
Feature

Pooling station exclusion with justification

Practitioners can now exclude stations from the pooling group with a mandatory justification note. Exclusions flow through to growth curve recomputation and are recorded in the audit trail.

7 Feb
Fix

Batch fixes — AMAX rejection, station colours, UI polish

Resolved 7 issues in one pass: AMAX values can be rejected/restored, station markers colour-coded by data quality, tree node deduplication, BNG reprojection fix for ungauged catchments, and donor suitability filtering improvements.

  • AMAX rejection updates L-moments and QMED in real-time
  • Ungauged catchments now fall back to descriptor-only QMED
6 Feb
Feature

SM2025 donor adjustment + ungauged pooling

Full SM2025 donor transfer process: de-urbanise donor QMED, compute ratios, re-urbanise final result. URBEXT2015 urban expansion factor. Ungauged catchments can now form pooling groups from descriptor similarity alone.

5 Feb
Week of 27 Jan 2026
Fix

BFIHOST19scaled descriptor fix

SM2025 equations require BFIHOST19scaled (not BFIHOST19). Traced the bug end-to-end from NRFA API through client types to the equation inputs. Also fixed AREA to use DTM-derived ihdtm-catchment-area.

  • NRFA provides 3 BFIHOST variants — only bfihost19-scaled is correct for SM2025
  • NRFA provides 2 AREA fields — DTM-derived is what FEH equations are calibrated against
31 Jan
Fix

Median normalisation fix for growth curves

GLO/GEV/GPA scale parameters were mean-normalised (λ₁=1) but FEH growth curves normalise to QMED (median=1). Fixed to match UKFE R median-normalised formulas. ~1-2% growth factor error corrected.

30 Jan
Feature

UKFE R cross-verification suite

Created 23 cross-verification tests comparing our implementations against the UKFE R package (v2.0.0). Verified: QMED (2008+2025), L-moments, GLO, GEV, GPA, Kappa3, non-flood adjustment, SDM, and urban adjustment factor.

  • Found and fixed Kappa3 sign bug in gamma function arguments
  • GEV shape: our Hosking rational approximation is more accurate than UKFE's 2-term polynomial
  • All verified equations match within floating-point precision
29 Jan
Week of 20 Jan 2026
Feature

Non-flood years L-moment adjustment

Implemented the FEH Volume 3 §19 adjustment for stations with recorded non-flood years. L-moment ratios are corrected to account for years where flow was below the perception threshold.

24 Jan
Feature

SCS/NRCS Curve Number + Rational Method packages

Two new calculation packages: @hydrometric/scs (SCS curve number runoff model with unit hydrograph) and @hydrometric/rational (Rational method for small catchments). Plus FSR reservoir routing research.

23 Jan
Feature

4-parameter Kappa distribution

Added the Kappa distribution (4 parameters) to the growth curve fitting engine. Includes the generalised logistic, GEV, and GPA as special cases. FEH reference library documentation added.

22 Jan
Improvement

Comprehensive product review

Full assessment of the platform against the original vision. Identified critical UX gaps, prioritised the roadmap, and documented the gap between calculation engine maturity and frontend polish.

21 Jan
Week of 13 Jan 2026
Feature

PE3/Kappa distributions, ReFH overrides, AMAX editor

Sprint 4 delivery: Pearson Type III and Kappa distributions for growth curves, manual parameter overrides for ReFH (research preview), AEP toggle on design flow table, and inline AMAX series editing with real-time recomputation.

17 Jan
Feature

2025 catchment descriptors + ungauged overrides

Full SM2025 descriptor support: SAAR9120, FARL2015, BFIHOST19scaled, FPEXT. Ungauged catchment workflow with manual descriptor overrides. Observed data label distinguishes gauged vs estimated.

16 Jan
Fix

Pipeline overrides carry through to rerun

Fixed a bug where user overrides (descriptor tweaks, QMED manual entry) were lost when rerunning the analysis pipeline. Overrides now persist through SSE stream and populate on reload.

15 Jan
Coming Next

On the Roadmap

What we're building next. Priorities shaped by practitioner feedback.

FEH DDF Rainfall Model

Full Depth-Duration-Frequency estimation from catchment descriptors. Today the platform uses an empirical growth-curve approximation unless you import a rainfall table from the FEH Web Service, and the ReFH (research preview) engine inherits that approximation.

Reviewer view

A route built for the reviewer rather than the analyst: what the engine produced, what the analyst changed, and why, in one place, with findings recorded against the analysis. The review lifecycle and competence level it hangs off have shipped; the route itself has not.

Catchment boundaries you can generate and correct

Point-click catchments today come from a precomputed national set on the map-data surface. In flight: delineation from the national 2 m terrain at any point on the network, and an editor for correcting a boundary before it drives an assessment.

Want to shape what we build next?

We're in early access. Your feedback drives our roadmap. Join the community and help us build the future of UK flood hydrology.