How it works

  1. 1

    Check the outfalls

    Every 15 minutes our server asks Thames Water which storm overflows on the River Lea, Bow Creek and the Thames are spilling sewage.

  2. 2

    Measure rain, river and tide

    At the same time it collects rainfall from the Wanstead Park rain gauge, the river level at Lea Bridge and the tide level at Silvertown from the Environment Agency.

  3. 3

    Collect past spills

    Past spills come from Thames Water's monitors, published by the Environment Agency. The records start in January 2024 and give the time each spill started and stopped.

  4. 4

    Link spills to rain and tide

    For each spill we add up the rain that fell at that outfall in the 24 hours before it started, using Open-Meteo's weather history. We also work out whether the tide was rising or falling at that moment, from tide data for the Thames estuary that we checked against the Silvertown gauge.

Live data we use

These APIs (online services that send data to our server) keep the site up to date.

Thames Water

Open Data API: storm discharges

The list of storm overflow outfalls, where they are, and whether each one is spilling right now.

Used for: outfalls, live spills

data.thameswater.co.uk

Environment Agency

Real-time flood-monitoring API

Rainfall at Wanstead Park, river level at Lea Bridge, and tide level at Silvertown, measured every 15 minutes.

Used for: rain, river level, tide

environment.data.gov.uk/flood-monitoring

Environment Agency

Flood warnings

Current flood alerts and warnings for Greater London.

Used for: flood alerts

environment.data.gov.uk/flood-monitoring

Open-Meteo

Weather history and forecast APIs

Hourly rain at each outfall for past spills, plus the rain forecast and soil moisture, which tells us how wet the ground already is.

Used for: rain before each spill, wet catchment

open-meteo.com

Open-Meteo

Marine weather API

Hourly tide heights in the Thames estuary since 2024. We shift them by about two hours to match the Silvertown gauge, which gives the high and low tide times for past spills. They agree with the gauge about 96% of the time.

Used for: where it goes

open-meteo.com/en/docs/marine-weather-api

RainViewer

Weather radar API

The latest rain radar images, showing where it is raining right now.

Used for: rain radar

rainviewer.com

Historical data

Environment Agency

Event Duration Monitoring: start and stop data

The time each storm overflow in England started and stopped spilling, as reported by the water companies.

Used for: past spills

environment.data.gov.uk

How the Live map forecast works

The map estimates where sewage released by storm overflows is likely to be in the River Thames now and over the next 7 days, and how certain that estimate is. The dropdowns below explain every step so you can check, reuse or challenge it. The numbers shown in highlighted boxes are read directly from the map's settings file, so they always match what the map is using.

In brief
  1. Which overflows are spilling? Thames Water's Event Duration Monitoring (EDM) feed says which storm overflows are discharging now and when each last started and stopped.
  2. Which will spill? Hourly rain forecasts for each overflow give a chance of a new spill over the next 7 days.
  3. Where does it go? Each spill is followed down the river as a series of small "parcels" moving at a speed derived from measured river flow, and — below Teddington — washing back and forth with the predicted tide.
  4. How much is left? Bacteria die off over time and the sewage spreads out along the river.
  5. How certain is it? The whole calculation is repeated times with the uncertain inputs varied each time. The spread of the results gives the likely range and the chance of each level.
The traffic light

The status for your spot is the headline of the map. It turns the detailed model results (see “Levels and units” and “Uncertainty and likelihood” below) into one of three lights, using the same rules on the map, the 7-day outlook, the share card and the WhatsApp updates.

What the risk refers to. Every light is a sewage risk: how likely it is that sewage from storm overflows is in the water on your stretch. Sewage carries germs, so it is a health risk if you swallow river water or it gets into cuts. It is not a measured water-quality result, and it does not cover other hazards (cold water, currents, boat traffic, blue-green algae). The same meaning applies to right now, to each hour of the next 24 hours, and to each of the next 7 days — where a day shows its highest hourly sewage risk.

LightShown when…What it means for you

Your stretch. The status covers your spot and the river up and downstream of it (± 1, 3, 5 or 10 km — you choose). A stretch takes the status of its riskiest point, because sewage at one end can drift to the other with the flow or tide.

Each day in the 7-day row shows the worst hour of that day (UK time). Hover or focus a day for how many hours are affected and when it peaks.

"Certainty" (High / Medium / Low) is the share of the varied model runs that agree there is sewage (moderate or worse) when the light is amber or red, or that there isn't when it's green: High = at least of runs agree, Medium = at least , otherwise Low. A red light with "Low" certainty means the model thinks it is possible but the runs disagree — worth checking again later.

Why 30%? A one-in-three chance of sewage is treated as enough to warn you. This is a deliberately cautious choice (risk.probability), not a scientific threshold; it can be changed once the model has been checked against water samples.

Colours are never the only signal: each light also has a symbol (✓ low, ! moderate, ✕ high) and a written label, so the status is readable in greyscale, for colour-blind users and by screen readers.

Data
InputSourceUpdatedUsed for
Overflow status, last start/stopThames Water EDM open data API (the only live source: the Environment Agency publishes spill records after the event, not live)~15 minObserved spills
River flow (m³/s)Environment Agency real-time flood-monitoring API15 minRiver speed
Predicted high waters, 7 daysADMIRALTY EasyTide predictions (London Bridge), via the Rain To Spill backenddailyTide timing below Teddington
Observed tidal level (fallback)Environment Agency flood-monitoring API15 minTide timing if ADMIRALTY unavailable
Hourly rain forecast, daysOpen-MeteohourlyForecast spills
Past spill recordsRain To Spill spill-event database. First choice: the Environment Agency's published Event Duration Monitoring records for Thames Water (start and stop times in GMT), imported by the project. Added to these: spills logged from Thames Water's live feed since the site started runningas imported, then ~15 minHow spill-prone each overflow is: the percentile rank of its total spill hours over the last year
River centrelineOS Open Rivers (WatercourseLink)twice a yearDistances along the river

Positions along the river are measured as chainage: kilometres downstream from the source at Thames Head along the OS Open Rivers centreline (about 341 km to the outer estuary; the tidal limit at Teddington is about 243 km).

The model, step by step

Spills become parcels

Every minutes that an overflow is discharging, it releases one parcel carrying w = 0.25 spill-hours (one time-step). Forecast spills release one parcel per hour. Overflows on tributaries join the Thames at the nearest point on the centreline after a delay:

tdelay=doff-river×svtrib

where d is the straight-line distance to the Thames, s = converts it to channel length, and vtrib = m/s. Overflows more than km from the Thames are left out. A spill still running is assumed to continue for more hours.

Movement in the non-tidal river

River speed at each point comes from the latest flow Q at the nearest Environment Agency gauge upstream, using a hydraulic-geometry power law:

v=a·Qb,vmin≤v≤vmax

with a = , b = (60 m³/s → ~0.4 m/s; 300 m³/s → ~0.7 m/s). Each parcel moves v·Δt downstream every step.

Movement in the tidal river (below Teddington)

Water in the tidal Thames moves upstream on the flood tide and downstream on the ebb. Each parcel has a slowly drifting mean position m plus a tidal displacement:

c(t)=m(t)−E2cos(2πt−HWprevHWnext−HWprev),dmdt=unet

HWprev and HWnext are the predicted high waters either side of time t, so the tide follows the real 7-day ADMIRALTY predictions rather than a fixed period. E = km is the distance a parcel travels between low and high water; unet = km/day is the slow seaward drift. Parcels cannot pass upstream of Teddington weir.

Die-off

Faecal bacteria die off in river water. A parcel's remaining load after age hours is

L=w·10−age/T90

T90 = h is the time for 90% to die. Laboratory river-water studies found 99% die-off of E. coli in about 2–3 days at 15–25 °C, which is a T90 of roughly 24–36 h; die-off is slower in colder water.

Spreading

Sewage spreads along the river as it travels. Each parcel is spread as a bell curve whose width grows with age:

σ2=σ02+2D·age

with σ0 = km and dispersion D = km²/h.

The impact index

The index at river position x and time t adds up every parcel's spread-out remaining load:

I(x,t)=∑parcelsLp2πσpexp(−(x−cp)22σp2)

It is calculated every km along the river and every minutes, from hours ago to hours ahead.

Levels and units

The index unit is spill-hours per kilometre (SH/km), after die-off. 1 SH/km means the sewage from one hour of overflow discharge spread evenly along one kilometre of river, before any of it has died off.

LevelIndex range (SH/km)What it could look like

This is a relative index, not a bacteria count. EDM records whether an overflow is discharging, not how much, so every spill-hour counts the same and the levels cannot yet be converted to E. coli per 100 ml. For comparison, the legal standards for inland bathing waters are, for E. coli: Excellent ≤ 500 and Good ≤ 1,000 cfu/100 ml (95th percentile), Sufficient ≤ 900 cfu/100 ml (90th percentile). Calibrating these levels against water samples taken at known index values is the next step for this project; until then, treat "high" as "much more sewage than usual is likely here", not as a measured exceedance.

Uncertainty and likelihood

Many inputs are uncertain: how much each overflow actually releases, how fast the river flows, how quickly bacteria die, how much it will rain. Instead of one answer, the model runs an ensemble:

  • Central estimate — one run with every input at its typical value, and forecast spills counted in proportion to their chance (a 40% chance of a 1-hour spill counts as 0.4 spill-hours). This is the line on the chart and the default river colour.
  • further runs — each input is drawn at random from the range below, and each forecast spill either happens or doesn't. Runs use a fixed random seed per hour so the map and the WhatsApp alerts agree.
Uncertain inputHow it varies between runs

From those runs, at every point and hour the map reports:

  • Likely range (10th–90th percentile): 80% of runs fall inside it. The shaded band on the chart.
  • Standard deviation (SD): the typical spread around the ensemble mean.
  • Chance of a level: the share of runs at or above that level. "60% chance of MODERATE or worse" means 60% of runs reached 0.15 SH/km or more.

Because several inputs are skewed (for example a spill can be much larger than typical, but not much smaller than zero), the ensemble mean is usually a little higher than the central estimate. The range widens further ahead because rain forecast errors grow by per day of lead time. With runs, chances are reported in steps of about ; treat them as approximate.

The next 24 hours: rain and tide

Under the traffic light, a strip shows the next hours for your stretch, hour by hour. It gives context; the light itself still comes from the model above.

  • Sewage — the traffic light for each hour (the worst point on your stretch).
  • Rain — the hourly rain forecast (Open-Meteo), averaged over forecast points within km of your spot. Strength follows the American Meteorological Society definitions: light up to 2.5 mm an hour, moderate 2.6–7.6 mm, heavy over 7.6 mm. Less than mm counts as dry. When more than mm is forecast in 24 hours, the summary says rain could set off overflows. Rain falling further upstream matters too; the model includes that, the strip does not.
  • Tide — high (▲) and low (▼) water times. ADMIRALTY predicts them for London Bridge (Tower Pier); for other places they are shifted by the Port of London Authority's average time differences (for example, high water is about 31 minutes later at Putney Bridge and about an hour later at Richmond and Teddington), interpolated along the river. Downstream of Greenland Dock and upstream of Teddington the nearest listed difference is used, so times there are approximate. Rising means the water is flowing upstream, so sewage from overflows below you can be carried up to you; falling means it is flowing towards the sea. Above Teddington Lock the river is not tidal. The curve between the labels is smoothed: the real Thames rises faster than it falls, so use the labelled times.

If ADMIRALTY data is unavailable, high waters are extrapolated every 12.42 hours from the last known one and low water is put halfway between; the summary then says "approx.".

7-day spill forecast

For each overflow and each forecast hour, the rain over the hours before (R) gives a chance of spilling:

p=psite1+exp(−(R−R50)/k)

R50 is the rain that gives half the site's maximum chance and k sets how sharply it rises. Below mm the chance is zero. Where they come from depends on the overflow:

  • Overflows with a rainfall threshold from this project's analysis (the "What sets them off" page). For every overflow, that analysis records the rain that fell in the hours before each of its past spills. R is the forecast rain over hours. The chance starts at the lowest rain that has set the overflow off (there it is of the site's maximum) and reaches half the maximum at the average rain before its spills, so R50 = that average and k = (average − lowest) ÷ ln((1 − s) ÷ s), with s the starting share, kept between and mm. An overflow needs at least past spills with rain data to be treated this way.
  • All other overflows use one general rule: R is the rain over hours, R50 = mm and k = mm.

Hover over an overflow on the map to see which rule it uses. Limits: the rain before past spills comes from the project's records (Open-Meteo's weather history, or the paired rain gauge for newly logged spills) while the forecast is a weather-model grid value; the average rain before spills is used as the half-way point by judgement, because the record holds only the days an overflow did spill, not the wet days it did not; and one unusual spill can set the lowest value.

psite starts at , is raised or lowered by the overflow's spill record in the EA annual returns when available, and is multiplied by if it spilled in the last 48 hours (a wet catchment spills more easily). Overflow tooltips show the resulting chance of at least one spill in the next 24 hours and 7 days.

WhatsApp alerts

Every 15 minutes the Rain To Spill backend runs the same model and works out the traffic light for each subscriber's stretch, exactly as the map does. Subscribers choose one of three options:

  • Every change, plus early warnings — a message whenever the light changes, and a warning when a rise is forecast within the next 12 hours (with its chance and time).
  • Every change — Low ⇄ Moderate ⇄ High, no early warnings.
  • High only — when the stretch turns red or stops being red.

Each message gives the new and previous status, the main overflow responsible, the 7-day row of lights, what to do, and a link that opens the map on that stretch with the full forecast. To avoid flip-flopping, an improvement must last 60 minutes before it is announced; a rise is sent straight away. At most one message per hour, except a rise to red. Between 22:00 and 07:00 only rises to red are sent; anything else waits until morning. Replying STATUS gives the current light, the next change, the week ahead and nearby public sightings.

Public sightings

River users can report what they see. Reports appear on the map for days and are counted in WhatsApp STATUS replies. They are unverified and are not fed into the model; in future they could be used to check and calibrate it. No names, contact details or IP addresses are stored. To stop automated spam, the form uses Google reCAPTCHA v3, which runs invisibly and gives each submission a score; low-scoring submissions are rejected. reCAPTCHA is only loaded when you open the report form. For serious pollution, also report it to the Environment Agency (24-hour hotline ).

Your data
  • Your location is used in your browser to find your spot. It is only sent to the server if you submit a sighting (the sighting's position) or sign up for WhatsApp updates (your chosen spot).
  • Saved spots are stored only in this browser (local storage). Clearing your browser data removes them; they are never uploaded.
  • Postcode search sends the postcode you type to postcodes.io to find its location. When you type three or more letters in the search bar, the text is also sent to two free place-search services — postcodes.io (Ordnance Survey place names) and Photon by komoot (OpenStreetMap) — to find towns, neighbourhoods and clubs near the river. Nothing else about you is sent with it.
  • Embedded status cards on club websites show the same model estimate and store nothing about visitors.
  • Sightings store what, where, when and your optional note — nothing that identifies you.
  • WhatsApp updates store your number, stretch and choices until you reply STOP, which deletes them. Unconfirmed sign-ups are deleted after 48 hours.
  • reCAPTCHA (report form only) is provided by Google under its Privacy Policy and Terms of Service.
Limitations
  • No measured volumes: EDM gives duration only. Strength is treated as unknown (see the uncertainty table).
  • EDM monitors can be wrong or offline; offline monitors are excluded unless configured otherwise.
  • Other sewage sources (treatment works final effluent, misconnections, boats, rural run-off) are not included.
  • The river is treated as one line: no mixing across its width, no side channels, no tributary flows except as a travel delay.
  • One tidal excursion for the whole tidal Thames; in reality it varies along the river and between spring and neap tides.
  • The uncertainty ranges are judgement-based and should be narrowed by comparing with water samples.
  • Clock changes: some past spill times in the project database were stored without allowing for the change between GMT and British Summer Time, so they can be an hour out. This barely affects how spill-prone an overflow looks (durations are unchanged) and shifts the 24-hour rain total before a spill by one hour. The Environment Agency's records, which are in GMT all year, are treated as the reference.
All parameter values

Read live from Website/shared/river/config.js. Change them there and this table and the map update together.

References