April 2026

AlwaysRainSomewhere

A 24/7 rain-first livestream system that combines source discovery, weather consensus, stream validation, FFmpeg pipelines, and egress recovery to keep visible rain on air.

Watch Live →

Problem

Weather APIs can say it is raining while the camera view is dry, down, obscured, or too unstable to broadcast. A 24/7 channel needs weather truth and stream continuity at the same time.

Outcome

Runs as a systemd-owned livestream stack with dual-output RTMP, a 22,400+ stream index, egress recovery, weather consensus, and 1,400+ tests around the operational core.

AlwaysRainSomewhere is a 24/7 automated livestream that finds active rainfall webcams around the world and keeps rain on air continuously, broadcasting to YouTube and Twitch simultaneously from a single Oracle Cloud free-tier VM at $0/month.

The AI Verification Layer

The core problem: weather APIs frequently report rain at coordinates where cameras show dry or obscured scenes — cloud cover, panoramic coastal views, cameras where the rain is 10 km away. Heuristics alone aren’t reliable enough for continuous broadcast.

The system uses a Gemini vision gate with a dual-budget token-bucket rate limiter. The preselect budget (175 calls/day, 70% of the pool) screens candidates before they go on-air: three frames are captured at 2s, 5s, and 8s into the video and sent to Gemini with a rain-detection prompt. Consensus across three frames determines the outcome — a single wet frame isn’t sufficient. The on-air budget (75 calls/day, 30%) re-verifies the live stream every 180 seconds to catch sources that dry out mid-broadcast. Confidence thresholds are tiered: 0.70 to preselect-reject, 0.60 to boost a borderline candidate’s score, 0.80 to trigger a live rotation. A 15% reserve pool holds back budget for high-uncertainty cases. Any Gemini API error — rate limit, timeout, malformed response — falls back to a local pixel-based rain verifier with no crash. The gate was designed against failure modes upfront: a single-frame check is too noisy for variable-frame-rate streams; one shared budget starves either preselect or on-air verification.

Truth-Hardening the Weather Signal

The vision gate is the last filter. Before a candidate reaches it, the weather signal has to be defensible on its own. The system queries OpenWeatherMap and Open-Meteo, then uses RainViewer radar tiles as an independent check before accepting a rain claim. Borderline claims under 1.0 mm/h must pass radar confirmation independently. A RADAR VETO — radar shows dry despite a positive API claim — immediately rejects the candidate regardless of score.

Constraints as Architecture

The $0/month budget and single ARM OCPU aren’t footnotes — they shaped the architecture. The 9-tier selection cascade exists because fresh weather data is expensive to acquire and providers hit rate limits: the system always has a next move rather than going to a blank screen. rain-finder.service owns the bridge and RTMP child processes so YouTube and Twitch output recover under systemd instead of depending on a manually supervised shell. The codebase was refactored from a 2899-line monolithic main.py with 247 environment variables into a thin entry point, a StreamOrchestrator for selection logic, and a WorkerSession for per-stream monitoring and rapid switching. Environment variable count dropped to 24. The test suite now covers more than 1,400 cases.

Infrastructure
1 OCPU ARM VM
Test Coverage
1,400+ Tests
Indexed Streams
22,400+
Primary Service
systemd-owned

Runtime Flow

  1. A coordinator searches for candidate rain streams using weather data, source families, and fallback policy tiers.
  2. Workers normalize mixed inputs into a steady output stream while the bridge maintains bitstream continuity for egress.
  3. Health monitoring, egress resilience, and systemd ownership keep the service recoverable under stream failures and restarts.

Operational Focus

AlwaysRainSomewhere card artwork with rain broadcast branding
The public card emphasizes the rain-first broadcast identity.
Rainy webcam scene used for AlwaysRainSomewhere
The system continuously searches for visible rain and keeps a stable output stream alive.
AlwaysRainSomewhere Twitch channel showing the live rain stream and channel metadata
The Twitch surface shows the livestream running as a public channel, not just a backend experiment.

Technology

Operational resilience is the product: weather truth, source selection, bridge stability, and fast recovery under failure.

What this proves

AlwaysRainSomewhere proves I can turn unreliable public data, fragile video sources, and a constrained server into an operational system with measurable recovery behavior.