I'm lucky to live close to 3 subway lines, and I love glancing at what's arriving on my way out the door. But there's a specific kind of frustration that comes from standing in your apartment doorway, coat on, bag over your shoulder, unlocking your phone to check the MTA app. You wait for it to load, squint at the arrivals, and try to figure out if "3 min" means sprint or stroll.
I've recently had some time to build personal projects, so I built a subway display.
It All Started with a Conversation with Claude
I'm not a hardware guy. I had an idea but no clue what it actually required. So I asked Claude: "what would I need to build something like this?"
Claude walked me through it. For an always-on display that doesn't need to be bright or power-hungry, e-ink is the right call: it holds an image without drawing power and looks great in daylight. Claude recommended a Waveshare 7.5" e-ink panel paired with a Raspberry Pi Zero. The Pi talks to the panel over GPIO. The whole thing sits on a shelf and just works.
I ordered both. The e-ink panel ships from China, so there was a wait.
Assembling It
When the panel arrived, Claude walked me through the physical setup: attaching the HAT to the Pi's GPIO pins, installing the Waveshare Python library, running a test pattern to confirm the connection. Step by step. I'd never touched e-ink hardware before, but it went together cleanly.
I recall asking Claude to SSH in and test that the hardware was correctly installed. I was incredibly surprised to come back to my desk a few minutes later and see "Hello from Claude" on the display.
Building the Software
I had opinions about how this should be architected. All the data, which stations I care about, which lines, which direction labels, should live in a backend I can update without touching the Pi.
I used @convex for the backend: it stores my stops with direction labels and exposes a single HTTP endpoint the Pi polls every 15 seconds. The MTA publishes free GTFS-RT feeds (real-time protobuf data), so the Convex function fetches those on demand. The whole thing is serverless and entirely free. Convex has a very generous free tier.
One thing I learned late: e-ink panels support two refresh modes. A full refresh clears the panel completely with a visible flash, and a partial refresh updates only what changed, flicker-free. The display now does partial refreshes every 15 seconds and a full refresh every 5 minutes to prevent ghosting. The difference in practice is significant: the partial refresh is smooth enough that it feels like a live display rather than a screen that periodically resets itself.
The Result
It took a few hours, start to finish. It's a small thing. But it's exactly what I wanted - and that's the magic of building with agents.
What impressed me most is that Claude Code wasn't just the builder. I used it as an advisor to think through tradeoffs, a researcher to figure out what hardware I needed and why, and a hands-on collaborator that met me where I had opinions and filled in everywhere I didn't. The result felt like mine, even though I couldn't have gotten there nearly as fast alone.
The full source is on GitHub