"The fault does not forgive. The data never lies."
→ Live Dashboard — brooksgroves.com/aftershock
I grew up in Sonora, California — a Gold Rush town wedged into the western Sierra Nevada foothills of Tuolumne County, where the hills are crumpled and old and full of stories the rocks don't easily give up. The Melones Fault Zone runs right through that country. As a kid, I walked those fault scarps without knowing what they were. I just knew the land felt different there — broken in some deep, geological way, like the earth was remembering something.
The 1989 Loma Prieta earthquake hit when I was young. I remember what it felt like when the ground — the thing you spend your entire life trusting completely — decided for a few seconds that it was done being trusted.
AFTERSHOCK is that memory grown up and given a dashboard.
Every six hours, a GitHub Actions pipeline wakes up, calls the USGS Earthquake Hazards Program ComCat API, and pulls every measurable shake across the United States and beyond — magnitude 1.5 and up, worldwide. It writes a static JSON file. A dark, cinematic map loads it. The earth speaks. You listen.
A full world map on ESRI Dark Gray Canvas tiles. Earthquake dots are sized and colored by magnitude — tiny green pinpoints for the microseismicity, climbing through yellow, orange, red, and into deep red and purple as the energy scales up. A magnitude 7 sits on the map like a bruise.
Click any dot. A popup opens with the magnitude, location, depth, time elapsed, and a direct link to the USGS event page. Every dot. Every earthquake.
Click any US state — active or quiet. Active states light up in red on the choropleth. Quiet ones are cool blue. Click either way and you get a full breakdown:
- Event count for your current filter window
- Largest magnitude in the past 30 days and where it happened
- Average magnitude and average depth
- Depth classification (shallow vs. deep)
- Magnitude distribution bar chart
- Most recent events list, sorted newest first, each with a USGS event link
Quiet states get a different message: "Quiet is not nothing — it may mean the fault is locked."
The leaderboard. Top states ranked by event count, color-coded by intensity. Alaska is always first. It is not even close.
Two controls that wire through everything simultaneously:
- Time Window — 1D / 3D / 7D / 14D / 30D buttons. Change the window; the map, the state panel, and the recent list all update instantly.
- Magnitude Slider — drag from M1.5 up to M6.0. Watch the noise disappear. Watch the significant events remain.
Total seismic energy released in the dataset, expressed as a multiple of the Hiroshima atomic bomb yield (~6.3 × 10¹³ joules). Because "1.8 × 10¹⁷ joules" means nothing until you say it a different way.
USGS Earthquake Hazards Program ComCat API
│
│ Python / requests — every 6 hours
▼
fetch/fetch_quakes.py
│
│ static JSON committed to repo
▼
data/earthquakes.json
│
│ Leaflet.js + Chart.js — no build step
▼
index.html → brooksgroves.com/aftershock
One Python script. One JSON file. Zero databases. Zero servers. The whole pipeline is auditable in an afternoon.
| Component | Technology |
|---|---|
| Data fetch | Python 3.11 / requests |
| Environment | pixi |
| Automation | GitHub Actions (every 6 hours) |
| Map tiles | ESRI Dark Gray Canvas (free, no key) |
| State boundaries | PublicaMundi US GeoJSON via CDN |
| Map engine | Leaflet.js |
| Charts | Chart.js |
| Frontend | Vanilla HTML / CSS / JS — no frameworks |
| Hosting | brooksgroves.com (GitHub Pages) |
git clone https://github.com/bdgroves/aftershock
cd aftershock
# Install environment and run the data fetch
pixi run fetch
# Serve locally (required — fetch API won't work from file://)
pixi run serve
# → Open http://localhost:8000| Magnitude | Energy equivalent |
|---|---|
| M 2.0 | Small construction blast |
| M 4.0 | ~1 ton of TNT |
| M 5.0 | ~32 tons of TNT |
| M 6.0 | Hiroshima bomb |
| M 7.0 | 32 Hiroshima bombs |
| M 8.0 | 1,000 Hiroshima bombs |
| M 9.0 | 32,000 Hiroshima bombs |
Each full magnitude step releases ~31.6× more energy than the step below it. The Richter scale is not intuitive. AFTERSHOCK tries to make it so.
| Project | Description |
|---|---|
| PELE | Kīlauea volcano dashboard — active episodic fountaining, built for a May 2026 birthday trip to Hawaiʻi Volcanoes National Park |
| Project Kiva | Southwest archaeology remote sensing using USGS 3DEP LiDAR |
| SIERRA-FLOW | Sierra Nevada streamflow monitor — Tuolumne, Merced, Stanislaus watersheds |
| EDGAR | Early Data & Game Analytics Report — Seattle Mariners & Tacoma Rainiers |
| Rainier Snowpack | Glacial water equivalent tracking on Mount Rainier |
Seismic data sourced from the USGS Earthquake Hazards Program ComCat API. Small events below M2.0 may be underreported in lightly instrumented regions. State attribution is parsed from USGS place strings; offshore and territorial events may not map to a US state.
The automatic update commits read: 🌍 Seismic update: YYYY-MM-DD HH:MM UTC. When you see those appearing in the commit history, the pipeline is healthy.
Built by someone who grew up walking fault scarps without knowing it.
Data: USGS Earthquake Hazards Program