Placeholder copy — the real write-up goes here.
It started with a question you could answer by looking out of a window: where are all the bikes, actually? Not right now — over a week. Over a month. Do they end up at the station every evening, or does somebody drive them there?
The setup
The app talks to a fairly ordinary JSON endpoint, and the endpoint is happy to tell you where every available bike is. Ask it every few minutes for long enough and you have a movement dataset nobody intended to publish.
# every five minutes, politely
curl -s "$ENDPOINT" | jq '.bikes[] | {id, lat, lng}' >> snapshots.ndjson
A cron job, a Postgres table, and roughly four hundred megabytes later, some things were obvious.
- Bikes drift downhill across a day, and get driven back up overnight
- Three stations are effectively a car park for the rebalancing van
- The city centre is empty by 08:40 on weekdays and nobody is surprised by this
None of this is secret. It is just nobody’s job to look at it.
On being polite about it
Slow interval, no login, nothing personal, no attempt to get at anything the app would not show a normal user standing on the street. It is a hobby, not a stress test.