Personal Projects Apps I've designed, built & shipped
A small set of apps I've designed and built end-to-end — from first sketch to a working iOS demo. Each frame below plays a short walkthrough; the notes beside it cover the problem, my role, and how it's put together. Replace this intro with your own.
Live Rail
Live UK rail departures — every platform, delay and cancellation, plus real-time train tracking, in one glanceable board.
Checking the next train shouldn't mean fighting a cluttered website. Live Rail turns the UK's live rail feeds into a fast, glanceable departures board — the kind you can read in the two seconds before you run for the platform.
I built it end to end. The interface is the easy part; the data is the hard part. Network Rail's official feeds — LDBWS for departure boards, TRUST for real-time train movements — are XML-era, fragmented and awkward to call from a phone. So I wrote a Node/Express adapter, hosted on Railway, that normalises them into one clean JSON API, with a native SwiftUI app layering live tracking, platform-change alerts and reliability history on top.
- Live departures, every platform. Real-time boards for 2,500+ stations — operators, platforms, delays and cancellations, plus a “fastest train to each destination” row — all on a live polling loop.
- Adaptive polling, not a fixed timer. While you track a train, the refresh interval tightens from 60s to 8s as it nears the next stop — fresh data when it matters, without hammering the API or the battery.
- A backend that knows where the train really is. The Railway adapter fuses scheduled boards with TRUST movement events, so the app infers a train's true position between stops instead of trusting the timetable.
- Native iOS, top to bottom. SwiftUI throughout, with ActivityKit Live Activities on the Lock Screen, MapKit route maps, and CoreLocation for nearby-station discovery.
Try it live
The real Live Rail board, running in your browser — powered by the same Railway API as the iOS app. Search any UK station, switch departures and arrivals, and tap a train for its live calling points.