A real-time status page for the Schuylkill River Trail crossings at
Locust Street
and Race Street on Schuylkill Banks. These at-grade crossings have
automated gates that close when CSX freight trains pass through, blocking the trail.
How does it detect trains?
CSX has defect detectors along their tracks that scan
passing trains for mechanical problems. When a train passes a detector,
it broadcasts a voice announcement on railroad radio frequency
160.230 MHz — something like
"CSX detector milepost 6.4, track one, no defects, total axle 404."
A volunteer streams this frequency online via
Broadcastify.
This app taps into that stream, uses AI speech recognition (Whisper) to
transcribe the announcements, and parses out the milepost to estimate
when the train will reach the trail crossings.
Where are the detectors?
The trail crossings are at roughly milepost BAK 0.3–0.5. Nearby detectors:
From the south:
Collingdale (MP 6.4) — ~6 mi away, ~14 min warning
From the north:
Laurel Hill (MP 3.1) — ~4 mi, ~10 min
Zoo (MP 2.3) — ~3 mi, ~7 min
Belmont (MP 1.1) — ~2 mi, ~5 min
Field (MP 0.1) — ~0.5 mi, ~1 min
Switch to the Map tab to see these locations.
How accurate is the ETA?
It's a rough estimate based on typical freight train speed through
urban Philadelphia (~25 mph). Actual speed varies — trains may slow
down, speed up, or stop. Treat the ETA as a general heads-up, not a
precise countdown.
What do the colors mean?
Green (Clear): No train activity detected recently. Red (Train): Train detected and approaching or at the crossing. Yellow (Caution): Recent detection — train may still be in the area. Gray: System starting up or scanner feed disconnected.
Can it miss a train?
Yes. This is not a guarantee the crossing is open. It can miss trains if:
• The Broadcastify scanner feed goes offline
• The speech recognition doesn't catch the announcement
• A train enters between detector locations
• Radio interference or poor audio quality
Always look and listen at the crossing regardless of what this page says.
What's in the Transcript tab?
Everything the system hears and transcribes from the scanner feed — dispatcher
calls, crew communications, and (when they happen) defect detector
announcements. Items highlighted in red matched as detector announcements.
Scroll down to load older entries.
How is this built?
The app listens to a live railroad scanner stream via
Broadcastify,
decodes audio with FFmpeg, filters for speech using WebRTC VAD,
transcribes with faster-whisper,
then parses for defect detector announcements. Runs on a small cloud server.