Nov 9, 2025 · 515 words · 3 minute read
I have a love-hate relationship with BART. I’m grateful for it, but let’s just say it’s not always the most reliable so it’s nice to see before hand when the train you need is due to arrive. There are plenty of projects out there that show real-time BART arrival information. This one does that too, it’s nothing groundbreaking, but I wanted to build my own version that captures the vintage BART platform sign vibe I associate with commuting between the East Bay and my job in the city.
The Hardware 🔗
Seeed Studio XIAO ESP32C6
SPI Red 20x4 Character OLED Display Module from BuyDisplay
SparkFun Logic Level Converter
I wanted to find a display that felt as close as possible to the real thing, though I knew it wouldn’t be an exact match. I was mainly after the right vibe, and the BuyDisplay red OLED character display nailed it. The PCB was a bit taller than the display itself, which affected the final dimensions, but it was a tradeoff I was happy to make. I love an OLED.
The only other components I needed on the electronics side were the ESP32-C6 to run the display and fetch the latest BART arrival times, along with a logic level shifter. Both parts are small, so I soldered them onto a piece of perfboard with header pins, allowing the whole assembly to plug directly into the display like a cartridge.
The official BART API uses GTFS Realtime, a data specification developed in collaboration with Google. I’d never worked with it before, and expecting the ESP32 to fetch and parse the raw feed on its own felt like a stretch (or at least, too much for me to figure out). So instead, I built a middleware service that handles the heavy lifting: it pulls the data, extracts only what I need, and serves a simplified API tailored for the display the ESP32 calls. All the code is available on my GitHub.
Once I had all the pieces together, including some early 3D prints of the housing, I assembled everything to get a feel for the scale and how it works as a finished product. This video shows it all together but before paint. Data is being pulled in live.
... continue reading