Case study · Progressive web app · Public transport
Real-time transit intelligence for Norfolk.One PWA. Every bus. Every delay.
Live bus tracking — offline-capable, installable, any device.
Overview
Norfolk Transit Intelligence Platform (NTIP)

Challenge
What needed solving.
Public transport data in Norfolk is fragmented. Passengers have no single, reliable view of live bus positions, route delays, and network alerts — especially when connectivity is intermittent in rural areas.
Existing solutions require a native app download, work poorly on older phones, and fail entirely when the user loses signal.
The brief: build a single transport intelligence dashboard that loads fast, works offline, and installs to the home screen — without asking anyone to visit an app store.
Approach
What was done, and how.
Architecture: a Next.js PWA with a service worker caching strategy tuned for transit data — short TTL for live positions, longer TTL for route geometry.
Real-time bus positions across active Norfolk routes.
Delay classification: Minor (2–5 min) / Major (5+ min).
Route filter: All routes / Outbound / Inbound.
60-minute rolling delay chart — spot patterns, not just moments.
Live alerts feed — network disruptions surfaced immediately.
Offline mode — last-known state served from cache on signal loss.
Results
What changed.
- 1
- Dashboard for positions, delays and alerts — instead of several separate sources
- 60 min
- Rolling delay chart, so patterns are visible rather than single moments
- 2
- Delay classes — Minor (2–5 min) and Major (5+ min)
- ✓
- Offline capability — the last-known state is preserved when signal drops
Under the hood
What makes it a Progressive Web App.
- Works offline (service worker — last-known state preserved)
- Installs to home screen (Web App Manifest — no app store required)
- Any device: desktop, tablet, Android, iPhone
Tech stack
Next.js · TypeScript · Leaflet · OpenStreetMap · Service Worker (Workbox) · Web App Manifest
Next project
Let’s find out if we’re a good fit.
A free 30-minute call. No pitch. No pressure.