← All projectsPROJECT 002 / VERIFIED

NHS Pulse.

Hospital performance, with the evidence behind every number

A hospital performance measure only becomes useful when its period, scope and denominator are clear. I built NHS Pulse to connect published NHS statistics with the engineering needed to investigate them reliably.

WORKSPACE8 screens
A&E HISTORY36 monthsOctober 2023–September 2026
DIAGNOSTICS12 releases
BED RETURNS4 quartersOvernight and day-only collections
GEOGRAPHY36 ICBsOfficial April 2026 boundaries
WAREHOUSEPostgreSQL / PostGIS
01 / CASE STUDY

Make the reporting contract visible

NHS England publishes hospital statistics across separate collections. A&E describes monthly attendances and waiting-time outcomes. KH03 reports quarterly average beds and occupancy. DM01 describes diagnostic activity and waiting lists. Combining them requires more than joining files: each collection has its own scope, release calendar and denominator.

NHS Pulse keeps these distinctions visible while connecting national analysis, provider investigation, geographic comparison, forecasting and source operations in one workspace. Every headline measure includes its reporting period and a route back to the official release.

A connected national performance view

A connected national performance view
A connected national performance view
The deployed workspace shows monthly A&E activity alongside a separately dated quarterly capacity reference.
02 / CASE STUDY

Official publications become versioned analytical evidence

Source contracts
CollectionReporting grainEngineering treatment
A&EMonth × provider × department typeBooked appointments included in headline scope; DTA waiting bands kept separate from arrival-to-departure performance
KH03 bedsQuarter × provider × specialtyAverage daily beds converted to bed-days using the actual quarter length
DM01 diagnosticsMonth × provider × commissioner × testProvider and commissioner projections remain non-additive; NONC activity excluded from NHS-commissioned analytical scope
Geography and organisationsVersioned boundaries and effective relationshipsOfficial ONS polygons, ODS metadata and dated provider/ICB assignments

The September 2026 A&E headline reconciles to 2,444,743 attendances. The August diagnostics waiting list reconciles to 1,827,219 after excluding 5,851 non-NHS-commissioned records from the raw extract. These reconciliations are executable checks rather than manually entered dashboard values.

03 / CASE STUDY

Separate collection, publication and consumption

NHS Pulse analytical platformVERIFIED
  1. 01Official publicationsNHS England files · ODS · ONS boundaries
  2. 02Discovery and immutable evidencePublication calendars · conditional requests · SHA-256 source versions
  3. 03Validation and atomic publicationContract checks · denominator reconciliation · quarantine · revision lineage
  4. 04PostgreSQL / PostGISRaw evidence · reference relationships · analytical facts · SQL marts
Analytical workspaceFastAPI · Next.js · charts · exports · provider drill-down
Geographic analysisOfficial ICB / region polygons · effective assignments · accessible tables
Forecasts and investigationsRolling-origin evaluation · model registry · bounded read-only analyst tools
Reader, worker and migration roles have separate responsibilities. A page reload reads published data; collection runs independently.

Downloaded evidence and normalized facts are immutable. A new checksum creates a release version; validation precedes an atomic switch of the analytical publication pointer. Identical content produces a no-change event. Invalid releases retain the last valid published view, with the failed checks available in Data Operations.

04 / CASE STUDY

Investigate variation without losing the denominator

The workspace supports reporting-month, region and department filters; provider search, sorting and comparison; quarterly bed analysis; and CSV exports carrying release provenance. Department-specific views withhold DTA bands because the official file publishes those bands at provider-total scope.

Geographic intelligence using official boundaries

Geographic intelligence using official boundaries
Geographic intelligence using official boundaries
ICB comparisons use dated provider assignments. Headquarters are not treated as service catchments, and earlier periods without an applicable crosswalk remain unavailable.

Quarterly capacity with explicit denominators

Quarterly capacity with explicit denominators
Quarterly capacity with explicit denominators
Overnight and day-only returns retain their quarter. Occupancy is calculated from matched occupied and available bed-days.
05 / CASE STUDY

Evaluate before extrapolating

Attendance forecasting compares a seasonal-naïve benchmark with damped seasonal exponential smoothing. Expanding rolling origins start with 24 training months. Selection uses MAE and WAPE over the first three horizons; horizon-specific held-out errors define empirical uncertainty intervals.

Rolling-origin evaluation on 36 published months
CandidateMAE · attendancesWAPE
Seasonal naïve64,713.552.73%
Damped seasonal ETS49,452.142.09%

Horizons with fewer than six calibration errors are withheld. A seasonal level-shift screen flags recent changes that require a source-comparability review. The model registry retains its training releases, evaluation results and scope. These forecasts describe aggregate published activity, not individual waits or available beds.

Forecasts with an explicit evaluation basis

Forecasts with an explicit evaluation basis
Forecasts with an explicit evaluation basis
Historical observations, held-out predictions and uncertainty intervals are presented with model methodology and calibration coverage.
06 / CASE STUDY

Questions resolve to bounded database evidence

The analyst uses nine typed, read-only tools for metric definitions, aggregate queries, period and provider comparisons, geography, forecasts and publication status. It cannot submit arbitrary SQL. Numerical grounding checks compare its answer with tool results, while evidence records preserve the supporting release identifiers.

Signed visitor sessions isolate investigation history. Persistent per-visitor allowances and a shared daily budget bound provider usage. The server holds the DeepSeek credential; operational changes require a separate administrator key.

An investigation workspace with source evidence

An investigation workspace with source evidence
An investigation workspace with source evidence
The analyst combines questions, private investigation history and an evidence inspector in one view.
07 / CASE STUDY

Publication-aware operation on a small hosting footprint

A stateless scheduled runner checks source-specific due times against the official publication calendar. Daily discovery accelerates around announced releases; weekly audits revisit published history. Organisation enrichment, boundary refresh and forecast retraining operate independently of website traffic. Successful checks and new observations remain separate events.

The deployed system uses Vercel for the frontend, a free Render API service and Neon PostgreSQL/PostGIS. Docker Compose provides the reproducible local stack. Automated checks cover parsers, missingness, revision publication, rollback, immutable evidence, tool safety and responsive browser interactions.

Source operations and publication lineage

Source operations and publication lineage
Source operations and publication lineage
The operations workspace exposes source calendars, collection history, checksums, validation and publication versions.
08 / CASE STUDY

Interpretation follows the evidence

  • Published statistics describe historical reporting periods and do not represent current hospital conditions.
  • Provider scope and organisational changes affect comparisons. Rates require comparable definitions and matched denominators.
  • Forecast intervals use a limited historical sample and do not guarantee future coverage.
  • Free hosting can introduce a cold start. Collection runs independently, so a sleeping web service does not stop scheduled discovery.
04 / LET’S TALK

Got a difficult
dataset?

Let’s figure out what
it is trying to tell us.