
Earthquake
Real-time earthquake tracker on a 3D globe
Real-time earthquake tracker on a 3D Apple Maps globe. Live USGS data, magnitude filters, and push alerts.
Overview
Earthquake is a native iOS app that visualises global seismic activity on a stunning 3D hybrid globe powered by Apple Maps. Data comes directly from the USGS GeoJSON feed — no backend, no middleman, updated every 5 minutes.
Magnitude pins are colour-coded from grey to dark red and scale logarithmically, giving you an immediate visual sense of severity. A bottom sheet lists recent events; tap any one to zoom the globe and see details.
Filters let you narrow by time window (1h, 24h, 7d, 30d) and minimum magnitude. Push notifications alert you when a major event (M ≥ 6.0) occurs anywhere in the world. Dark mode only.
The problem
Seismic data is publicly available from USGS but the existing apps present it as flat lists or low-resolution maps. There was no way to see the global distribution of earthquakes on a proper 3D globe in real time, or to get instant alerts with location context.
What we built
- Full-screen 3D hybrid globe with realistic elevation via MapKit
- Live USGS data updated every 5 minutes, with Firestore as unified data layer
- Magnitude pins colour-coded from grey (minor) to dark red (major)
- Filters by time window (1h, 24h, 7d, 30d) and minimum magnitude
- Push notifications for major earthquakes (M ≥ 6.0) via Firebase Cloud Messaging
- Live earthquake map website at earthquakes.site with MapLibre GL JS
Tech stack
iOS App
Data
Push
Website
Under the hood
No-backend iOS → direct USGS pull
The app pulls USGS GeoJSON directly — no proxy, no backend. SwiftData persists the last batch locally. BGAppRefreshTask updates the cache every 5 minutes in the background. This keeps the app free to operate with zero hosting cost.
Firestore as unified data layer
A VPS2 poller runs every 5 minutes, batch-writing earthquake data to Firestore. Both the iOS app and the website (earthquakes.site) read from Firestore — this eliminated data source divergence and allowed the website live map to use Firestore's onSnapshot for real-time updates.
MapKit hybrid globe
MapStyle.hybrid(elevation: .realistic) renders satellite imagery on a true 3D sphere. Pins are MapAnnotation views sized logarithmically by magnitude. The intro flyby runs once per cold launch: 600ms delay → easeInOut 2.2s pan to user location.