RSS

// Thanet Beach Conditions

I wanted to know if the sea's actually worth the drive before I get there. Air temp, wind, rain chance, water temp, waves, tide times, daylight and UV, air quality and pollen, live sewage status and last season's water quality rating, for every beach on the Thanet coast, in one page, with a one-sentence verdict at the top so you don't have to read the rest unless you want to.

Also: tide times, next few high and low waters, from the nearest ADMIRALTY tide station.

Hope you find it useful too.

Beach

Loading…

Air temp: - Feels like: - Wind: - Rain chance: - Conditions: -
Water temp: - Wave height: -
Daylight: - - - UV index: - Sun cream: -
AQI: - Pollen: -
Currently: -
- -
-
Status: -
Last season's rating: -

That's last year's official Environment Agency classification, not today's, the live sewage status above is today's signal. For the full picture (release history, exact outfalls) check Southern Water's Beachbuoy.

Using this

The verdict at the top is a few short sentences built from everything below it, worst signal wins. An active or recent sewage discharge always overrides everything else, then no daylight (it always cautions against swimming in the dark, whatever else looks fine), then a "poor" water quality rating, then a rough sea (waves 1.5m or over), then a plain "looks good" if none of those apply, folding in the live air temperature, conditions, water temperature, current tide state, UV index and sun cream call where they're available, and always naming the sewage status outright. Each part (the headline, the caveat, the live conditions) is picked at random from its own pool and stitched into proper sentences with real conjunctions, not comma-spliced fragments, so a refresh doesn't read like a templated report. It's a quick first read, not a replacement for the detail underneath.

Weather and sea data come from Open-Meteo, refreshed live, no API key involved. Wave height and water temperature come from their marine forecast model, which is coarser near the coast than the weather model, treat it as a good estimate rather than a buoy reading. Wind direction is the 8-point compass reading of where it's blowing from, useful for judging onshore versus offshore. Rain chance is the forecast probability for the current hour, not a run of the day, it can jump around from one refresh to the next as the model updates.

Sun also comes from Open-Meteo: daylight is their own live day/night flag, not a sunrise/sunset calculation done here. The row underneath it counts down to whichever's next: "Dark in" and a time if it's currently light, "Daylight in" and a time if it's currently dark. UV index is a forecast-model value rather than a measured one, same caveat as the wave height. Sun cream is this page's own read of that UV index against the WHO's standard bands (SPF not essential under 3, SPF 30 from 3, SPF 30+ from 6, SPF 50 from 8, SPF 50+ and avoid midday sun from 11), not a substitute for your own judgement on skin type and time in the sun. That row's hidden entirely after dark, since a sun cream recommendation doesn't mean anything with no sun out.

Air quality is Open-Meteo's own air quality service, a separate free endpoint from the weather one. AQI is the European Air Quality Index (0-20 Good, 20-40 Fair, 40-60 Moderate, 60-80 Poor, 80-100 Very Poor, 100+ Extremely Poor), a modelled estimate rather than a monitoring-station reading. Pollen only shows the single highest-count species (grass, birch, alder, mugwort, olive or ragweed) in grains/m³, Open-Meteo doesn't publish an official Low/Moderate/High banding for pollen the way it does for AQI, so no scale is applied here, just the raw count. Pollen data is European-only and seasonal, it can read as unavailable or zero outside a species' season.

Water quality comes from the Environment Agency's official bathing water classification, sampled weekly through last year's bathing season (May to September) and given one rating for the whole season. It tells you whether this beach is generally clean, not whether it's clean today, that's what Beachbuoy is for. It's baked into this page rather than fetched live, the EA's API doesn't send the CORS header a browser needs to call it directly, and the rating only changes once a year regardless.

Tides come from ADMIRALTY EasyTide, via each beach's nearest of the three Thanet tide stations (Margate, Ramsgate, Broadstairs). EasyTide's own endpoints are unauthenticated but don't send a CORS header either, so this page's own server fetches them instead of the browser doing it directly, through tide-proxy.php sitting alongside this file. If tides stop working, that's the first thing to check. The "Currently" state (High tide, Low tide, Coming in, Going out) is worked out from the same prediction data, not fetched separately, anything within 30 minutes of a high or low counts as being "at" it, otherwise it's moving between the two either side of now. The countdown underneath it counts down to whichever's next, and disappears inside the last 10 minutes, at that point "Currently" already covers it.

Live sewage status comes from Surfers Against Sewage's live storm-overflow feed (found via the browser's own network requests against sas.org.uk/sewage-map, not a documented public API, so it could change without notice). Each beach's status is the worst of any outfall SAS's own data names as affecting it, or within 6km, whichever catches more, since SAS's field listing which beaches an outfall affects gets truncated for outfalls with a long list. That means it can occasionally flag an outfall that isn't really upstream of a particular beach. Treat it as a heads up, not a guarantee, and check Beachbuoy for the full picture. If it's discharging or recently has, this page also shows time since the last discharge, but that field is empty on every live record checked so far, including active ones, so it'll likely read "not provided by this feed" rather than an actual time until SAS's data starts populating it. "Recently discharged" is most likely within the last 48 hours, that's SAS's general policy for how long an alert stays active after a discharge stops (following WHO guidance on how long elevated bacteria can persist), but that's not confirmed as the exact definition for this specific field. The same 48-hour window works the other way round too, "Not discharging" most likely means no discharge in the last 48 hours specifically, not that the outfall has never discharged.

To do

  • De-duplicate outfalls in the "nearby outfalls checked" count. SAS's feed has more than one record for some named locations (multiple monitor points at the same facility), so the count can look higher than the number of distinct places.
  • A yearly reminder to re-check the baked-in water quality ratings once the EA publishes the next bathing season's results (usually around November).
  • °F / mph-kmh-knots unit toggle.
  • Cache results in localStorage rather than just in memory, so reselecting a beach within the same visit doesn't always re-fetch.
  • The SAS sewage feed URL was found via the browser's network tab against a live page, not a documented API, keep an eye on it in case it moves.

Changelog

2026-07-16

  • Initial release: 13 Thanet bathing water beaches (Minnis Bay to Ramsgate Western Undercliffe), live weather and sea conditions via Open-Meteo, last season's EA water quality rating (baked in, the EA API has no CORS support), link out to Beachbuoy for live sewage status.
  • Added tide times (next 4 high/low waters) via ADMIRALTY EasyTide, routed through a small PHP proxy (tide-proxy.php) since EasyTide's endpoints don't send CORS headers either, even though they're unauthenticated.
  • Added live sewage discharge status per beach, from Surfers Against Sewage's live feed (fully CORS-enabled, no proxy needed). Matches each beach to nearby outfalls by name and by distance, since SAS's own beach-list field is truncated for outfalls affecting several beaches.
  • Fixed the status logic: an offline monitor no longer outranks other nearby outfalls confirming "Not discharging". A confirmed clear reading now wins over an unrelated offline one; only an actual discharge (or everything being offline) takes priority.
  • Split the sewage status detail into separate lines (outfall count, worst outfall, and time since last discharge when there's an active/recent discharge to report).
  • Added a caveat line under "Recently discharged" status noting that's typically within 48 hours per SAS's general alert policy, not confirmed as the exact definition for this specific feed.
  • Added the mirror caveat under "Not discharging" status: typically means no discharge in the last 48 hours specifically, not "never".
  • Added a plain-English swim verdict at the top of each beach's card, one sentence, colour-coded. Sewage takes priority over everything else (an active or recent discharge always wins), then a poor water quality rating, then rough seas, then a clear "looks good" if none of those apply.
  • Verdict sentence now picks randomly from a handful of phrasings per outcome instead of one fixed sentence, and the "good" outcome no longer uses green (kept for the water quality rating scale only), it's orange instead.
  • Verdict sentence dropped its "rated X last season" water quality callout (that's already shown below it) in favour of the live air temperature, conditions and water temperature, folded into whichever phrasing gets picked.
  • Verdict sentence rebuilt to mix an opener with a separate closing clause instead of picking a whole fixed sentence, multiplying out the possible results, and every outcome now names the sewage status explicitly (discharging, recently discharged, not discharging, or unclear).
  • Added a current tide status (High tide, Low tide, Coming in, Going out), worked out from the existing tide prediction data rather than a separate fetch, shown in the Tides section and referenced in the verdict sentence too.
  • Removed bold weight from the stat row labels, the site never uses bold text.
  • Added a Sun section: live daylight status (light/dark) and UV index from Open-Meteo, plus a sun cream recommendation (no SPF needed up to SPF 50+ and avoid midday sun) worked out from the WHO's standard UV index bands.
  • Verdict sentence now folds in daylight, UV index and the sun cream call too, and darkness gets its own caution: if there's no daylight right now, the verdict says so and advises against swimming, regardless of how everything else looks.
  • Rebuilt the verdict as several proper sentences instead of one long comma-spliced fragment, e.g. "It's not a good idea to swim in the dark but the tide's coming in and sewage isn't discharging." instead of a flat list joined by commas.
  • The Sun section's "Sun cream" row is now hidden entirely after dark instead of showing "n/a (dark)", it wasn't telling you anything useful.
  • Added wind direction (8-point compass) and rain chance for the current hour to the Weather section.
  • Added a Daylight left row to the Sun section: counts down to sunset if it's light, or to the next sunrise if it's dark.
  • Added an Air quality section: European AQI and the highest-count pollen species (grass, birch, alder, mugwort, olive, ragweed), from Open-Meteo's separate air quality API. Pollen's shown as a raw grains/m³ count with no Low/Moderate/High banding, Open-Meteo doesn't publish one to back that up.
  • Added a countdown under the tide "Currently" line: "High tide in: 2h 14m" or "Low tide in: 45m", worked out from the same prediction data. Hidden entirely inside the last 10 minutes before the event, where it stops being useful.
  • Fixed the countdown's colour: "High tide in:" was rendering in the same orange as the value instead of matching the light label colour every other stat row uses.
  • Fixed two more values that weren't orange like the rest: "Conditions" was stuck on a leftover muted style, and the nearest tide station name wasn't styled as a value at all.
  • Reworked the "Daylight left" row into "Dark in:" (while it's light) or "Daylight in:" (while it's dark), instead of a static "Daylight left:" label with a value that sometimes read "daylight in 5h 14m" underneath it.

I'd love to tell you more.