at the foot of this file. Without them the module tags silently do not run and nothing here would say so. --> Tonight's Tide Prediction Is Centred on a Sea Level Last Measured in 2001

The Verification Venue · a number that is different tomorrow

The Zero That Stopped Moving

A tide prediction is a sum of waves riding on a single constant, and only the waves get updated. At Boston that constant is mean sea level measured between the years the datums endpoint names. The sea did not stay there. Every figure below is recomputed in your browser from files this site fetched from NOAA within the last few minutes. How old the data in them is varies by four orders of magnitude, and the page prints each one's own clock: the gauge reading is minutes old, the monthly means are weeks, and the datums file has not been rewritten since 2003.

Boston, station 8443970, at the last whole hour

NOAA predicted

loading

above MLLW, from NOAA's published curve

The sea actually was

loading

., six minute gauge

Observed minus predicted

loading

.

Top: amber is what the sea did, blue is what NOAA said it would do. On the tide's own axis they are the same line, because the tide swings three and a half metres and the difference is a few centimetres. Bottom: those two lines subtracted, on an axis where a few centimetres is visible. That lower trace is the whole subject of this page, and over these two days it does not touch zero.

mean gap, 48 h

.

spread

.

across . hourly pairs

hours above the prediction

.

range .

.

The wobble in that band is weather. Wind piles water against a coast, a low pressure system lets it stand higher, and a storm can put half a metre on top of the prediction for a day. Another layer here takes that apart properly, at seventeen stations, and tracks a single surge 3,844 km up the seaboard: The Sea Does Not Look Up. This page is not about the wobble. It is about the line the wobble is wobbling around.

Averaging over twelve months takes most of the weather out, and it does not take all of it out. A wetter or windier than usual year still moves a twelve month mean by a centimetre or two, and this page has no way to remove that and does not pretend to. . That residual is the reason the anchor below matters more than the headline above it: the anchor's miss is checked against an independently published quantity, and the headline's is not.

Twelve months of it

NOAA publishes a mean sea level for every calendar month at every station, computed from its own gauge, on the same MLLW datum the prediction uses. Take the last twelve complete months and subtract the prediction's constant. Weather is in each month; it is not in twelve of them.

The sea, averaged over twelve months, against the prediction's zero

loading

.

The subtraction

.

observed twelve month mean sea level, minus the published zero .

Monthly mean sea level against the published epoch zero
monthmean sea level (m)zero (m)offsetsource

.

.

Where that zero comes from, and when it was last measured

.

epoch field, read live

.

accepted

.

since the last water in it

.

Analysis period as NOAA states it: .

.
datummetres above station datum

There is no term in the constituent file that grows

.

constituents

.

. with non zero amplitude

slowest term

.

.

NOAA's note on the analysis

.

namespeed (deg/h)period (days)amplitude (m)phase GMT

That is the shape of the thing. The astronomy is alive: NOAA re-derived these amplitudes from a recent five year analysis, and the annual and semiannual terms from a twenty year one. The constant they all sit on came from a different file, and its epoch ended in the year the datums endpoint names.

Before any of that is worth believing

A tidal datum is not a model output. NOAA defines mean sea level as the arithmetic mean of hourly heights over the epoch, and mean lower low water as the average of the lower low water of each tidal day over the epoch. NOAA computes the monthly means this page reads from those same hourly heights, so averaging the published monthly means over the epoch years is the same arithmetic, up to the fact that months are not all the same length. That makes the published datum checkable: take NOAA's own published monthly mean sea levels for the epoch years, average them, and see whether the published number falls out. If this page cannot reproduce a number NOAA printed in 2003, nothing else it says should be read.

Two things this check is not, said before the number rather than after it. It is not an independent measurement of sea level: the monthly means and the datum come from the same gauge and the same hourly heights, so what it tests is NOAA's published arithmetic and this page's reading of it, and it would not catch an error present in both. And it is not the whole epoch: the window starts in 1990 because this site's own worker allowlist accepts years from 1990, which is our constraint and not NOAA's. NOAA publishes this station's monthly means back to 1983. What is independent is the comparison underneath, which uses a different NOAA product to predict how far off the reproduction should be before it is run.

preparing

recomputed here

.

NOAA published

.

difference

.

what the difference should be, from NOAA's own published trend

.

the two differ by

.

stated as a difference, not as an agreement, because this page has no error bar that covers it

.

Why an epoch is nineteen years, shown rather than asserted

That anchor tests mean sea level. The forward claim further down this page also names mean lower low water, and those are not the same kind of quantity: one is a mean of heights, the other is a mean of a phase of the tide, so the second moves with the tidal range and the first does not. The tidal range is modulated over the 18.6 year lunar nodal cycle, which is why a National Tidal Datum Epoch is nineteen years long. Rather than say that, the page runs its own reproduction four times, on both datums, over a twelve year window and a nineteen year one, and prints which of the four lands where NOAA's published trend says it should. It uses months this page has already fetched, so it costs no further requests, and it appears once you press the button in the long forward claim below.

datum and windowreproduction misses published by published trend says it should miss bythe two differ by
not computed yet...

Press the button in the long forward claim below and this fills in from months already fetched.

Which zero?

Everything above is one subtraction, and the only thing that makes it interesting is the choice of what to subtract. So make it a control. The same twelve months of NOAA's monthly means go into the same function each time; only the zero changes.

the level the prediction is centred on

the sea, against the zero you chose

loading

the zero itself: . above the current MLLW datum

what that zero is

.

.

.

Two things this page says before they happen

Short, resolves within 48 hours

.

Long, resolves when NOAA changes one field

not computed yet

MSL on station datum ours

.

NOAA today: .

MLLW on station datum ours

.

NOAA today: .

the prediction's new zero ours

.

NOAA today: .

This page's headline offset falls by . on the day that happens.

.

The numbers marked ours are this page's arithmetic on NOAA's data. They are not NOAA figures and must not be read as official government material. NOAA has published none of them.

The check, and everything in it that is a choice rather than a fact

Is the data actually current?

An HTTP 200 with a well formed body and a recent Last-Modified header is not freshness. Two sources in this wave were caught returning exactly that over data that stopped years ago. So every feed here is judged on the newest timestamp inside the data, and the page refuses rather than reports if any of them is older than its own stated cadence allows.

What the HTTP headers say, and why we do not use them. Three of the four NOAA endpoints this page reads send no Last-Modified header at all, and the tide data API explicitly sends Cache-Control: no-cache with an expiry in 1970. Only the sea level trends CSV carries a real one. So the shared kit reports "cannot be determined" for the rest, which is the honest answer, and this page keeps its own clock from the newest row in the data and labels it as ours.

The free choices, named

This is not a trend estimate, and here is the arithmetic anyway

.

No line is fitted anywhere on this page. The headline is one published number subtracted from another. The rate above is that difference divided by a time, printed because a reader will do the division anyway, and it is not the same quantity as a regression over a century of data. For what happens when you do start fitting lines to records like this one, see Every Trend You Could Draw.

The datum does not matter, which is the surprising part

Switch NOAA's datum parameter from MLLW to MSL, STND or NAVD88 and both the prediction and the observation move by the same constant, so observed minus predicted is unchanged and everything here survives. The trap is the name: NOAA's "MSL" datum is itself the frozen epoch value, so a reader who assumes it means present mean sea level will get the sign of all of this backwards. That is the same mistake as the fourth radio button above, wearing a label that sounds authoritative.

The one thing this page rests on that your browser cannot check

Everything above depends on a single sentence: that the constant term of NOAA's published prediction curve is mean sea level minus mean lower low water over the epoch. This page reads both of those from NOAA's datums file and it reads the constituent file to show that no constant lives there. Neither of those touches the prediction curve itself. The direct test is to average a whole year of NOAA's own published hourly predictions, over which the periodic terms cancel, and see whether the constant falls out.

The browser cannot do it. This site's worker allowlist caps the tide feed at 48 hours of the curve per request, and 48 hours is not a whole number of tidal cycles, so a mean over it is not the constant. Rather than assert the sentence and move on, the verifier fetches a full year of NOAA's published hourly predictions directly, on its own run and not on yours, and checks two things with it: that the mean of the curve equals the published zero, and that the amplitude NOAA actually synthesises for the principal lunar term is different in two years nine apart, which is the 18.6 year nodal modulation the constituent file does not contain. Both numbers are printed by the verifier and stored in the record on every run. It is the one load-bearing fact this page takes from an instrument other than itself, and it is named here rather than buried.

Running it yourself

node research/the-zero-that-stopped-moving/verify-the-zero-that-stopped-moving.mjs

It imports this page's zero.js unmodified, recomputes every number above from the same feeds, asserts the refusal paths against deliberately broken and deliberately stale fixtures, and appends a line to research/the-zero-that-stopped-moving/record.jsonl, which is append only and carries the score of every forward claim this page has made.

Where all of this came from

This page makes 0 requests, all of them to this site's own worker, which holds a fixed allowlist and talks to NOAA on our behalf. Your browser never contacts NOAA, and NOAA never sees you.

Has it moved since you were here?

.

.

.

The exact upstream URLs behind this page

.
Sources, licence, and what this page is not claiming

Sources. All data is NOAA Center for Operational Oceanographic Products and Services (CO-OPS): the station datums and harmonic constituents from the metadata API, water level, tide predictions and monthly means from the Data API, and the published linear sea level trends table. Station 8443970, Boston, Massachusetts.

Licence. United States Government work, public domain. NOAA National Ocean Service. NOS requests that attribution be given whenever its material is reproduced and re-disseminated, and this page gives it. NOS also states that its information "shall not be modified in content and then presented as official government material", which is why every number this page computes rather than reads is marked as ours.

What this page is not claiming. It is not claiming NOAA is wrong. A tidal datum is supposed to be a fixed reference, and a reference that moved every year would be useless for the charts, the flood maps and the property boundaries that depend on it. It is not claiming the offset is uniform along the coast, or that it is the same at any other station, because it has only measured this one. It is not claiming a rate. And it is not claiming the twelve month offset is all sea level rise: a wetter or windier than usual year moves a twelve month mean by a centimetre or two, which is why the anchor above matters more than the headline.

Robots. Both NOAA hosts were checked before any code was written. tidesandcurrents.noaa.gov/robots.txt returns HTTP 404 and api.tidesandcurrents.noaa.gov/robots.txt returns HTTP 403 from the API gateway, which has no such route. Neither host publishes a Disallow. The responses and the times they were fetched are committed in research/the-zero-that-stopped-moving/robots/.

above are load-bearing. Without them the module tag silently does not execute and every readout on this page stays on its placeholder. -->