Case study · Progressive web app · Civic safety
Live air-raid alerts. Every region.One map. Zero server costs.
Ukraine-wide alert map — live, installable, works on any device.
Overview
AeroAlert

Challenge
What needed solving.
During active air-raid alerts in Ukraine, civilians need immediate, region-specific status — not a news feed, not a social media scroll. The requirement: a tool that shows the current alert status for each Ukrainian region at a glance, works on any phone regardless of network quality, and costs nothing to operate at scale.
The constraints are severe: the tool may be needed precisely when infrastructure is under stress and bandwidth is low.
Approach
What was done, and how.
Architecture: a fully static Next.js PWA — no backend, no database, no server to go down. Alert data is pulled from a public real-time API and rendered directly in the browser.
Static deployment on Vercel — zero per-request server cost, global CDN edge delivery, survives traffic spikes.
Service worker prefetches the Ukraine region map and UI shell, so the app opens even on a cold cache.
Region selector — tap any oblast to see current alert status and historical statistics.
Live update timestamp — users always know how fresh the data is.
Minimal UI — high-contrast, large touch targets, built for low-end phones.
Results
What changed.
- 25
- Ukrainian regions covered with live alert status
- £0
- Per-request infrastructure cost — pure static deployment on a CDN
- ✓
- Works on any phone with a browser — no app store required
- ✓
- UI shell and region map cached — the app degrades gracefully offline
Under the hood
What makes it a Progressive Web App.
- Works offline (UI shell and region map cached — graceful degradation)
- Installs to home screen (no app store — available even if stores are blocked or unavailable)
- Any device with a browser
- Zero backend cost — pure static deployment on a CDN
Tech stack
Next.js · TypeScript · Leaflet · Service Worker (Workbox) · Web App Manifest · Public Ukrainian alert API
Next project
Let’s find out if we’re a good fit.
A free 30-minute call. No pitch. No pressure.