PageSourceSearch

https://stormcastapp.com/

html stormcastapp.com collected 2026-10-10 02:42:13 UTC 74,402 bytes, 1,291 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <meta charset="UTF-8" />
5  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6  <title>StormCast — NWS Weather Alerts &amp; River Flood App</title>
7  <link rel="canonical" href="https://stormcastapp.com/" />
8  <link rel="icon" href="/favicon.ico" sizes="any" />
9  <link rel="icon" type="image/png" href="/favicon.png" />
10  <link rel="apple-touch-icon" href="/favicon.png" />
11  <meta name="theme-color" content="#05070d" />
12  <meta name="google-adsense-account" content="ca-pub-6374991879498911">
13
14  <meta name="description" content="Free Android app for NWS severe weather alerts, river flood monitoring, hurricane tracking, and live radar — anywhere in the US." />
15  <meta property="og:type" content="website" />
16  <meta property="og:url" content="https://stormcastapp.com/" />
17  <meta property="og:title" content="StormCast — NWS Severe Weather Alerts &amp; River Flood App for Android" />
18  <meta property="og:description" content="Android app for NWS tornado, flood, and severe weather push notifications anywhere in the US. River gauge monitoring, hurricane tracking, emergency scanner feeds. Available now on Google Play." />
19  <meta property="og:image" content="https://stormcastapp.com/og-image.jpg" />
20  <meta name="twitter:card" content="summary_large_image" />
21  <meta name="twitter:title" content="StormCast — NWS Severe Weather Alerts &amp; River Flood App for Android" />
22  <meta name="twitter:description" content="Android app for NWS tornado, flood, and severe weather push notifications anywhere in the US. River gauge monitoring, hurricane tracking, emergency scanner feeds." />
23  <meta name="twitter:image" content="https://stormcastapp.com/og-image.jpg" />
24
25  <!-- Structured data -->
26  
26<script type="application/ld+json">
27  {
28    "@context": "https://schema.org",
29    "@type": "SoftwareApplication",
30    "@id": "https://stormcastapp.com/#app",
31    "name": "StormCast: Weather & Radar",
32    "alternateName": "StormCast",
33    "description": "Free Android and Windows app for real-time NWS severe weather alerts, USGS river flood monitoring, hurricane tracking, and emergency scanner feeds. Built in Giles County, Virginia. Push notifications delivered nationwide.",
34    "applicationCategory": "WeatherApplication",
35    "operatingSystem": "Android 8.0+, Windows 10+",
36    "datePublished": "2025-05-24",
37    "installUrl": "https://play.google.com/store/apps/details?id=app.stormcast.android",
38    "sameAs": ["https://play.google.com/store/apps/details?id=app.stormcast.android"],
39    "publisher": { "@id": "https://stormcastapp.com/#org" },
40    "offers": {
41      "@type": "Offer",
42      "price": "0",
43      "priceCurrency": "USD"
44    },
45    "url": "https://stormcastapp.com"
46  }
47  </script>
47
48
49  
49<script type="application/ld+json">
50  {
51    "@context": "https://schema.org",
52    "@type": "Organization",
53    "@id": "https://stormcastapp.com/#org",
54    "name": "StormCast",
55    "alternateName": "StormCast App",
56    "url": "https://stormcastapp.com",
57    "logo": "https://stormcastapp.com/favicon.png",
58    "foundingDate": "2025-05-24",
59    "foundingLocation": { "@type": "Place", "name": "Giles County, Virginia, United States" },
60    "areaServed": { "@type": "Country", "name": "United States" },
61    "sameAs": ["https://play.google.com/store/apps/details?id=app.stormcast.android"]
62  }
63  </script>
63
64
65  <!-- Google consent management (Privacy & messaging) — must load before AdSense -->
66  
66<script async src="https://fundingchoicesmessages.google.com/i/pub-6374991879498911?ers=1"></script>
66
67  
67<script>(function(){function signalGooglefcPresent(){if(!window.frames['googlefcPresent']){if(document.body){const iframe=document.createElement('iframe');iframe.style='width:0;height:0;border:none;z-index:-1000;left:-1000px;top:-1000px;';iframe.style.display='none';iframe.name='googlefcPresent';document.body.appendChild(iframe);}else{setTimeout(signalGooglefcPresent,0);}}}signalGooglefcPresent();})();</script>
67
68
69  <!-- AdSense -->
70  
70<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6374991879498911" crossorigin="anonymous"></script>
70
71
72  <!-- Fonts -->
73  <link rel="preconnect" href="https://fonts.googleapis.com" />
74  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
75  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" />
76
77  <link rel="stylesheet" href="styles.css" />
78  <link rel="stylesheet" href="live-hero.css" />
79  <link rel="stylesheet" href="hero-widget/hero-widget.css" />
80  <link rel="preconnect" href="https://api.weather.gov" crossorigin />
81  <link rel="preconnect" href="https://opengeo.ncep.noaa.gov" crossorigin />
82<script async src="https://fundingchoicesmessages.google.com/i/pub-6374991879498911?ers=1"></script>
vendor: 1 bytes, line 82
82
83<script>(function(){function signalGooglefcPresent(){if(!window.frames['googlefcPresent']){if(document.body){const iframe=document.createElement('iframe');iframe.style='width:0;height:0;border:none;z-index:-1000;left:-1000px;top:-1000px;';iframe.style.display='none';iframe.name='googlefcPresent';document.body.appendChild(iframe);}else{setTimeout(signalGooglefcPresent,0);}}}signalGooglefcPresent();})();</script>
83</head>
84<body>
85
86<!-- Ambient background -->
87<div class="bg-canvas" aria-hidden="true">
88  <div class="bg-grid"></div>
89  <canvas class="bg-rain" id="bg-rain"></canvas>
90  <div class="bg-noise"></div>
91  <div class="bg-flash"></div>
92</div>
93
94<!-- -- NAV -------------------------------------------------------- -->
95<div class="nav-shell">
96  <div class="wrap nav">
97    <div class="nav-left">
98      <a href="#top" class="nav-brand">
99        <img src="favicon.png" alt="StormCast" />
100        <span>StormCast</span>
101      </a>
102      <div class="nav-status" title="Live system status">
103        <span class="live-dot"></span>
104        <span>OPERATIONAL · NWS · USGS · NHC</span>
105      </div>
106    </div>
107    <div class="nav-links">
108      <a href="#features">Features</a>
109      <a href="/river-level-app">River Gauges</a>
110      <a href="/about">About</a>
111      <a href="/blog/">Blog</a>
112      <a href="#install">Install</a>
113      <a href="#faq">FAQ</a>
114    </div>
115    <button class="nav-hamburger" id="nav-hamburger" aria-label="Open menu" aria-expanded="false">
116      <span></span><span></span><span></span>
117    </button>
118    <a href="https://play.google.com/store/apps/details?id=app.stormcast.android" class="nav-cta">
119      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
120        <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
121        <polyline points="7 10 12 15 17 10"/>
122        <line x1="12" y1="15" x2="12" y2="3"/>
123      </svg>
124      Get the App
125    </a>
126  </div>
127</div>
128
129<!-- Status ribbon -->
130<div class="ribbon">
131  <span><strong>LIVE ON GOOGLE PLAY &amp; WINDOWS</strong> &nbsp;·&nbsp; Free to download · No subscription required</span>
132</div>
133
134<!-- -- HERO ------------------------------------------------------- -->
135<section class="hero" id="top">
136  <div class="wrap hero-inner">
137    <div class="hero-text">
138      <div class="hero-coord" id="hero-coord">
139        <span class="ping"></span>
140        <span id="hero-coord-lat">37.3265°N</span><span class="sep">/</span><span id="hero-coord-lon">-80.7717°W</span>
141        <span class="sep">·</span>
142        <span id="hero-coord-name">YOUR LOCATION</span>
143      </div>
144
145      <h1 class="hero-title">
146        <span class="word">Know</span>
147        <span class="word">before</span>
148        <span class="word">the</span>
149        <br />
150        <span class="word accent">storm</span>
151        <span class="word accent">hits.</span>
152      </h1>
153
154      <p class="hero-sub">
155        Every signal that matters — <strong>NWS warnings</strong>, <strong>river flood stages</strong>, live radar, and your own <strong>scanner feeds</strong> — on one screen. Stop juggling six apps when the sky turns.
156      </p>
157
158      <div class="wx-search" id="wx-search">
159        <div class="wx-search-label"><span class="dot"></span>LIVE CONDITIONS · RADAR · ALERTS — 29,000+ US CITIES</div>
160        <div class="wx-search-box">
161          <svg width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
162          <input id="wx-search-input" type="text" placeholder="Search any US city — weather, radar &amp; alerts…" autocomplete="off" spellcheck="false" aria-label="Search US city weather" />
163          <kbd class="wx-search-kbd">/</kbd>
164        </div>
165        <div class="wx-search-drop" id="wx-search-drop" hidden></div>
166      </div>
167
168      <div class="hero-cta-row">
169        <a href="https://play.google.com/store/apps/details?id=app.stormcast.android" class="btn btn-primary">
170          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
171            <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
172            <polyline points="7 10 12 15 17 10"/>
173            <line x1="12" y1="15" x2="12" y2="3"/>
174          </svg>
175          Download on Google Play
176        </a>
177        <a href="/download-windows" class="btn btn-ghost">
178          <svg viewBox="0 0 24 24" fill="currentColor"><rect x="2" y="2" width="9" height="9"/><rect x="13" y="2" width="9" height="9"/><rect x="2" y="13" width="9" height="9"/><rect x="13" y="13" width="9" height="9"/></svg>
179          Download for Windows
180        </a>
181        <a href="#features" class="btn btn-ghost">
182          Explore features
183          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="12" x2="19" y2="12"/><polyline points="12 5 19 12 12 19"/></svg>
184        </a>
185      </div>
186
187      <div class="hero-meta">
188        <span class="ok">&#x25CF; ANDROID 8.0+</span>
189        <span class="sep"></span>
190        <span>GOOGLE PLAY</span>
191        <span class="sep"></span>
192        <span>WINDOWS 10/11</span>
193        <span class="sep"></span>
194        <span>FREE TO DOWNLOAD</span>
195        <span class="sep"></span>
196        <span class="store-soon-wrap">
197          <svg class="store-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
198          <svg class="store-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M3.18 23.76c.39.21.84.22 1.24.03l11.75-6.54-2.76-2.76-10.23 9.27zM.29 1.27C.11 1.6 0 2.01 0 2.52v18.96c0 .51.11.92.29 1.25l.07.06 10.63-10.63v-.25L.36 1.21l-.07.06zM20.94 10.22l-2.37-1.32-2.98 2.98 2.98 2.98 2.38-1.32c.68-.38.68-1.0 0-1.38l-.01.06zM4.42.21L16.17 6.75l-2.76 2.76L3.18.24C3.58.05 4.03.06 4.42.27V.21z"/></svg>
199          AVAILABLE ON GOOGLE PLAY
200        </span>
201      </div>
202    </div>
203
204    <!-- -- Live dashboard preview (mirrors actual app) --- -->
205    <div class="hero-viz">
206      <!-- Real app UI — same HeroWeatherCard + StatusCard React components as
207           the Android dashboard, compiled to a standalone bundle (see
208           src/landing/). Not a hand-copied lookalike. -->
209      <div id="stormcast-hero-root" class="stormcast-hero-root">
210        <div class="stormcast-hero-fallback">Loading live conditions…</div>
211      </div>
212
213      <div class="hero-actions-row">
214        <a class="hero-download-cta" href="https://play.google.com/store/apps/details?id=app.stormcast.android" target="_blank" rel="noopener">
215          <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg>
216          Get the app for full features
217        </a>
218        <button class="hero-coord-precise" id="lc-precise" title="Use my precise location" aria-label="Use my precise location">
219          <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M12 2v3"/><path d="M12 19v3"/><path d="M2 12h3"/><path d="M19 12h3"/></svg>
220          Use precise location
221        </button>
222      </div>
223
224      <div class="livecard livecard-extra">
225        <div class="lc-spark" hidden>
226          <div class="lc-spark-head"><span>NEXT 24 HRS</span><span id="lc-spark-range">—</span></div>
227          <canvas id="lc-spark-canvas"></canvas>
228        </div>
229
230        <!-- live radar — NOAA NCEP composite reflectivity, centered on the visitor -->
231        <div class="lc-radar" id="lc-radar" hidden>
232          <div class="lc-radar-tiles" id="lc-radar-tiles"></div>
233          <div class="lc-radar-marker" id="lc-radar-marker" hidden></div>
234          <div class="lc-radar-top">
235            <span class="lc-radar-label"><span class="lc-radar-dot"></span>LIVE RADAR</span>
236            <span class="lc-radar-time mono" id="lc-radar-time">--:--</span>
237          </div>
238          <div class="lc-radar-attr">NOAA NCEP Radar · Esri</div>
239        </div>
240
241        <!-- 7-day forecast strip -->
242        <div class="lc-week" id="lc-week" hidden></div>
243
244        <!-- footer source bar -->
245        <div class="lc-foot">
246          <span class="lc-foot-l">
247            <span class="lc-foot-dot"></span>
248            Polled <span id="lc-poll">23s</span> ago · NWS / USGS / NHC
249          </span>
250          <span class="lc-foot-r mono" id="lc-clock">00:00:00</span>
251        </div>
252      </div>
253      <p class="lc-disclaimer" id="lc-disclaimer">Preview only — for reference, not actual current conditions.</p>
254    </div>
255  </div>
256
257  <!-- -- live telemetry strip --- -->
258  <div class="telemetry">
259    <div class="wrap telemetry-inner">
260      <div class="telem-cell">
261        <div class="telem-label"><span class="dot"></span><span id="telem-label-loc">
261YOUR LOCATION · TEMP</span></div>
262        <div class="telem-value"><span id="telem-temp">78</span><span class="unit">°F</span></div>
263        <div class="telem-sub" id="telem-sub-temp">Clear · Feels 75°</div>
264      </div>
265      <div class="telem-cell">
266        <div class="telem-label"><span class="dot"></span>NEAREST RIVER GAUGE</div>
267        <div class="telem-value"><span id="telem-river">2.9</span><span class="unit">ft</span></div>
268        <div class="telem-sub ok" id="telem-sub-river">NORMAL · Action @ 12ft</div>
269      </div>
270      <div class="telem-cell">
271        <div class="telem-label"><span class="dot"></span>STREAMFLOW</div>
272        <div class="telem-value"><span id="telem-cfs">1,620</span><span class="unit">cfs</span></div>
273        <div class="telem-sub" id="telem-sub-cfs">USGS Water Data · 17m ago</div>
274      </div>
275      <div class="telem-cell">
276        <div class="telem-label"><span class="dot"></span>WIND · HUMIDITY</div>
277        <div class="telem-value"><span id="telem-wind">9</span><span class="unit">mph</span> · <span id="telem-humidity">40</span><span class="unit">%</span></div>
278        <div class="telem-sub" id="telem-sub-wind">SW · stable</div>
279      </div>
280      <div class="telem-cell">
281        <div class="telem-label"><span class="dot"></span>SYSTEM · LOCAL</div>
282        <div class="telem-value mono" id="telem-clock" style="font-size:18px;letter-spacing:0;">00:00:00</div>
283        <div class="telem-sub ok">All feeds nominal</div>
284      </div>
285    </div>
286  </div>
287</section>
288
289<!-- -- SHOWCASE / PHONES ------------------------------------------- -->
290<section class="showcase" data-reveal>
291  <div class="wrap">
292    <div class="showcase-head">
293      <span class="eyebrow"><span class="dot"></span>THE APP</span>
294      <h2 class="section-title">Built for real emergencies, not just <span class="accent">forecasts</span>.</h2>
295      <p class="section-sub" style="margin-left:auto;margin-right:auto;">A live ops console for your phone — every feed that matters on one screen, updating in real time.</p>
296    </div>
297
298    <div class="phones-stage">
299      <div class="phone left">
300        <div class="phone-pill"></div>
301        <div class="phone-screen"><img src="sc-menu.jpg" alt="Features menu" loading="lazy" /></div>
302        <span class="phone-tag"><span class="dot"></span>FEATURES</span>
303      </div>
304      <div class="phone center">
305        <div class="phone-pill"></div>
306        <div class="phone-screen"><img src="sc-dashboard.jpg" alt="Dashboard" loading="lazy" /></div>
307        <span class="phone-tag"><span class="dot"></span>DASHBOARD · LIVE</span>
308      </div>
309      <div class="phone right">
310        <div class="phone-pill"></div>
311        <div class="phone-screen"><img src="sc-rivers.jpg" alt="River gauges" loading="lazy" /></div>
312        <span class="phone-tag"><span class="dot"></span>RIVERS</span>
313      </div>
314    </div>
315  </div>
316</section>
317
318<!-- AdSense: between showcase and consolidation -->
319<div class="wrap" style="padding:1.5rem 0"><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6374991879498911" data-ad-slot="5602539400" data-ad-format="auto" data-full-width-responsive="true"></ins>
319<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
319</div>
320
321<!-- -- ONE APP / CONSOLIDATION ------------------------------------- -->
322<section class="consolidate" data-reveal>
323  <div class="wrap consolidate-inner">
324    <div class="consolidate-stack" aria-hidden="true">
325      <div class="cs-app cs-app-1">
326        <svg viewBox="0 0 24 24" fill="none" stroke="#ef4444" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
327        <span>NWS Alerts</span>
328      </div>
329      <div class="cs-app cs-app-2">
330        <svg viewBox="0 0 24 24" fill="none" stroke="#4f8df4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12c1.5-2 3-2 4.5 0s3 2 4.5 0 3-2 4.5 0 3 2 4.5 0"/><path d="M2 17c1.5-2 3-2 4.5 0s3 2 4.5 0 3-2 4.5 0 3 2 4.5 0"/></svg>
331        <span>USGS Gauges</span>
332      </div>
333      <div class="cs-app cs-app-3">
334        <svg viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="2" width="6" height="11" rx="3"/><path d="M19 10a7 7 0 0 1-14 0"/><line x1="12" y1="19" x2="12" y2="22"/><line x1="8" y1="22" x2="16" y2="22"/></svg>
335        <span>Scanner Player</span>
336      </div>
337      <div class="cs-app cs-app-4">
338        <svg viewBox="0 0 24 24" fill="none" stroke="#06b6d4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21"/></svg>
339        <span>Radar Maps</span>
340      </div>
341      <div class="cs-app cs-app-5">
342        <svg viewBox="0 0 24 24" fill="none" stroke="#facc15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"/><line x1="12" y1="2" x2="12" y2="4"/><line x1="12" y1="20" x2="12" y2="22"/><line x1="4.93" y1="4.93" x2="6.34" y2="6.34"/><line x1="17.66" y1="17.66" x2="19.07" y2="19.07"/></svg>
343        <span>Forecasts</span>
344      </div>
345      <div class="cs-app cs-app-6">
346        <svg viewBox="0 0 24 24" fill="none" stroke="#f97316" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 0 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"/></svg>
347        <span>Fire Weather</span>
348      </div>
349      <div class="cs-arrow">
350        <svg viewBox="0 0 48 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round">
351          <line x1="2" y1="8" x2="42" y2="8"/>
352          <polyline points="36 2 42 8 36 14"/>
353        </svg>
354      </div>
355      <div class="cs-result">
356        <img src="favicon.png" alt="" />
357        <div class="cs-result-text">
358          <strong>StormCast</strong>
359          <span>One app</span>
360        </div>
361      </div>
362    </div>
363
364    <div class="consolidate-copy">
365      <span class="eyebrow"><span class="dot"></span>ONE APP, EVERYTHING</span>
366      <h2 class="section-title">Stop juggling <span class="accent">six different apps</span> during severe weather.</h2>
367      <p class="section-sub">When a storm rolls in, the last thing you need is to open one app for NWS warnings, another for the river gauge, and a browser tab for the radar &mdash; plus a separate site to find a working police or fire scanner stream. StormCast pulls every signal that actually matters &mdash; severe weather, flood stages, radar, fire weather, AQI &mdash; into one console, and lets you paste in your own scanner stream URLs so they live in the same player. Less tab-hopping. Faster decisions. One source of truth on the screen you already carry.</p>
368    </div>
369  </div>
370</section>
371
372<!-- -- COMPARISON TABLE -------------------------------------------- -->
373<section class="compare" data-reveal>
374  <div class="wrap">
375    <div class="compare-head">
376      <span class="eyebrow"><span class="dot"></span>SIDE BY SIDE</span>
377      <h2 class="section-title">How it stacks up.</h2>
378      <p class="section-sub" style="margin-left:auto;margin-right:auto;">An honest comparison against the apps you might already have on your phone.</p>
379    </div>
380
381    <div class="compare-card">
382      <div class="compare-table">
383        <!-- header row -->
384        <div class="compare-row compare-header">
385          <div class="compare-feature">Feature</div>
386          <div class="compare-col compare-col-us">
387            <img src="favicon.png" alt="" />
388            <span>StormCast</span>
389          </div>
390          <div class="compare-col">
391            <span class="compare-col-icon">
392              <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/></svg>
393            </span>
394            <span>Built-in weather</span>
395          </div>
396          <div class="compare-col">
397            <span class="compare-col-icon">
398              <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
399            </span>
400            <span>Weather Channel</span>
401          </div>
402        </div>
403
404        <!-- feature rows -->
405        <div class="compare-row">
406          <div class="compare-feature">NWS push notifications</div>
407          <div class="compare-cell yes">Yes</div>
408          <div class="compare-cell partial">Limited</div>
409          <div class="compare-cell yes">Yes</div>
410        </div>
411
412        <div class="compare-row">
413          <div class="compare-feature">USGS river gauge monitoring</div>
414          <div class="compare-cell yes">Yes</div>
415          <div class="compare-cell no">No</div>
416          <div class="compare-cell no">No</div>
417        </div>
418
419        <div class="compare-row">
420          <div class="compare-feature">Bring-your-own scanner streams</div>
421          <div class="compare-cell yes">Yes</div>
422          <div class="compare-cell no">No</div>
423          <div class="compare-cell no">No</div>
424        </div>
425
426        <div class="compare-row">
427          <div class="compare-feature">Custom local alert feeds (RSS)</div>
428          <div class="compare-cell yes">Yes</div>
429          <div class="compare-cell no">No</div>
430          <div class="compare-cell no">No</div>
431        </div>
432
433        <div class="compare-row">
434          <div class="compare-feature">Multi-location alerts</div>
435          <div class="compare-cell yes">Unlimited</div>
436          <div class="compare-cell partial">2&ndash;3 max</div>
437          <div class="compare-cell partial">Premium only</div>
438        </div>
439
440        <div class="compare-row">
441          <div class="compare-feature">Persistent temperature in status bar</div>
442          <div class="compare-cell yes">Yes</div>
443          <div class="compare-cell partial">Limited</div>
444          <div class="compare-cell no">No</div>
445        </div>
446
447        <div class="compare-row">
448          <div class="compare-feature">Fire weather &amp; red flag warnings</div>
449          <div class="compare-cell yes">Yes</div>
450          <div class="compare-cell no">No</div>
451          <div class="compare-cell partial">Premium only</div>
452        </div>
453
454        <div class="compare-row">
455          <div class="compare-feature">Hurricane tracker</div>
456          <div class="compare-cell yes">Yes</div>
457          <div class="compare-cell partial">Basic</div>
458          <div class="compare-cell yes">Yes</div>
459        </div>
460
461        <div class="compare-row">
462          <div class="compare-feature">Minimal ads</div>
463          <div class="compare-cell yes">Yes</div>
464          <div class="compare-cell partial">Varies</div>
465          <div class="compare-cell no">Heavy</div>
466        </div>
467
468        <div class="compare-row">
469          <div class="compare-feature">No data sold to third parties</div>
470          <div class="compare-cell yes">Yes</div>
471          <div class="compare-cell partial">Varies</div>
472          <div class="compare-cell no">No</div>
473        </div>
474
475        <div class="compare-row">
476          <div class="compare-feature">Subscription cost</div>
477          <div class="compare-cell yes">Free</div>
478          <div class="compare-cell yes">Free</div>
479          <div class="compare-cell partial">
479$3+/mo Pro</div>
480        </div>
481      </div>
482    </div>
483
484    <p class="compare-scroll-hint" aria-hidden="true">&#x2190; swipe to compare &#x2192;</p>
485    <p class="compare-foot">StormCast is free and supported by minimal, non-intrusive ads. Core severe-weather and emergency alerts will always remain free. See our <a href="/privacy#future">privacy policy</a> for details.<br /><br />Comparison reflects publicly available app features as of June 2026. Built-in weather varies by device manufacturer. StormCast is in active development &mdash; some features may behave differently in your environment.</p>
486  </div>
487</section>
488
489<!-- -- FEATURES ---------------------------------------------------- -->
490<section class="features" id="features" data-reveal>
491  <div class="wrap">
492    <div class="features-head">
493      <span class="eyebrow"><span class="dot"></span>SYSTEM CAPABILITIES</span>
494      <h2 class="section-title">Everything you need<br />to <span class="accent">stay ahead of the storm</span>.</h2>
495      <p class="section-sub" style="margin-left:auto;margin-right:auto;">Every sensor stream that matters, one app. Built for people who need to know about severe weather <em>before</em> it arrives — not after.</p>
496    </div>
497
498    <div class="features-grid">
499      <article class="feat">
500        <div class="feat-icon-bg" style="background:rgba(239,68,68,0.1);border-color:rgba(239,68,68,0.25);">
501          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#ef4444" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
502        </div>
503        <h3>Severe Weather Alerts</h3>
504        <p>Push notifications for every NWS warning — tornado, flood, severe thunderstorm, ice, winter. Filtered to your saved locations, delivered the second they're issued.</p>
505        <div class="feat-meta"><span>Source NWS API</span><span>Poll 30 sec</span></div>
506        <a href="/tornado-alerts" class="feat-link">Tornado alerts &#x2192;</a>
507      </article>
508
509      <article class="feat">
510        <div class="feat-icon-bg" style="background:rgba(79,141,244,0.1);border-color:rgba(79,141,244,0.25);">
511          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#4f8df4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z"/></svg>
512        </div>
513        <h3>Temperature at a Glance</h3>
514        <p>Always-on temp and conditions in your notification bar, plus a Quick Settings tile one swipe away. Updates silently in the background — never interrupts you.</p>
515        <div class="feat-meta"><span>Status bar &amp; tile</span><span>Battery-safe</span></div>
516      </article>
517
518      <article class="feat">
519        <div class="feat-icon-bg" style="background:rgba(34,197,94,0.1);border-color:rgba(34,197,94,0.25);">
520          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#22c55e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
521        </div>
522        <h3>Multi-Location Alerts</h3>
523        <p>Monitor home, work, family. Get warnings for every saved area — not just where you are right now.</p>
524        <div class="feat-meta"><span>Unlimited locations</span><span>Per-zone rules</span></div>
525      </article>
526
527      <article class="feat">
528        <div class="feat-icon-bg" style="background:rgba(250,204,21,0.1);border-color:rgba(250,204,21,0.25);">
529          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#facc15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12c1.5-2 3-2 4.5 0s3 2 4.5 0 3-2 4.5 0 3 2 4.5 0"/><path d="M2 17c1.5-2 3-2 4.5 0s3 2 4.5 0 3-2 4.5 0 3 2 4.5 0"/><path d="M2 7c1.5-2 3-2 4.5 0s3 2 4.5 0 3-2 4.5 0 3 2 4.5 0"/></svg>
530        </div>
531        <h3>River Gauge Monitoring</h3>
532        <p>USGS river gauges with NWS flood stage thresholds — Action / Flood / Moderate / Major — pushed before water hits critical.</p>
533        <div class="feat-meta"><span>USGS Water Data</span><span>NWS flood stages</span></div>
534        <a href="/flood-alerts" class="feat-link">Flood alerts &#x2192;</a>
535      </article>
536
537      <article class="feat">
538        <div class="feat-icon-bg" style="background:rgba(249,115,22,0.1);border-color:rgba(249,115,22,0.25);">
539          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#f97316" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8"/>
539<path d="M14 12a2 2 0 1 1-4 0 2 2 0 0 1 4 0z"/><path d="M20.5 5.5a10 10 0 0 0-17 0"/><line x1="12" y1="12" x2="12" y2="21"/><line x1="9" y1="21" x2="15" y2="21"/></svg>
540        </div>
541        <h3>Local Alert Feeds</h3>
542        <p>Bring your own — Code Red, Rave RSS, any local emergency URL. Push fires the second something new posts.</p>
543        <div class="feat-meta"><span>RSS / Atom</span><span>Custom URLs</span></div>
544      </article>
545
546      <article class="feat">
547        <div class="feat-icon-bg" style="background:rgba(168,85,247,0.1);border-color:rgba(168,85,247,0.25);">
548          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 0 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"/></svg>
549        </div>
550        <h3>Fire Weather &amp; AQI</h3>
551        <p>Red Flag warnings, fire danger levels, AQI and UV index — one place. Know before you head outside.</p>
552        <div class="feat-meta"><span>NWS Fire Wx</span><span>AirNow AQI</span></div>
553        <a href="/air-quality-alerts" class="feat-link">Air quality alerts &#x2192;</a>
554      </article>
555
556      <article class="feat">
557        <div class="feat-icon-bg" style="background:rgba(6,182,212,0.1);border-color:rgba(6,182,212,0.25);">
558          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#06b6d4" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17.7 7.7a2.5 2.5 0 1 1 1.8 4.3H2"/><path d="M9.6 4.6A2 2 0 1 1 11 8H2"/><path d="M12.6 19.4A2 2 0 1 0 14 16H2"/></svg>
559        </div>
560        <h3>Hurricane Tracker</h3>
561        <p>Live NHC storm tracks, categories, and forecast cones during hurricane season. Stay ahead of every advisory.</p>
562        <div class="feat-meta"><span>NHC feed</span><span>Cone of uncertainty</span></div>
563        <a href="/hurricane-tracker" class="feat-link">Hurricane tracker &#x2192;</a>
564      </article>
565
566      <article class="feat">
567        <div class="feat-icon-bg" style="background:rgba(45,212,191,0.1);border-color:rgba(45,212,191,0.25);">
568          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#2dd4bf" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="3 6 9 3 15 6 21 3 21 18 15 21 9 18 3 21"/><line x1="9" y1="3" x2="9" y2="18"/><line x1="15" y1="6" x2="15" y2="21"/></svg>
569        </div>
570        <h3>Live Radar &amp; Maps</h3>
571        <p>Interactive radar, lightning strikes, storm cell tracking. See exactly what's heading your way and when.</p>
572        <div class="feat-meta"><span>NOAA NCEP radar</span><span>Live lightning</span></div>
573      </article>
574
575      <article class="feat">
576        <div class="feat-icon-bg" style="background:rgba(99,102,241,0.1);border-color:rgba(99,102,241,0.25);">
577          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#818cf8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="2" width="6" height="11" rx="3"/><path d="M19 10a7 7 0 0 1-14 0"/><line x1="12" y1="19" x2="12" y2="22"/><line x1="8" y1="22" x2="16" y2="22"/></svg>
578        </div>
579        <h3>Emergency Scanner</h3>
580        <p>Paste your favorite police, fire, EMS, or weather scanner stream URLs and listen to all of them in one player. Works with any public audio stream URL.</p>
581        <div class="feat-meta"><span>Bring your own URLs</span><span>Background audio</span></div>
582      </article>
583
584      <article class="feat">
585        <div class="feat-icon-bg" style="background:rgba(245,158,11,0.1);border-color:rgba(245,158,11,0.25);">
586          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#f59e0b" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/><line x1="12" y1="2" x2="12" y2="4"/></svg>
587        </div>
588        <h3>Custom Alert Tone</h3>
589        <p>Weather alerts fire with a distinctive two-chirp tone — not a generic ding. You'll know it's a real warning before you even look at your phone.</p>
590        <div class="feat-meta"><span>Unique sound signature</span><span>Hard to miss</span></div>
591      </article>
592
593      <article class="feat">
594        <div class="feat-icon-bg" style="background:rgba(244,63,94,0.1);border-color:rgba(244,63,94,0.25);">
595          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#f43f5e" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0z"/><circle cx="12" cy="10" r="3"/></svg>
596        </div>
597        <h3>Neighborhood Reports</h3>
598        <p>Trees down, power lines, flooded or icy roads, mudslides, hail, snow depth — dropped by StormCast users near you and confirmed or flagged by the community. Auto-expires so it stays current.</p>
599        <div class="feat-meta"><span>Crowd-sourced</span><span>5 mi to county-wide</span></div>
600        <a href="/neighborhood-reports" class="feat-link">Neighborhood reports &#x2192;</a>
601      </article>
602
603      <article class="feat">
604        <div class="feat-icon-bg" style="background:rgba(168,85,247,0.1);border-color:rgba(168,85,247,0.25);">
605          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#a78bfa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l1.9 5.8L20 10l-6.1 1.2L12 17l-1.9-5.8L4 10l6.1-1.2z"/><path d="M19 17l.7 2.1L22 20l-2.3.9L19 23l-.7-2.1L16 20l2.3-.9z"/></svg>
606        </div>
607        <h3>Space Weather &amp; Aurora</h3>
608        <p>Tonight's Northern Lights chances for your exact location, your sky conditions, NOAA storm watches, live aurora maps and a beginner'
608s guide. Optional aurora alerts when a storm is strong enough to see from where you are.</p>
609        <div class="feat-meta"><span>NOAA SWPC</span><span>Optional alerts</span></div>
610        <a href="/aurora-alerts" class="feat-link">Aurora alerts &#x2192;</a>
611      </article>
612
613      <article class="feat">
614        <div class="feat-icon-bg" style="background:rgba(250,204,21,0.1);border-color:rgba(250,204,21,0.25);">
615          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#facc15" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>
616        </div>
617        <h3>Lightning Alerts</h3>
618        <p>A push when lightning strikes near you, so you can get off the field, out of the water or call the kids in before the storm arrives.</p>
619        <div class="feat-meta"><span>Live strike data</span><span>Near you</span></div>
620        <a href="/lightning-alerts" class="feat-link">Lightning alerts &#x2192;</a>
621      </article>
622
623      <article class="feat">
624        <div class="feat-icon-bg" style="background:rgba(234,88,12,0.1);border-color:rgba(234,88,12,0.25);">
625          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#fb923c" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h4l3-8 4 16 3-8h6"/></svg>
626        </div>
627        <h3>Earthquake Alerts</h3>
628        <p>Notifications for USGS-reported earthquakes near you, with the magnitude, location and how far away it was. Bigger quakes alert from farther away.</p>
629        <div class="feat-meta"><span>USGS</span><span>Magnitude-scaled</span></div>
630        <a href="/earthquake-alerts" class="feat-link">Earthquake alerts &#x2192;</a>
631      </article>
632
633      <article class="feat">
634        <div class="feat-icon-bg" style="background:rgba(59,130,246,0.1);border-color:rgba(59,130,246,0.25);">
635          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#60a5fa" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="13" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
636        </div>
637        <h3>Windows App</h3>
638        <p>StormCast on your PC with the same dashboard, radar, river gauges and space weather page, plus desktop notifications. Starts with Windows and updates itself.</p>
639        <div class="feat-meta"><span>Windows 10/11</span><span>Free</span></div>
640        <a href="/download-windows" class="feat-link">Download for Windows &#x2192;</a>
641      </article>
642    </div>
643
644    <div class="features-status-bar">
645      <span class="features-status-dot"></span>
646      <span>All data feeds monitored 24/7</span>
647      <a href="/status" class="features-status-link">View live system status &#x2192;</a>
648    </div>
649  </div>
650</section>
651
652<!-- AdSense: between features and limits -->
653<div class="wrap" style="padding:1.5rem 0"><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6374991879498911" data-ad-slot="5602539400" data-ad-format="auto" data-full-width-responsive="true"></ins>
653<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
653</div>
654
655<!-- -- WHAT THIS APP WON'T DO -------------------------------------- -->
656<section class="limits" data-reveal>
657  <div class="wrap">
658    <div class="limits-head">
659      <span class="eyebrow"><span class="dot"></span>WHAT THIS APP WON'T DO</span>
660      <h2 class="section-title">We're upfront about the limits.</h2>
661      <p class="section-sub" style="margin-left:auto;margin-right:auto;">A safety tool is only useful if you know what it is and what it isn't. Four things we want to be clear about.</p>
662    </div>
663
664    <div class="limits-grid">
665      <article class="limit-card">
666        <div class="limit-icon" aria-hidden="true">
667          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
668            <path d="M2 8.5C5.5 8.5 8 6 8 6s2.5 2.5 6 2.5 6-2.5 6-2.5"/>
669            <path d="M2 14C5.5 14 8 11.5 8 11.5s2.5 2.5 6 2.5 6-2.5 6-2.5"/>
670            <path d="M2 19.5C5.5 19.5 8 17 8 17s2.5 2.5 6 2.5 6-2.5 6-2.5"/>
671          </svg>
672          <span class="limit-x">×</span>
673        </div>
674        <h3>It doesn't replace NOAA Weather Radio.</h3>
675        <p>When the cell network is down or the power's out, a battery-powered NOAA Weather Radio is still the most reliable line. StormCast complements that &mdash; it doesn't replace it.</p>
676      </article>
677
678      <article class="limit-card">
679        <div class="limit-icon" aria-hidden="true">
680          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
681            <circle cx="12" cy="12" r="10"/>
682            <polyline points="12 6 12 12 16 14"/>
683          </svg>
684          <span class="limit-x">×</span>
685        </div>
686        <h3>It doesn't predict the weather.</h3>
687        <p>Every alert, watch, and forecast comes straight from the National Weather Service and its partner agencies. We don't run our own models or claim to know anything the NWS doesn't.</p>
688      </article>
689
690      <article class="limit-card">
691        <div class="limit-icon" aria-hidden="true">
692          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
693            <path d="M12 1v22"/>
694            <path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/>
695          </svg>
696          <span class="limit-x">×</span>
697        </div>
698        <h3>It won't sell your data.</h3>
699        <p>No third-party tracking, no behavioral analytics, no marketing lists. Your email and saved locations exist only to deliver the alerts you signed up for. Any advertising shown will never use your personal data for targeting.</p>
700      </article>
701
702      <article class="limit-card">
703        <div class="limit-icon" aria-hidden="true">
704          <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
705            <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
706          </svg>
707          <span class="limit-x">×</span>
708        </div>
709        <h3>It can't guarantee delivery.</h3>
710        <p>Push notifications depend on your phone, your carrier, OS battery settings, and Google's Firebase service. In a real emergency, never rely on any single source &mdash; not us, not anyone. Always have a backup.</p>
711      </article>
712    </div>
713
714    <div class="limits-foot">
715      <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
716        <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/>
717      </svg>
718      <span>If we ever can't deliver on these, you'll hear about it from us first &mdash; not from a screenshot on social media.</span>
719    </div>
720  </div>
721</section>
722
723<!-- -- ARCHITECTURE / PIPELINE ------------------------------------- -->
724<section class="architecture" id="architecture" data-reveal>
725  <div class="wrap">
726    <div class="arch-card">
727      <div class="arch-head">
728        <span class="eyebrow"><span class="dot"></span>HOW IT WORKS</span>
729        <h2 class="section-title" style="margin-top:14px;">Server-side intelligence.<br />Zero battery impact on your phone.</h2>
730        <p class="section-sub">StormCast does the monitoring so your phone doesn't have to. All data is checked and filtered on our servers — your device is only contacted when something relevant happens.</p>
731      </div>
732
733      <div class="arch-pipeline">
734        <div class="arch-node">
735          <div class="arch-node-label">STEP 1</div>
736          <div class="arch-node-title">Continuous source monitoring</div>
737          <div class="arch-node-sub">NWS checked every 30 sec · other feeds every few minutes · 24/7</div>
738          <div class="src-list">
739            <div class="src">National Weather Service warnings</div>
740            <div class="src">USGS river gauge readings</div>
741            <div class="src">National Hurricane Center tracks</div>
742            <div class="src">Air quality &amp; fire weather conditions</div>
743          </div>
744        </div>
745
746        <div class="arch-arrow"><div class="line"><div class="pkt"></div></div></div>
747
748        <div class="arch-node middle">
749          <div class="arch-node-label">STEP 2</div>
750          <div class="arch-node-title">Intelligent filtering</div>
751          <div class="arch-node-sub">Relevant alerts only · no noise</div>
752          <div class="src-list">
753            <div class="src">Matched against your saved locations</div>
754            <div class="src">River thresholds checked per gauge</div>
755            <div class="src">Duplicate alerts suppressed automatically</div>
756            <div class="src">Only new, relevant events trigger a push</div>
757          </div>
758        </div>
759
760        <div class="arch-arrow"><div class="line"><div class="pkt"></div></div></div>
761
762        <div class="arch-node">
763          <div class="arch-node-label">STEP 3</div>
764          <div class="arch-node-title">Instant delivery to your device</div>
765          <div class="arch-node-sub">Push notification · app stays closed</div>
766          <div class="src-list">
767            <div class="src">Pushed the moment it's found</div>
768            <div class="src">Custom tone distinguishes weather alerts</div>
769            <div class="src">Live conditions visible in status bar</div>
770            <div class="src">No background data use between alerts</div>
771          </div>
772        </div>
773      </div>
774
775      <div class="arch-stats">
776        <div class="arch-stat">
777          <div class="v">30<span class="unit">sec</span></div>
778          <div class="l">Check interval</div>
779        </div>
780        <div class="arch-stat">
781          <div class="v">24/7</div>
782          <div class="l">Monitoring</div>
783        </div>
784        <div class="arch-stat">
785          <div class="v">6</div>
786          <div class="l">Federal sources</div>
787        </div>
788        <div class="arch-stat">
789          <div class="v">100<span class="unit">%</span></div>
790          <div class="l">Google Play</div>
791        </div>
792      </div>
793    </div>
794  </div>
795</section>
796
797<!-- AdSense: between architecture and install -->
798<div class="wrap" style="padding:1.5rem 0"><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6374991879498911" data-ad-slot="5602539400" data-ad-format="auto" data-full-width-responsive="true"></ins>
798<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>
798</div>
799
800<!-- -- INSTALL ----------------------------------------------------- -->
801<section class="install" id="install" data-reveal>
802  <div class="wrap install-grid">
803    <div class="install-left">
804      <span class="eyebrow"><span class="dot"></span>AVAILABLE NOW</span>
805      <h2 class="section-title">Get it on<br /><span class="accent">Google Play.</span></h2>
806      <p class="section-sub">StormCast is available for free on Google Play. Download it now and get severe weather alerts, live radar, river flood monitoring, and more — right on your phone.</p>
807
808      <div class="install-steps">
809        <div class="install-step">
810          <div class="install-step-num">01</div>
811          <div class="install-step-text">
812            <strong>Download from Google Play</strong>
813            <span>Tap the button below or search "StormCast" on the Play Store. It's free, no subscription required.</span>
814          </div>
815        </div>
816        <div class="install-step">
817          <div class="install-step-num">02</div>
818          <div class="install-step-text">
819            <strong>Grant permissions</strong>
820            <span>Allow location and notifications when asked — location matches alerts to your area, never shared. Notifications deliver severe weather warnings in real time.</span>
821          </div>
822        </div>
823        <div class="install-step">
824          <div class="install-step-num">03</div>
825          <div class="install-step-text">
826            <strong>Stay prepared</strong>
827            <span>Your dashboard shows current conditions, alerts, radar, and forecasts at a glance. Enable Travel Alerts for real-time tracking while driving.</span>
828          </div>
829        </div>
830      </div>
831    </div>
832
833    <div class="dl-card">
834      <div class="dl-card-head">
835        <div class="dl-pkg">
836          <img src="favicon.png" alt="StormCast" loading="lazy" />
837          <div class="dl-pkg-meta">
838            <strong>StormCast</strong>
839            app.stormcast.android
840          </div>
841        </div>
842        <div class="dl-version">Available · Google Play</div>
843      </div>
844
845      <div class="unlocked-banner" style="background:rgba(34,197,94,0.12);border-color:rgba(34,197,94,0.3);color:#86efac;">
846        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M20 6L9 17l-5-5"/></svg>
847        AVAILABLE NOW ON GOOGLE PLAY
848      </div>
849
850      <div class="dl-stats">
851        <div class="dl-stat"><div class="l">Platform</div><div class="v">Android 8.0+</div></div>
852        <div class="dl-stat"><div class="l">Price</div><div class="v">Free</div></div>
853        <div class="dl-stat"><div class="l">Ads</div><div class="v">Ad-supported</div></div>
854        <div class="dl-stat"><div class="l">Subscription</div><div class="v">None</div></div>
855      </div>
856
857      <a href="https://play.google.com/store/apps/details?id=app.stormcast.android" target="_blank" rel="noopener" class="dl-cta" style="text-decoration:none;text-align:center;display:flex;align-items:center;justify-content:center;gap:0.5rem;">
858        <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M3.609 1.814L13.792 12 3.61 22.186a.996.996 0 01-.61-.92V2.734a1 1 0 01.609-.92zm10.89 10.893l2.302 2.302-10.937 6.333 8.635-8.635zm3.199-3.199l2.302 2.302L4.864 3.477 13.5 9.81l3.199-3.302zM14.5 12l-2.302-2.302L4.864 3.365l10.937 6.333L14.5 12z"/></svg>
859        Get it on Google Play
860      </a>
861
862      <div class="dl-stores-coming">
863        <div class="dl-stores-label">Also available on</div>
864        <div class="dl-stores-row">
865          <div class="dl-store-badge">
866            <svg width="20" height="20" viewBox="0 0 24 24" fill="white"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
867            <div class="dl-store-info">
868              <span class="dl-store-name">App Store</span>
869              <span class="dl-store-sub">iOS · Coming soon</span>
870            </div>
871          </div>
872          <div class="dl-store-badge">
873            <svg width="20" height="20" viewBox="0 0 24 24" fill="white"><path d="M3.18 23.76c.39.21.84.22 1.24.03l11.75-6.54-2.76-2.76-10.23 9.27zM.29 1.27C.11 1.6 0 2.01 0 2.52v18.96c0 .51.11.92.29 1.25l.07.06 10.63-10.63v-.25L.36 1.21l-.07.06zM20.94 10.22l-2.37-1.32-2.98 2.98 2.98 2.98 2.38-1.32c.68-.38.68-1.0 0-1.38l-.01.06zM4.42.21L16.17 6.75l-2.76 2.76L3.18.24C3.58.05 4.03.06 4.42.27V.21z"/></svg>
874            <div class="dl-store-info">
875              <span class="dl-store-name">Google Play</span>
876              <span class="dl-store-sub">Android · Available Now</span>
877            </div>
878          </div>
879        </div>
880      </div>
881
882      <!-- iOS waitlist — gauges real demand before committing to an iOS build -->
883      <div class="ios-wait">
884        <div class="ios-wait-head">
885          <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor"><path d="M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.8-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z"/></svg>
886          <span class="ios-wait-title">Want StormCast on iPhone?</span>
887        </div>
888        <p class="ios-wait-sub">An iOS version is on the roadmap. Leave your email and we'll let you know the moment it's available.</p>
889
890        <form class="ios-wait-form" id="ios-wait-form" novalidate>
891          <label class="ios-wait-hp" aria-hidden="true">
892            Leave this field empty
893            <input type="text" name="website" tabindex="-1" autocomplete="off" />
894          </label>
895          <label for="ios-wait-email" class="sr-only" style="position:absolute;left:-9999px;">Email address</label>
896          <input type="email" id="ios-wait-email" name="email" placeholder="[email protected]" autocomplete="email" required />
897          <button type="submit" id="ios-wait-btn">Notify me</button>
898        </form>
899        <p class="ios-wait-msg" id="ios-wait-msg" role="status" aria-live="polite"></p>
900        <p class="ios-wait-note">Email only. No spam, no sharing &mdash; one message if iOS launches.</p>
901      </div>
902
903      <div class="dl-fineprint">
904        <strong style="color:var(--mute);display:block;margin-bottom:6px;">&#x26A0;  DISCLAIMER</strong>
905        StormCast is a supplemental awareness tool. It is <strong style="color:var(--mute);">not</strong> a substitute for official emergency communications and should <strong style="color:var(--mute);">never</strong> be relied upon for life-safety decisions. Alert data may be delayed or incomplete. Always confirm severe weather, flooding, and emergency information directly with the <a href="https://www.weather.gov" target="_blank">National Weather Service</a>, your local emergency management agency, or other official government sources. The developers assume no liability for missed, delayed, or incorrect alerts.
906      </div>
907    </div>
908  </div>
909</section>
910
911<!-- -- FAQ --------------------------------------------------------- -->
912<section class="faq" id="faq" data-reveal>
913  <div class="wrap">
914    <div class="faq-head">
915      <span class="eyebrow"><span class="dot"></span>FAQ</span>
916      <h2 class="section-title">Common questions</h2>
917    </div>
918
919    <div class="faq-list">
920      <details class="faq-item">
921        <summary>Do I need a Google account or Play Store to install StormCast?<span class="faq-icon"></span></summary>
922        <div class="faq-body">On Android, yes — StormCast is distributed through Google Play, so a Google account is required, and updates happen automatically through the Play Store. On a Windows PC, no — <a href="/download-windows">download the Windows app</a> directly from this site; it updates itself.</div>
923      </details>
924      <details class="faq-item">
925        <summary>Will StormCast drain my battery?<span class="faq-icon"></span></summary>
926        <div class="faq-body">StormCast is designed to be battery-friendly. All polling runs on our backend — severe weather alerts are checked as often as every 30 seconds, other feeds every few minutes — and your device only wakes when there's a payload to deliver. No background polling, no GPS thrash, no constant network chatter. For best results, go to <strong>Android Settings &#x2192; Apps &#x2192; StormCast &#x2192; Battery</strong> and set it to <strong>Unrestricted</strong>
926 so Android doesn't delay incoming alerts.</div>
927      </details>
928      <details class="faq-item">
929        <summary>Will I get alerts even when my phone is locked or the app is closed?<span class="faq-icon"></span></summary>
930        <div class="faq-body">Yes. StormCast uses Google's Firebase push notification service to deliver alerts in the background — the same technology used by Gmail and other major apps. As long as your phone has an internet connection, you'll receive severe weather alerts, river flood stage notifications, and emergency feed updates even when the app is completely closed.</div>
931      </details>
932      <details class="faq-item">
933        <summary>How is StormCast different from the built-in weather app?<span class="faq-icon"></span></summary>
934        <div class="faq-body">Most built-in weather apps only show forecasts. StormCast adds real-time NWS severe weather alerts with push notifications, USGS river gauge monitoring with flood stage warnings, your own emergency radio streams (police, fire, EMS scanners you add yourself), hurricane tracking, fire weather alerts, and your own local emergency alert feeds — all in one app built for areas where severe weather and flooding are serious concerns.</div>
935      </details>
936      <details class="faq-item">
937        <summary>How accurate are the weather alerts and river gauge readings?<span class="faq-icon"></span></summary>
938        <div class="faq-body">Alert data comes directly from the <a href="https://www.weather.gov" target="_blank">National Weather Service</a> and river readings come from <a href="https://waterdata.usgs.gov" target="_blank">USGS Water Resources</a> — both official federal sources. StormCast does not modify or interpret this data; it delivers it to you as quickly as possible. That said, StormCast is a supplemental tool only and should never be relied on for life-safety decisions. Always confirm with official sources during emergencies.</div>
939      </details>
940      <details class="faq-item">
941        <summary>Is StormCast free? Are there ads or subscriptions?<span class="faq-icon"></span></summary>
942        <div class="faq-body">StormCast is free to download. The app may include ads and optional subscription features to support ongoing development. The <strong>core severe-weather and emergency alerts will always remain accessible</strong> — those are safety features, not premium features.</div>
943      </details>
944      <details class="faq-item">
945        <summary>Is there an iOS version?<span class="faq-icon"></span></summary>
946        <div class="faq-body">Not yet. StormCast launched on Android first because persistent background services are significantly more flexible on Android. An iOS version is on the roadmap.</div>
947      </details>
948      <details class="faq-item">
949        <summary>What Android version do I need?<span class="faq-icon"></span></summary>
950        <div class="faq-body">StormCast requires Android 8.0 (Oreo) or newer, released in 2017. If your phone was made in the last 6&ndash;7 years it will almost certainly be compatible. The app is tested primarily on Android 12&ndash;16.</div>
951      </details>
952    </div>
953  </div>
954</section>
955
956<!-- -- ALERT TYPES -------------------------------------------------- -->
957<section class="alert-types-strip" data-reveal>
958  <div class="wrap">
959    <p class="alert-types-label">Explore alert types</p>
960    <div class="alert-types-links">
961      <a href="/alerts">Live Alert Map</a>
962      <a href="/tornado-alerts">Tornado Alerts</a>
963      <a href="/flood-alerts">River Flood Alerts</a>
964      <a href="/weather-alerts-app">Weather Alerts by City</a>
965      <a href="/earthquake-alerts">Earthquake Alerts</a>
966      <a href="/air-quality-alerts">Air Quality Alerts</a>
967    </div>
968  </div>
969</section>
970
971<!-- -- POPULAR CITIES ------------------------------------------------ -->
972<section class="alert-types-strip" data-reveal>
973  <div class="wrap">
974    <p class="alert-types-label">Popular city weather pages</p>
975    <div class="alert-types-links">
976      <a href="/weather/new-york/county/new-york">New York, NY</a>
977      <a href="/weather/california/county/los-angeles">Los Angeles, CA</a>
978      <a href="/weather/illinois/county/cook">Chicago, IL</a>
979      <a href="/weather/texas/county/fort-bend">Houston, TX</a>
980      <a href="/weather/arizona/county/maricopa">Phoenix, AZ</a>
981      <a href="/weather/pennsylvania/county/delaware">Philadelphia, PA</a>
982      <a href="/weather/texas/county/bexar">San Antonio, TX</a>
983      <a href="/weather/california/county/san-diego">San Diego, CA</a>
984      <a href="/weather/texas/county/collin">Dallas, TX</a>
985      <a href="/weather/florida/county/miami-dade">Miami, FL</a>
986      <a href="/weather/georgia/county/dekalb">Atlanta, GA</a>
987      <a href="/weather/washington/county/king">Seattle, WA</a>
988      <a href="/weather/colorado/county/adams">Denver, CO</a>
989      <a href="/weather/massachusetts/county/suffolk">Boston, MA</a>
990      <a href="/weather/michigan/county/wayne">Detroit, MI</a>
991      <a href="/weather/louisiana/county/jefferson">New Orleans, LA</a>
992      <a href="/weather/nevada/county/clark">Las Vegas, NV</a>
993    </div>
994  </div>
995</section>
996
997<!-- -- FOOTER ------------------------------------------------------- -->
998<footer>
999  <div class="wrap">
1000    <div class="footer-grid">
1001      <div class="footer-brand">
1002        <img src="favicon.png" alt="StormCast" loading="lazy" />
1003        <p>Real-time severe weather alerts, river monitoring, and emergency scanner streams — anywhere in the United States. Built independently, available on Google Play.</p>
1004      </div>
1005      <div class="footer-col">
1006        <h4>Product</h4>
1007        <a href="#features">Features</a>
1008        <a href="#architecture">Architecture</a>
1009        <a href="#install">Install</a>
1010        <a href="#faq">FAQ</a>
1011        <a href="/about">About</a>
1012        <a href="/blog/">Blog</a>
1013        <a href="/status">System Status</a>
1014        <a href="/contact">Contact &amp; Support</a>
1015        <a href="/download-windows">Download for Windows</a>
1016      </div>
1017      <div class="footer-col">
1018        <h4>Alert Types</h4>
1019        <a href="/alerts">Live Alert Map</a>
1020        <a href="/tornado-alerts">Tornado Alerts</a>
1021        <a href="/flood-alerts">Flood Alerts</a>
1022        <a href="/lightning-alerts">Lightning Alerts</a>
1023        <a href="/earthquake-alerts">Earthquake Alerts</a>
1024        <a href="/hurricane-tracker">Hurricane Tracker</a>
1025        <a href="/fire-weather-alerts">Fire Weather</a>
1026        <a href="/frost-alerts">Frost &amp; Freeze</a>
1027        <a href="/air-quality-alerts">
1027Air Quality</a>
1028        <a href="/aurora-alerts">Aurora &amp; Space Weather</a>
1029        <a href="/rain-nowcast">Rain Nowcast</a>
1030        <a href="/river-level-app">River Levels</a>
1031        <a href="/weather-alerts-app">Weather Alerts by City</a>
1032        <a href="/scanner-radio">Scanner Radio</a>
1033        <a href="/neighborhood-reports">Neighborhood Reports</a>
1034        <a href="/weather-widget">Weather Widget</a>
1035      
1036      </div>
1037      <div class="footer-col">
1038        <h4>River Gauges</h4>
1039        <a href="/river/texas/">Texas</a>
1040        <a href="/river/florida/">Florida</a>
1041        <a href="/river/north-carolina/">North Carolina</a>
1042        <a href="/river/virginia/">Virginia</a>
1043        <a href="/river/georgia/">Georgia</a>
1044        <a href="/river/pennsylvania/">Pennsylvania</a>
1045        <a href="/river/ohio/">Ohio</a>
1046        <a href="/river/missouri/">Missouri</a>
1047        <a href="/river-level-app">All States →</a>
1048      </div>
1049      <div class="footer-col">
1050        <h4>Weather Alerts</h4>
1051        <a href="/weather/texas/">Texas</a>
1052        <a href="/weather/california/">California</a>
1053        <a href="/weather/pennsylvania/">Pennsylvania</a>
1054        <a href="/weather/new-york/">New York</a>
1055        <a href="/weather/virginia/">Virginia</a>
1056        <a href="/weather/florida/">Florida</a>
1057        <a href="/weather/ohio/">Ohio</a>
1058        <a href="/weather/illinois/">Illinois</a>
1059        <a href="/weather-alerts-app">All States →</a>
1060      </div>
1061      <div class="footer-col">
1062        <h4>Data Sources</h4>
1063        <a href="https://www.weather.gov" target="_blank">National Weather Service</a>
1064        <a href="https://waterdata.usgs.gov" target="_blank">USGS Water Resources</a>
1065        <a href="https://www.nhc.noaa.gov" target="_blank">National Hurricane Center</a>
1066        <a href="https://www.airnow.gov" target="_blank">AirNow AQI</a>
1067      </div>
1068      <div class="footer-col">
1069        <h4>Legal</h4>
1070        <a href="/privacy">Privacy Policy</a>
1071        <a href="/terms">Terms of Service</a>
1072        <a href="/delete-account">Delete Account</a>
1073        <a href="#" onclick="window.googlefc&amp;&amp;window.googlefc.showRevocationMessage();return false;">Privacy Choices</a>
1074      </div>
1075    </div>
1076    <div class="footer-bottom">
1077      <span>© 2026 StormCast · Android 8.0+ · iOS coming soon</span>
1078      <span class="coord">NWS · USGS · NHC · AIRNOW — US nationwide coverage</span>
1079    </div>
1080  </div>
1081</footer>
1082
1083<!-- -- MOBILE MENU ---------------------------------------------------- -->
1084<div class="mobile-menu" id="mobile-menu" role="dialog" aria-modal="true" aria-label="Navigation">
1085  <div class="mobile-menu-backdrop" id="mobile-menu-backdrop"></div>
1086  <div class="mobile-menu-panel">
1087    <button class="mobile-menu-close" id="mobile-menu-close" aria-label="Close menu">&#x2715;</button>
1088    <a href="#features" class="menu-link">Features</a>
1089    <a href="/river-level-app" class="menu-link">River Gauges</a>
1090    <a href="/weather-alerts-app" class="menu-link">Weather Alerts</a>
1091    <a href="/scanner-radio" class="menu-link">Scanner Radio</a>
1092    <a href="#architecture" class="menu-link">Architecture</a>
1093    <a href="#install" class="menu-link">Install</a>
1094    <a href="#faq" class="menu-link">FAQ</a>
1095    <a href="/about" class="menu-link">About</a>
1096    <a href="/blog/" class="menu-link">Blog</a>
1097    <a href="/contact" class="menu-link">Contact &amp; Support</a>
1098    <a href="https://play.google.com/store/apps/details?id=app.stormcast.android" class="menu-cta">Get the App</a>
1099  </div>
1100</div>
1101
1102<script>
1103(function() {
1104  var btn    = document.getElementById('nav-hamburger');
1105  var menu   = document.getElementById('mobile-menu');
1106  var close  = document.getElementById('mobile-menu-close');
1107  var bkdrop = document.getElementById('mobile-menu-backdrop');
1108
1109  function openMenu() {
1110    menu.classList.add('open');
1111    btn.classList.add('open');
1112    btn.setAttribute('aria-expanded', 'true');
1113    document.body.style.overflow = 'hidden';
1114  }
1115  function closeMenu() {
1116    menu.classList.remove('open');
1117    btn.classList.remove('open');
1118    btn.setAttribute('aria-expanded', 'false');
1119    document.body.style.overflow = '';
1120  }
1121
1122  btn.addEventListener('click', openMenu);
1123  close.addEventListener('click', closeMenu);
1124  bkdrop.addEventListener('click', closeMenu);
1125
1126  // close on any menu link tap
1127  menu.querySelectorAll('a').forEach(function(a) {
1128    a.addEventListener('click', closeMenu);
1129  });
1130
1131  // close on Escape
1132  document.addEventListener('keydown', function(e) {
1133    if (e.key === 'Escape') closeMenu();
1134  });
1135})();
1136</script>
1136
1137
1138<script>
1139// iOS waitlist → POST /api/register-email (Netlify function, upserts to Supabase)
1140(function() {
1141  var form = document.getElementById('ios-wait-form');
1142  if (!form) return;
1143
1144  var input = document.getElementById('ios-wait-email');
1145  var btn   = document.getElementById('ios-wait-btn');
1146  var msg   = document.getElementById('ios-wait-msg');
1147  var sent  = false;
1148
1149  function say(text, kind) {
1150    msg.textContent = text;
1151    msg.className = 'ios-wait-msg' + (kind ? ' ' + kind : '');
1152  }
1153
1154  form.addEventListener('submit', function(e) {
1155    e.preventDefault();
1156    if (sent) return;
1157
1158    var email = (input.value || '').trim();
1159    // Same shape the server validates against — fail fast without a round trip
1160    if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
1161      say('Please enter a valid email address.', 'err');
1162      input.focus();
1163      return;
1164    }
1165
1166    btn.disabled = true;
1167    btn.textContent = 'Sending…';
1168    say('');
1169
1170    fetch('/api/register-email', {
1171      method: 'POST',
1172      headers: { 'Content-Type': 'application/json' },
1173      body: JSON.stringify({
1174        email:   email,
1175        source:  'landing',
1176        tags:    ['ios-waitlist'],
1177        website: form.website ? form.website.value : ''  // honeypot
1178      })
1179    })
1180      // Parse defensively — a down function or CDN error page returns HTML, and
1181      // letting r.json() throw would surface a raw "Unexpected token '<'" to the user.
1182      .then(function(r) {
1183        return r.text().then(function(t) {
1184          var j = null;
1185          try { j = JSON.parse(t); } catch (_) { /* not JSON — handled below */ }
1186          return { ok: r.ok, body: j };
1187        });
1188      })
1189      .then(function(res) {
1190        if (!res.ok || !res.body) {
1191          throw new Error((res.body && res.body.error) || 'REQUEST_FAILED');
1192        }
1193        sent = true;
1194        btn.textContent = 'Added';
1195        input.disabled = true;
1196        say(res.body.deduped
1197          ? "You're already on the list — we'll be in touch if iOS ships."
1198          : "You're on the list. We'll email you if an iOS version launches.", 'ok');
1199      })
1200      .catch(function(err) {
1201        btn.disabled = false;
1202        btn.textContent = 'Notify me';
1203        say(err.message === 'Invalid email address'
1204          ? 'Please enter a valid email address.'
1205          : "Couldn't save that just now — please try again in a moment.", 'err');
1206      });
1207  });
1208})();
1209</script>
1209
1210
1211<script src="ambient.js"></script>
vendor: 1 bytes, line 1211
1211
1212<script src="tweaks.js"></script>
vendor: 1 bytes, line 1212
1212
1213<script src="hero-widget/hero-widget.js" defer></script>
vendor: 1 bytes, line 1213
1213
1214<script src="live-hero.js" defer></script>
vendor: 1 bytes, line 1214
1214
1215<script src="city-search.js" defer></script>
1215
1216
1217<script type="application/ld+json">
1218{
1219  "@context": "https://schema.org",
1220  "@type": "FAQPage",
1221  "mainEntity": [
1222    {
1223      "@type": "Question",
1224      "name": "Do I need a Google account to install StormCast?",
1225      "acceptedAnswer": {
1226        "@type": "Answer",
1227        "text": "On Android, yes — StormCast is distributed through Google Play, so a Google account is required and updates happen automatically through the Play Store. The Windows app downloads directly from stormcastapp.com and updates itself."
1228      }
1229    },
1230    {
1231      "@type": "Question",
1232      "name": "Will StormCast drain my battery?",
1233      "acceptedAnswer": {
1234        "@type": "Answer",
1235        "text": "StormCast is designed to be battery-friendly. All polling runs on our backend — severe weather alerts are checked as often as every 30 seconds, other feeds every few minutes — and your device only wakes when there's a payload to deliver. No background polling, no GPS thrash, no constant network chatter. For best results, set StormCast to Unrestricted battery in Android Settings so Android doesn't delay incoming alerts."
1236      }
1237    },
1238    {
1239      "@type": "Question",
1240      "name": "Will I get alerts even when my phone is locked or the app is closed?",
1241      "acceptedAnswer": {
1242        "@type": "Answer",
1243        "text": "Yes. StormCast uses Google's Firebase push notification service to deliver alerts in the background. As long as your phone has an internet connection, you'll receive severe weather alerts, river flood stage notifications, and emergency feed updates even when the app is completely closed."
1244      }
1245    },
1246    {
1247      "@type": "Question",
1248      "name": "How is StormCast different from the built-in weather app?",
1249      "acceptedAnswer": {
1250        "@type": "Answer",
1251        "text": "Most built-in weather apps only show forecasts. StormCast adds real-time NWS severe weather alerts with push notifications, USGS river gauge monitoring with flood stage warnings, your own emergency radio scanner streams, hurricane tracking, fire weather alerts, and custom local emergency alert feeds — all in one app."
1252      }
1253    },
1254    {
1255      "@type": "Question",
1256      "name": "How accurate are the weather alerts and river gauge readings?",
1257      "acceptedAnswer": {
1258        "@type": "Answer",
1259        "text": "Alert data comes directly from the National Weather Service and river readings come from USGS Water Resources — both official federal sources. StormCast does not modify or interpret this data; it delivers it as quickly as possible. StormCast is a supplemental tool and should never be relied on for life-safety decisions."
1260      }
1261    },
1262    {
1263      "@type": "Question",
1264      "name": "Is StormCast free? Are there ads or subscriptions?",
1265      "acceptedAnswer": {
1266        "@type": "Answer",
1267        "text": "StormCast is free to download. The app may include ads and optional subscription features. Core severe-weather and emergency alerts will always remain accessible."
1268      }
1269    },
1270    {
1271      "@type": "Question",
1272      "name": "Is there an iOS version?",
1273      "acceptedAnswer": {
1274        "@type": "Answer",
1275        "text": "Not yet. StormCast launched on Android first. An iOS version is on the roadmap."
1276      }
1277    },
1278    {
1279      "@type": "Question",
1280      "name": "What Android version do I need?",
1281      "acceptedAnswer": {
1282        "@type": "Answer",
1283        "text": "StormCast requires Android 8.0 (Oreo) or newer. If your phone was made in the last 6&ndash;7 years it will almost certainly be compatible. The app is tested primarily on Android 12&ndash;16."
1284      }
1285    }
1286  ]
1287}
1288</script>
vendor: 1 bytes, line 1288
1288
1289<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v4bc70e2c01a94c73b74392e4234840661791215815920" integrity="sha512-L0ha0OXavK/8okipN9F8BtP84dg9DUhPERbBXzwI6dgTA55d2+yweo3pn5CSFYs45/r8md2+xvUPtTdvTNRfjA==" data-cf-beacon='{"version":"2024.11.0","token":"14acf6e7358d4aafa68ae61476110de1","r":1,"spa":2}' crossorigin="anonymous"></script>
1289
1290</body>
1291</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.