PG Transit
PG Transit is a modern iOS companion for commuters in Prince George, BC. It transforms a static schedule viewer into a live, breathing travel assistant.
I rebuilt the legacy Objective-C app entirely in SwiftUI, redesigning the interface from scratch, including the app icon and custom iconography to create a polished, native iOS experience. The app merges static schedules with real-time data streams to answer the commuter’s most important question: “Where is my bus right now?”
Why I built it
My client needed to modernize their existing transit app to support real-time features that users expect today. I wanted to engineer a system that felt “alive”; where buses move on the map and arrival times update instantly while ensuring the app remained fully functional offline. I also took the opportunity to refresh the visual identity by creating the app iconography as well as navigation structure in a way that fits perfectly on modern iOS devices. I also built a promotions system for my client to integrate local businesses and improve visibility amongst commuters.
Tech Stack
Swift • SwiftUI • MapKit • WeatherKit • Core Data • Combine • SwiftProtobuf • Firebase Storage • GitHub Actions
Highlights
- Live Trip Timeline: A standout UX feature where the bus icon physically moves down the list of stops in real-time, allowing users to track their journey’s progress at a glance.
- High-Performance Decoding: Utilized the SwiftProtobuf library to parse binary GTFS-Realtime feeds (Vehicle Positions and Trip Updates). This ensures efficient, low-latency processing of live data without draining user battery or bandwidth.
- Smart Stop Details: Stop schedules display live status indicators (e.g., “5 min delay”, “On Time”) color-coded for readability.
- Contextual Maps: Maps are context-aware, showing bus stops & live bus icons along with local weather conditions powered by WeatherKit.
- Dark Mode: A fully adaptive UI that looks great in both light and dark environments.
- Custom Design: Designed the main App Icon that reflects the identity of Prince George and a complete set of custom in-app iconography to ensure a cohesive visual language.
The Data Pipeline
To keep schedules accurate without constant App Store updates, I engineered a serverless data pipeline:
- Automated Ingestion: A GitHub Actions workflow runs daily to download the latest static schedule (GTFS) directly from BC Transit.
- Version Control: The script checks the data version against what is currently live. If a change is detected, it uploads the new dataset to Firebase Storage.
- OTA Updates: The app checks for these updates daily. Instead of blocking the user with a forced update, it unobtrusively badges the Settings tab, allowing the user to initiate the schedule update when it is convenient for them.