Inspiration

Utility crews in Florida work outdoors through lightning, extreme heat, floods and wildlife. Today the warnings are scattered across weather apps, radar and radio calls, and supervisors have to piece them together under pressure. We wanted three things: one risk number per job site, an automatic stop-work the moment lightning gets close, and a safety record nobody can quietly change afterwards.

What it does

  • Live hazard score (0–10) for 60 Florida plant sites, updated every 15 minutes from live weather and a LightGBM model trained on 10 years of NOAA storm events (ROC AUC 0.889). The score is a percentile: a score of $s$ means today is riskier than $10s\%$ of past site-days. Gemini explains every score in plain English.
  • Automatic lightning stop-work. Any strike within 10 miles (live GOES-19 satellite data) pauses work, and every new strike restarts the clock: $$t_{\text{all clear}} = t_{\text{last strike within 10 mi}} + 30\ \text{min}$$ The alert reaches the supervisor dashboard, every crew phone and our Site Beacon hardware within seconds, so crews without phone signal still get it.
  • Crew app (offline-first). Crews read tomorrow's 6 PM safety briefing in English or Spanish and report hazards with a photo. Gemini triages the photo in about 4 seconds, and safety rules in code can only raise severity, never lower it.
  • Supervisor review on Solana. The supervisor confirms or dismisses each report. The decision, the AI's verdict and the photo's fingerprint become a ledger record; records are hashed into a Merkle tree and only the root is anchored to Solana: $$\text{root} = H\big(H(r_1 \parallel r_2) \parallel H(r_3 \parallel r_4)\big)$$ Anyone can press Verify to recompute the proof and show a record was never changed.
  • Timeline insights (Tiger Data). Forecast drift ("the 2 PM rain chance rose from 44% to 69% since 6 AM"), "days like today" from 10 years of history, and live storm-approach speed and direction.

How we built it

  • Backend: FastAPI and Python workers (GOES-19 lightning ingest, a stop-work engine that ticks every 5 seconds, a scheduler), deployed on Vultr behind HTTPS.
  • Tiger Data (TimescaleDB): hypertables for weather, forecasts, scores and strikes; continuous aggregates for the hourly charts; every forecast run kept, which powers forecast drift; pgvector similarity search over 188,448 site-days for "days like today"; time_bucket + regr_slope over the last 30 minutes of strikes for storm approach; compression (58.6% smaller) and retention policies.
  • Gemini: score explanations, bilingual briefings and photo triage. Gemini only writes the words; code computes every fact. Validators reject made-up numbers, wrong hazards, English inside Spanish text, or any "it's safe" claim. Evals: 51/51 (37 guardrail tests + 14 live cases, including a prompt-injection photo).
  • Solana: hourly Merkle roots of every safety record written to devnet, with proof verification built into the dashboard.
  • Auth0: supervisor sign-in with roles, per-site access and step-up MFA for early all-clear. DeepSpace: crew sign-in, offline sync and hosting for the crew app.
  • Hardware: an Arduino Site Beacon (red/green LED, buzzer, LCD countdown) driven by the live stop-work engine over HTTPS.
  • Frontends: a React + Vite supervisor dashboard, and a DeepSpace PWA for crews.

Challenges we ran into

  • Two sign-in systems. Crews sign in with DeepSpace while supervisors use Auth0, so the API verifies both kinds of token, gives crew access only to listed emails, and never lets a crew token act as a supervisor.
  • Keeping AI honest. We had to ground Gemini strictly in the real numbers, and the Spanish briefing kept leaking English words until we added validator checks for it.
  • Cloud to hardware, reliably. Getting live alerts from the server to the beacon, including resetting the countdown the moment a new strike lands, and keeping the last state if the connection drops.

Accomplishments that we're proud of

A complete live loop running in the cloud: satellite lightning → automatic stop-work → crew phones and beacon within seconds, and crew photo → AI triage → supervisor decision → proof on Solana.

What we learned

Safety decisions belong in deterministic code, with AI explaining rather than deciding. And time-series context (what's changing and what happened before) makes a warning far more trustworthy than a single score.

What's next for CypressWatch

Real crew rosters, push notifications, more hazard sources (wildfire smoke, river gauges), and battery and LoRa beacons for sites with no internet at all.

The forecast-drift sentence uses an example figure ("44% to 69%"). If you'd rather quote only what's live right now, change it to "the 2 PM rain chance has held at 12% since 5 AM", which is what the dashboard currently shows.

Built With

Share this project:

Updates

Submission history