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.


