Chasing a 1947 trolley with a cron job
June 28, 2026 transit building
Philadelphia has these gorgeous 1940s PCC streetcars that still run on the Girard Avenue line. Not always, though. Most days you get a regular bus. Some days, with no announcement, the vintage trolleys roll out, and if you're a person like me, that changes your whole afternoon.
So I built a tracker.
The trick that makes it work
SEPTA's real-time feed tells you every vehicle on the route, but it doesn't say "this one is a beautiful antique." The tell is the fleet number: the PCC cars all have four-digit IDs starting with 23. That one piece of trainspotter knowledge, encoded as a rule, is the entire product. Everything else is decoration.
I love this because it's the kind of insight no amount of engineering gets you. You get it by caring about trolleys.
The app started keeping its own history
Here's my favorite part. A little scheduled job samples SEPTA's feed every five minutes and saves what it sees. Do that for months and you have a dataset that exists nowhere else:
- Which individual car is the workhorse of the fleet
- The biggest trolley day on record
- How often riders actually get a trolley versus a bus
- Whether the old cars keep schedule better than their replacements (they hold their own!)
SEPTA publishes none of this. Nobody does. The app built its own archive out of patience.
What I'd teach from it
If I turned this into a lesson, the essential question would be: what can you learn by simply writing things down on a schedule? Most "data problems" I meet at work aren't missing analysis. They're missing the habit of recording. A five-minute cron job is just a diligent notetaker that never gets bored.
Also: ride the trolley. It's wonderful.