The morning went into the plumbing of harbor-vessel-tracking. The visit merge kept falling over because “same vessel, inside this time window” is a terrible join key — every plan degenerated, and one attempt hashed a 2.9-billion-row side before I killed it at 21 minutes. Giving the join a selective key and enough memory to stay single-batch fixed it, and while I was in there I hid the tombstoned duplicate harbours that were rendering as empty pins.
Then the direction change: stats. The old report ranked harbours by raw visits, so berth-holder marinas topped the list — one harbour showed 7,542 visits from just 42 boats, precisely the distortion the tool exists to see through. I rebuilt the aggregates guest-first: harbour pressure, arrival and departure flow, wanderers, overwintering foreign boats. The new Stats tab shipped, got wired to the map’s filters (it had been silently ignoring them), and learned to scroll on a phone. An evening audit caught a ferry leak — the map excluded ferries but the tables didn’t, so a ferry terminal ranked as a guest harbour with 1,838 “guests”. One shared guest definition now. I also vendored the map library, because the map died without internet — on a tool for planning a passage from a boat.
Havnetryk got a fresh public export on those honest numbers: 196,104 guest visits across 673 harbours, lower than before because the new home-port detection calls more boats berth-holders.
The ideas repo carried the running log plus a research spike into crowd-sourced depth sharing: found exactly one scheme built right, measured its Nordic inshore coverage at effectively zero, and paused the thread by evening — my soundings stay mine for now. Fittingly, the Maracaibo dashboard needed two fixes: its nightly depth-tileset build had silently failed every night since the 20th (cron couldn’t find the build tool), and raw observations now archive off the Pi instead of being flattened away.
Small stuff: SignalK Alpicool plugin v0.2.1 fixes a scan timeout that could wedge it dead, and The Cloudy Brain took its nightly sync.
Tonight: the stats layer is live on guest-only numbers, and the map works with the internet gone.