01What it is
Bikes is a live dock board for any bike-share system that publishes GBFS, the open feed standard, with New York's Citi Bike loaded first. Every station shows its bikes, e-bikes and free docks right now. The board ranks the emptiest and fullest stations, maps the whole system with stations sized by capacity, and keeps the feed's own timestamp on every figure.
It is for riders hunting for a bike or a dock, and for anyone who wants to watch a city's system fill and empty.
02How it works
There is no server behind it (bikes/assets/js/app.js, 517 lines). For Citi Bike the browser reads gbfs.lyft.com/gbfs/2.3/bkn/gbfs.json and follows it to station information and status. For other cities it looks the system up in the CityBikes register and follows the operator's own feed where one is listed. The aggregator's copy is used only when the operator's host will not answer a browser, and the line under the system name says which host drew the board (app.js:1-6, 145-150).
It is careful with the operator's server. Status is re-read every 150 seconds, only in a visible tab, with cache: no-cache so an unchanged file costs a 304. It deliberately does not set If-Modified-Since by hand, because that would trigger a CORS preflight the feed does not answer (app.js:12-16, 512-514). Stations not installed or not renting count as out of service rather than empty, e-bikes are counted apart, and each station's own last-reported time is printed (app.js:8-10, 130-134).
03The test
| UTC | What we did | What came back |
|---|---|---|
| 20:04:11 | Page, local 537 copy | HTTP 200, 57,541 bytes. |
| 20:04:11 | Citi Bike gbfs.json, with an Origin header | HTTP 200, 3,589 bytes in 0.15 s; 12 feeds listed; access-control-allow-origin: *. |
| 20:04:11 | Citi Bike station_status, summarised by the page's rules | HTTP 200, 1,080,157 bytes in 0.06 s, 25 s old, ttl 60. 2,520 stations, 2,421 renting; 38,988 bikes, 19,321 of them e-bikes; 47 renting stations empty, 199 full. |
| 20:04:11 | CityBikes register | HTTP 200, 229,600 bytes in 0.65 s: 815 networks, 274 with an operator feed the board can follow. |
04Against the field
Each comparator was read on its own site on the date shown. We credit what each does better before saying where Bikes goes further.
Citi Bike app and station map
27 Sep 2026, 20:08 UTC: the page timed out (HTTP 504), so we relied on a search of citibikenyc.com and its help centre.
The operator's own app: tap a station for its exact bikes and docks, scan a QR code to unlock a classic bike or e-bike, and find an open dock at the end of a ride.
Where it does better
- It rents you the bike; the board only reports.
- It marks stations holding a charged e-bike.
- It is the operator's own view of its system.
Where Bikes goes further
- Ranks the whole system at once, emptiest and fullest, with system totals (
app.js:27, 235-252). - Prints each station's last report, so a stale station looks stale.
- Nothing to install and no account.
Transit
Fetched 27 Sep 2026, 20:08 UTC.
A transit app with real-time data and trip planning across buses, subways and bikeshare in more than 1,000 cities.
Where it does better
- Plans trips that combine bikeshare with buses and trains.
- One app across more than a thousand cities.
Where Bikes goes further
- Reads the operator's feed directly and names the host it came from.
- A whole-system view rather than the stations near one trip.
CityBikes
Fetched 27 Sep 2026, 20:08 UTC; its API measured at 20:04 UTC.
An open register and API of bike-share networks with a map app, built on the open-source pybikes library.
Where it does better
- It is the register the board relies on for every city beyond Citi Bike.
- Open source, with an API others build on.
Where Bikes goes further
- Where CityBikes lists the operator's own feed (274 of 815 networks), the board reads that feed instead of the aggregator's copy.
05Where it falls short
- A board, not an app: no trip planning, no unlocking, no prices and no account.
- The map is drawn from station coordinates alone, with no streets underneath (
app.js:352-357). - It reads neither system_alerts nor free_bike_status, though Citi Bike's discovery file lists both, so announced closures and dockless bikes are missing.
- It re-reads every 150 s against a declared 60 s lifetime, so it can trail the feed by about two and a half minutes, and it keeps no history.
06Filing note
File underThe state of a whole bike-share system, straight from the operator.
Bikes does a small job with discipline. It goes to the source, prints the source's clock, separates broken stations from empty ones and polls gently. For a ride, use the operator's app or Transit. For the question “where in this city are the bikes right now, and how fresh is that?” the board answers for every station at once, with the feed's own timestamps.
07Spec sheet
| Address | labs.llc/bikes/ |
|---|---|
| Where it runs | In your browser; no server component |
| Sources | Operator GBFS (Citi Bike via gbfs.lyft.com); CityBikes register |
| Refresh | Every 150 s, visible tab only, conditional |
| Remembers | Chosen system, in localStorage and the URL |
| Account | None |
| Measured | 27 Sep 2026, 20:04 UTC |
| Set against | Citi Bike app; Transit; CityBikes |
| Main limit | Reports only; no alerts, dockless bikes or streets |