Brooks Groves
Featured Project View on GitHub β†’

Python Β· ERA5 Β· Open-Meteo Β· D3 Β· Leaflet Β· GitHub Actions

🌫️ FOG-WATCH

"If fog is a habitat, it needs a habitat map."

A fog climatology for the world's great fog coasts: the Namib, the Atacama and San Francisco. Ten years of hourly ERA5 reanalysis, pulled with no API key, turned into a fog-blanket map over satellite imagery with a month slider, an inland transect from the Namib coast past Gobabeb, and hour-by-month heatmaps that show exactly when the fog rolls in.

It started with a 2026 study finding bacteria that grow and feed inside fog droplets. The Namib map now lines up almost exactly with a new ground-based cloud-base study: fog within 100 km of the coast, a high season from August to March, gone by mid-morning.

Python ERA5 Open-Meteo D3 Leaflet GitHub Actions pixi
View Live Maps β†’ Read the Post β†’
Fog coasts
3
Namib Β· Atacama Β· California
Foggiest Namib town
8.9%
of all hours Β· Swakopmund
Fog reach inland
~100 km
0.1% of hours by 153 km
Record
10 yrs
hourly ERA5 Β· 2016–2025
Infrastructure cost
$0
no API key Β· free runner Β· monthly refresh
Also Live All on GitHub β†’

Python Β· Open-Meteo Β· NWS Β· GitHub Actions Β· 15-min updates

🌑️ Weather Station

High-end real-time weather dashboard monitoring four stations across the American West β€” Lakewood WA, Sonora CA, Reno NV, Death Valley CA. Live National Weather Service observations read by the page every 5 minutes, measured-then-forecast charts, the local forecaster’s discussion, NWS alerts, and every day checked against records back to 1893. Any US place by search. Zero cost, looks like a NOAA operations center.

Live Dashboard β†’ Read: Revisited β†’ Read the Build Post β†’ GitHub β†’
Reading the Balloons All on GitHub β†’

FORTRAN Β· NWS Weather Balloons Β· SNOTEL Β· Pacific Northwest

🎈 CASCADIA-WX

The Pacific Northwest’s four National Weather Service weather balloons — Quillayute, Salem, Medford and Spokane — read twice a day by a FORTRAN program. Freezing level, snow level, precipitable water and atmospheric rivers from every level of every flight, each ranked against 85,000 balloons from 1991–2020 that a second FORTRAN program turns into normals. Twelve NRCS snow stations ride along when NRCS answers. Amber-phosphor page with the job log, a green-bar printout and a FORTRAN coding form.

Rebuilt October 2026: the April snowpack figures were wrong, and the write-up explains why

View Dashboard β†’ Read: Revisited β†’ GitHub β†’
πŸŒ™ On Standby β€” The Weather Bots Why they're resting β†’

These two used to post to X on their own. In October 2026 the X API credits ran out, and I decided not to buy more just now, so both bots are resting. The alert bot still watches the Sierra on every run and quietly writes down what it would have said, and the weather report’s cards still refresh every hour. For the alert bot, turning X back on is one setting, so both are ready if it ever comes back into the budget.

weather-report-bot Β· On standby View on GitHub β†’

Python Β· Matplotlib Β· OpenWeatherMap Β· GitHub Actions Β· Twitter Β· Bluesky

πŸŒͺ️ weather-report-bot

"It's already on the ground. It's not gonna stop."

A fully automated, broadcast-style weather report. Twice a day it pulled live conditions for four wildly different places, rendered cinematic station cards, and posted them to X and Bluesky with no human in the loop. It stopped posting in October 2026; the cards still refresh every hour, and the Weather Station now carries the live numbers all day.

Each station card is a 1200Γ—675 broadcast-style graphic with three panels: current conditions with color-coded temperature and hand-drawn weather icons, an instruments panel with arc gauges for humidity and UV index plus a wind compass, and a sky & atmosphere panel with precipitation chance, cloud cover, sunrise/sunset, and pressure. Every pixel hand-drawn in Matplotlib β€” no emoji fonts, no templates.

The four stations span completely different climate regimes: Pacific Northwest maritime, Sierra Nevada foothills, Mojave Desert extreme, and Great Basin high desert. Same report time. Four completely different air masses.

Python Matplotlib OpenWeatherMap GitHub Actions Tweepy Bluesky AT Protocol pixi
See the Cards β†’ GitHub β†’
Stations monitored
4
Lakewood Β· Sonora Β· Death Valley Β· Reno
Status
Standby
since Oct 2026 Β· cards refresh hourly
Card resolution
1200Γ—675
16:9 Β· 150 DPI Β· broadcast standard
Rendering engine
Matplotlib
pure geometry Β· every pixel hand-drawn
Infrastructure cost
$0
GitHub Actions free tier Β· ~4 min/run
The Four Stations
🏠
Home Base
Lakewood, WA
Pacific Northwest maritime climate. Cool, wet, green. The baseline everything else gets measured against.
πŸ”οΈ
Sierra Foothills
Sonora, CA
Tuolumne County seat, 1,800 feet, on the road to Yosemite. Records since 1903. Hometown gauge.
πŸ”₯
Extreme Conditions
Death Valley, CA
Hottest place on Earth. No mercy. The card that always reads differently from the others.
🎰
Biggest Little City
Reno, NV
High desert. Wind. Dry. The contrast station β€” shows what happens when you get over the Sierra crest.
The Old Broadcast Schedule
7:00 AM PT Morning report Β· current conditions + full-day forecast Β· posted to X + Bluesky Paused
6:00 PM PT Evening report Β· end-of-day conditions + overnight outlook Paused
On demand Trigger manually from GitHub Actions tab anytime workflow_dispatch
How It Works

The Pipeline

GitHub Actions woke up twice a day, ran the Python orchestrator, and pulled live atmospheric data from OpenWeatherMap One Call 3.0 for all four stations simultaneously β€” current conditions, forecast, UV index, humidity, wind, pressure, dew point, cloud cover.

The Matplotlib renderer then builds each card from scratch: temperature colored by heat level, weather icons drawn as pure geometry (no emoji fonts, no image assets), arc gauges for humidity and UV, a wind compass with directional arrow, precipitation bars, and a broadcast-style ticker across the bottom.

Cards went out to X via Tweepy and Bluesky via AT Protocol with live data captions and location hashtags (paused since October 2026). Total runtime: about 4 minutes on GitHub's free tier.

Why These Four

Lakewood is home β€” the Pacific maritime baseline. When it's 52Β°F and drizzling in Lakewood, that's just Tuesday.

Sonora is the county seat down the road from Groveland, where I grew up, at 1,800 feet on the western slope of the Sierra. It swings between fog and fire season, and its weather records go back to 1903. The hometown gauge.

Death Valley is the extreme outlier β€” the card that always reads 105Β°F when everywhere else is mild. It's there to remind you what weather actually means at its limit.

Reno sits just over the Sierra crest in a completely different climate regime β€” high desert, intense sun, wind. The contrast between Reno and Sonora in a single storm is one of the most dramatic demonstrations of orographic lift you'll find.

Sierra Nevada Alert Bot Β· On standby View on GitHub β†’

Python Β· MetPy Β· Py-ART Β· Tweepy Β· pixi Β· 7 federal feeds

πŸŒͺ️ Sierra Nevada Alert Bot

"The mountains don't warn you. This bot watches so you don't have to."

Autonomous environmental monitoring for the Sierra Nevada β€” wildfires, floods, earthquakes, air quality, and severe weather. It polls seven live federal data streams every few minutes on GitHub Actions, and until October 2026 it posted to @SierraNevadaWX the moment something worth knowing happened. On standby it still watches every run and logs what it would have posted, ready for the day X comes back.

It started as a question β€” could one person, with no server and no budget, watch an entire mountain range in near-real-time? Seven feeds later, it ships with a full science toolkit: MetPy Skew-T Log-P soundings for reading the morning atmosphere, and Py-ART NEXRAD Level 2 dual-pol analysis with automatic tornado-debris, TVS, and hail signature detection.

Python MetPy Py-ART Tweepy GitHub Actions pixi
Read: The Bots, Revisited β†’ Read the Build Post β†’
Federal data streams
7
NWS Β· NIFC Β· CAL FIRE Β· IEM Β· AirNow Β· NWPS Β· USGS
Poll interval
~5 min
GitHub Actions Β· dedup cache committed back
Coverage
400 mi
Lassen to the White Mountains
Science tools
2
Skew-T soundings Β· NEXRAD dual-pol
Infrastructure cost
$0
free runner Β· no server Β· no database