The landing learns about ships
Two days ago the ships side of the network got receivers, a decoder, a ladder and a page of its own at /ais. When that shipped I wrote down a decision: leave the recruiting landing at feed.skydex.online alone, because it is the aircraft network's site by its own headline, and rewriting it for two bands would make it nothing in particular.
That was wrong, and the operator said so plainly: the page is shared. Both bands register through the same door, get the same perks, are measured by the same uptime contract and land on the same leaderboard page. What they have in common is larger than what separates them. A landing that stays silent about half of what we accept isn't focused, it's inaccurate.
So the landing now covers both.
Two doors, side by side
The hero used to carry one config line. It carries two blocks now, one per band. Aircraft keep the ultrafeeder line they always had. Ships get both ways in: AIS-catcher's own -H flag, and plain NMEA over UDP for every other decoder, which needs no account at all.
Directly under them is a sentence that had no home before: an ADS-B receiver does not hear ships, and an AIS receiver does not hear aircraft. Different band, different antenna, different decoder. This is the single most common confusion we've seen, and it cost a feeder in Louisiana a long evening of debugging perfectly healthy hardware. A site with both antennas registers twice, once per band, and gets two station pages with two sets of numbers.
Numbers per band, and none where we haven't measured
The stats strip is now two labelled groups. Aircraft figures come from the ADS-B ingest, ship figures from the AIS network endpoint. They are the same two sources the /adsb and /ais hubs read, so the landing can't quietly disagree with either of them.
One number is asked for rather than computed: the distinct hulls the network heard. Summing what each station heard would count the same ship once per receiver that heard it, and the whole point of the ladder is that it never does that.
The rule about empty bands is the one we already apply everywhere else. If we counted and the answer is none, the band recruits instead of printing a row of zeros. If the request failed, nothing renders at all, because "we heard nothing" and "we couldn't count" must not look identical to somebody deciding whether to point an antenna at us.
The "who is feeding" table is split the same way. The two ladders rank separately, so a mixed list would print a position calculated inside one band next to a station from the other.
Two bugs found on the way
Rewriting a page means reading it, and reading it turned up two things that were live.
The first: the script that draws the station table was sitting inside the <script type="application/ld+json"> block in the page head. Browsers don't execute that block. So the "who is feeding" section never rendered, not once since it was added, and the structured data was invalid on top of it because there was JavaScript after the JSON object. The page looked fine. Nothing errored. The section simply stayed hidden, which is exactly what it does when the network has nothing to show, so it never looked broken.
The second: the aircraft statistics counted every registered receiver and every country any receiver stands in, without asking which band it feeds. An AIS station in a country with no ADS-B receiver was inflating the aircraft network's reach, here and on /adsb. Both counters are filtered now. The founding-feeder count deliberately isn't: the first twenty stations that actually delivered are the first twenty, whichever band they deliver on.
What we're not asking you to do
Keep feeding whoever you feed. On the aircraft side that's the usual crowd, on the water it's aiscatcher.org, AISHub and MarineTraffic. AIS-catcher can send to its own community hub and to us at the same time, and if you feed AISHub you get a key to their data back, which is worth having whether or not you feed us. We're applying to them with our own receiver for the same reason.
We ask for one more output. Never for an exclusive one.