omahoy.org github

Tides and currentsearly · v0.1MIT

omatide

A tide is not fetched, it is predicted. NOAA measured the harmonic constants at each station over years; from them the height and the stream follow by arithmetic, for as far ahead as you like. omatide downloads those constants once and then works at sea, with the dish off, for years — the tide where the boat is, the stream where the boat is, and the whole of San Francisco Bay at any moment you drag it to.

omatide] an hour on · + zoom · drag to pan
The stream everywhere in the bay, stepped through half a day an hour at a time, then zoomed into the narrows. Blue floods, red ebbs — and they are not the same everywhere at once. No GPS was connected here, so the numbers at the top are the tide at home, the berth in Berkeley.

What it does

The bay is not one tide

High water at the Golden Gate reaches Port Chicago an hour and three quarters later and a third of a meter lower. The stream that is slack off Alcatraz is still ebbing through Raccoon Strait, which turns before either of them. A table of one station cannot tell you that; a chart of the whole bay can.

A dozen of the bay's named places sit within two miles of Angel Island, so the map goes in: scroll or + and - to zoom, drag to pan, double-click for the whole bay. At about five times, every place in the central bay is named, with its speed, on a shore you can recognize. The view is kept over the bay, so the water under the arrows is never ocean.

The shore is a schematic, simplified from the OpenStreetMap coastline to about ninety meters: it is there to say which water an arrow is in. omahelm is the thing you navigate by.

omatidethe whole bay
The whole of San Francisco Bay, from the bar outside the Golden Gate to Dumbarton Bridge and up to Carquinez Strait, with a red ebb arrow at each of the narrows and blue flood arrows still running in Carquinez Strait.
Ebbing everywhere but Carquinez Strait, which is still flooding.

How right it is

Checked against NOAA's own published tables, over seven years spread across the moon's 18.6-year nodal cycle. These are the measured worst errors against those tables; cargo test holds them to a looser bound on every commit — 3 mm, 0.4 cm/s, and ninety seconds at a turn — because a turn is flat and the minute either side rounds differently.

WhatWorst error against NOAA
Tide heights1.3 mm
High and low waterTo the minute
Stream speed0.2 cm/s — four thousandths of a knot
Slack and maximum streamTo the minute

Which is about the size of NOAA's own rounding: heights are published to the millimeter, and a current station's constants to a hundredth of a centimeter a second.

Written from scratch

The arithmetic is Schureman's, in Rust, with no tide library. Three things in it are worth knowing, because none of them is in the textbook, and each was worth a mistake:

Most of the places a sailor names — Red Rock, Point Blunt, Sausalito — are subordinate stations with no constants of their own, only offsets against one that has. omatide warps the reference station's own curve onto the subordinate's turns rather than replacing it with a plain cosine, which keeps the shallow-water lopsidedness that is everywhere in this bay.

On the chart, too

The same arrows draw over the chartplotter. Press s in omahelm and the stream comes on where you are actually looking, thinned so the arrows don't tangle, and the time bar drags the wind and the stream together. omahelm asks omatide for it over a socket; nothing about the tide lives in the chartplotter.

After dark

omatidepress n
The same tide window in Night Watch: the curves, the arrows, the labels and the scrubber all red on black.

omatide takes its colors from the active Omarchy theme and redraws when you switch. n turns this one window red on black, curves and all, and leaves the rest of the desktop alone — the same key, and the same window's own choice, as in omahelm and omalookout.

Nothing in the window depends on color alone: an ebb arrow points the way it sets whatever the palette says, and a ring stands where there is no way to draw — slack water, or a bin NOAA publishes no direction for.

Keys

KeyDoes
[ ]The bay an hour earlier, later; the bar under it drags
0Back to now
+ -Zoom the bay; so does scrolling
DragPan the bay; double-click for the whole of it
HoverWhat that place is, and what to know about it
nNight Watch
q, EscapeClose

Install

Rust and the Omarchy shell. Build it, fetch the constants once, then open the window:

$ git clone https://github.com/shieldsworks/omatide ~/.local/share/omatide/src
$ cd ~/.local/share/omatide/src
$ cargo build --release --locked
$ target/release/omatide fetch   # NOAA's stations, once, a few minutes
$ ./run.sh                       # the window

fetch writes about 380 KB to ~/.local/share/omatide/ and is the only thing that needs the network. scripts/link-plugin.sh puts the bar widget in the Omarchy shell. Which waters to carry, where home is with no GPS, and which bin down the water column to read are in ~/.config/omatide/config.toml; the README covers them.

There is a command line for all of it, which is how the predictions are checked:

$ target/release/omatide current 37.8663,-122.3148
$ target/release/omatide bay --at 2026-09-21T05:40:00Z

Not yet

Theme press T