Skip to content
James Foss, jamesfoss.me home
P.03Live

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
Southern Oregon Weather homepage showing current conditions for Roseburg, an hourly forecast, and links to other Southern Oregon cities
Fig. 03 — Live homepage, captured October 2026.
01

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
02

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.

03

Technical approach

  1. 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.

  2. 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.

  3. 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.

  4. 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.

04

Architecture

  1. Sources

    • OpenWeather
    • National Weather Service
    • AirNow
    • NASA FIRMS
    • NOAA HMS and HRRR-Smoke
    • InciWeb
  2. Processing

    • Next.js server routes
    • wgrib2 GRIB2 decoding
    • Satori card rendering
    • ffmpeg reel assembly
  3. Storage

    • SQLite for automation state and settings
  4. Delivery

    • Next.js web app under PM2
    • Publishing worker under PM2
    • Ubuntu server
05

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
06

Visuals

Active Wildfires page listing current fires with acreage, containment, county, and time since discovery
Wildfire tracker with data from the National Interagency Fire Center, captured October 2026.
07

Challenges & solutions

  1. 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.

  2. 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.

  3. 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.

Have a system like this in mind?

Get in touch