Southern Oregon Weather
A regional weather platform providing localized information and weather monitoring.
- Category
- Regional data platform
- Status
- Live
- Core stack
- Next.js · React · TypeScript · JavaScript · Tailwind CSS

Overview
Southern Oregon Weather is a regional information platform for communities across Southern Oregon. Beyond forecasts, it tracks air quality, wildfire activity and perimeters, smoke, drought, frost, road and pass conditions, rivers, tides, and active alerts, with dedicated pages for each covered city.
It runs on a self-hosted Ubuntu server as two processes: the Next.js web application and a standalone worker that handles all scheduled publishing, independent of web traffic.
- 01City-level pages for weather, air quality, fire danger, and fire restrictions
- 02Data from the National Weather Service, NASA FIRMS, AirNow, InciWeb, and NOAA smoke products
- 03A background worker that renders and publishes geo-targeted updates
- 04Graceful degradation when an upstream source is unavailable
Objective
Bring scattered public weather and hazard data into one fast, local, mobile-friendly source, and push timely, location-specific updates to the people who need them.
Technical approach
- A.
Many sources, one model
Integrations with OpenWeather, the National Weather Service, AirNow, NASA FIRMS, InciWeb, and NOAA smoke products feed a shared set of city-keyed pages and maps.
- B.
Decoding raw model output
HRRR-Smoke forecasts arrive as GRIB2 files with templates JavaScript parsers can't read, so the pipeline shells out to wgrib2, compiled from source on the server.
- C.
Automated, localized publishing
A background worker renders weather, fire, air quality, and smoke cards and publishes them geo-targeted to each city, with a dry-run mode for validating new deployments. A daily weather reel is assembled with ffmpeg.
- D.
Resilience by default
A missing API key or an unavailable source degrades one feature instead of the site, and an admin diagnostics panel shows exactly what is missing.
Architecture
Sources
- OpenWeather
- National Weather Service
- AirNow
- NASA FIRMS
- NOAA HMS and HRRR-Smoke
- InciWeb
Processing
- Next.js server routes
- wgrib2 GRIB2 decoding
- Satori card rendering
- ffmpeg reel assembly
Storage
- SQLite for automation state and settings
Delivery
- Next.js web app under PM2
- Publishing worker under PM2
- Ubuntu server
Technologies
- Next.js
- React
- TypeScript
- JavaScript
- Tailwind CSS
- HTML
- CSS
- Responsive UI Engineering
- Node.js
- REST APIs
- Application Integrations
- Database-driven Applications
- SQLite
- Leaflet
- ffmpeg
- Linux
- Ubuntu
- Bash
Visuals

Challenges & solutions
Challenge 01
NOAA's HRRR-Smoke GRIB2 files use non-standard aerosol templates that JavaScript parsers can't decode.
Solution
The smoke pipeline shells out to wgrib2 built from source, and the forecast feature degrades cleanly when the binary is missing.
Challenge 02
City-specific posts should reach people near that city, not the whole audience.
Solution
Each city's location key is resolved once and cached permanently. If targeting permissions are unavailable, posts publish untargeted instead of failing.
Challenge 03
Production installs that silently skipped build tooling produced a successful build with no CSS.
Solution
Deploys install development dependencies explicitly, regardless of the shell's NODE_ENV.
