Your fleet tells you more — port bells, declared status, punctuality
After teaching the fleet to keep destinations and ETAs current, we went through the AIS feed asking a simple question: what else are we already receiving and throwing away? The answer shipped today, in three parts.
The bell rings when your ship makes port
Until now a port call by a ship you track lived only in the activity feed on your fleet page — easy to miss entirely. Now it can land in your notification inbox: "⚓ Odessa Star — Rotterdam, Netherlands". Arrivals only, deliberately: the arrival is the story, and pairing every arrival with its departure would double the noise. There's also a cap of one port bell per vessel per day, so a ferry that crosses six times daily costs you one line, not six.
A second, rarer bell exists for the moments that actually deserve urgency: when a tracked vessel declares itself aground or not under command.
And the whole thing is opt-in, per ship: tracking a vessel keeps it in your feed and history as always, but the bell stays quiet until you switch it on — the 🔔 toggle lives on the ship's own page and on its fleet card. Turn it on for the two ships you genuinely care about, leave the other forty in peace.
The ship's own words
Every AIS position report carries a field we had been ignoring: the navigational status the crew declares — under way, at anchor, moored, fishing, under sail, aground. We now show it wherever the ship shows: on the 3D plate in flight and on the fleet card ("🟢 live · ⚓ moored").
It also made port detection smarter. Before, we inferred "arrived" purely from being slow near a city — and a moored ship whose GPS jittered above the speed threshold could fake a departure. Now the crew's own declaration is evidence: a ship that says moored is in port even if we sampled it at an odd moment, and a speed spike alone no longer counts as leaving while the ship still declares itself tied up.
Was it on time?
Yesterday's update stores the ETA the crew promised. Today's closes the loop: when a tracked ship arrives at the port it declared as its destination, we compare promise against fact and stamp the result — "⚓ Arrived Rotterdam · 14 h late" — in the movement log and the activity feed. We only judge when the declared destination actually names the arrival city; a cryptic "NL RTM" stays unjudged, because no verdict beats a wrong one.
Two smaller things round it out. The movement log now shows dwell time — "🚢 Departed Hamburg · 26 h in port" — computed from the arrival/departure pairs we already record. And your fleet page gains a port passport: the distinct ports your fleet called at over the last thirty days, with visit counts and countries. Thirty days because that's how long we keep port events; a lifetime passport is a possible follow-up if this one proves fun to watch.
None of this required a single extra byte from upstream — it's all data the ships were already broadcasting and we were already paying to receive. We just stopped throwing it away.