Inspiration
Vigil is Waze for emergencies; turning people on the ground into a live, AI-verified information network, giving nearby users instant and reliable awareness when it matters most.
What it does
Vigil is a real-time emergency social app built around community-sourced intelligence called Flares. In normal mode, Vigil shows a live dark map of your city. You can tap any building and drop a Flare — a geotagged report tied to that exact location. Flares are categorized by severity (Low, Medium, High, Critical), validated by AI, and assigned a credibility score. Speech bubbles float above buildings that have active Flares, giving the map a living, breathing quality. Flares expire after 24 hours, keeping the map clean and the information current.
When a verified emergency is detected, the entire UI transforms. Everything disappears except three elements locked to the corners of the screen: a one-tap Call 911 button, a live Flare feed, and the emergency type. The center of the screen shows the epicenter on a 3D map with the four most recent Flares from the area pinned around it. If you're far from the emergency, the app shows your exact distance in your preferred unit. If you're close, your location appears on the map — Find My style — so you know exactly where you are relative to the danger.
Every active emergency triggers a push notification to nearby users containing an AI-generated two-sentence summary and a danger score aggregated from all incoming Flares.
Core features:
• Flare submission tied to specific buildings with coordinate precision
• AI validation via Claude — credibility scoring, misinformation detection, danger contribution scoring
• Real-time emergency overlay with three-corner UI
• Speech bubble markers on buildings with active Flares, expandable in place
• 24-hour Flare expiry to keep intelligence current
• Push notifications with AI-written summaries sent to users within 10 miles
• 3D map default with cinematic zoom-to-location on app entry
• My Account page with personal Flare history
• Distance banner when far from emergency, live location dot when close
How we built it
Vigil is a Next.js 14 App Router application written in TypeScript. The map is powered by Mapbox GL JS via react-map-gl, running in 3D mode with pitch and bearing by default. The backend is entirely Supabase — Postgres for storage, realtime channels for live updates across emergencies and flares, and Supabase Auth for user management.
AI validation runs through the Anthropic Claude API. Every Flare submission hits a validation endpoint that scores credibility, detects misinformation, and contributes to the overall danger score of an active emergency. Emergency summaries are regenerated every five minutes while an incident is active. Push notifications use the Web Push API with VAPID keys, filtered by haversine distance so only users within 10 miles of an emergency receive alerts.
The UI was designed dark-only from the ground up — Playfair Display for editorial weight on headings and the wordmark, DM Sans for body and labels, DM Mono for all data-like elements: coordinates, timestamps, scores, distances.
Challenges we ran into
Getting the emergency UI transition right was the hardest design problem. The shift from normal map view to emergency mode needed to feel urgent without being chaotic. We went through several iterations — per-element staggered fades, CSS transitions on mount, flyTo timing — before landing on a full black flash between states that lets everything fade back in together cleanly.
The speech bubble marker system required careful clustering of coordinates. Multiple Flares near the same building needed to be resolved to a single bubble without PostGIS, so we implemented a bounding box delta approach directly in the query.
Balancing AI validation latency with user experience on Flare submission meant showing an animated "Vigil is reading your Flare…" state while the Claude API call resolves, so the wait feels intentional rather than broken.
Accomplishments that we're proud of
The emergency overlay UI. The moment an emergency goes active and the entire interface strips down to three corners and a live epicenter map — that interaction feels exactly like what a real emergency tool should feel like. Calm, fast, and clear. The Flare speech bubbles on the map. Buildings that have active reports float small editorial cards above them that expand in place when tapped. It makes the map feel alive in a way that a sidebar list never could.
The AI pipeline end-to-end. A user drops a Flare, Claude validates it, a credibility score appears, and that score feeds into an aggregated danger rating that goes out in a push notification to thousands of nearby users — all in under five seconds.
What we learned
The emergency overlay UI. The moment an emergency goes active and the entire interface strips down to three corners and a live epicenter map — that interaction feels exactly like what a real emergency tool should feel like. Calm, fast, and clear.
The Flare speech bubbles on the map. Buildings that have active reports float small editorial cards above them that expand in place when tapped. It makes the map feel alive in a way that a sidebar list never could.
The AI pipeline end-to-end. A user drops a Flare, Claude validates it, a credibility score appears, and that score feeds into an aggregated danger rating that goes out in a push notification to thousands of nearby users — all in under five seconds.
What's next for Vigil
• Native iOS and Android apps with background location for emergency proximity alerts
• Verified responder accounts (fire departments, police, emergency management) whose Flares get automatic high credibility
• Historical emergency replay — scrub through past events on the map
• Multi-language Flare translation for cities with diverse populations
• Integration with NOAA for automatic tornado and severe weather event creation
• Neighborhood watch mode — low-severity community alerts that don't trigger emergency mode but keep residents informed
Built With
- anthropic
- claude
- css
- mapboxgljs
- next.js
- police
- supabase
- tailwind
- typescript
Log in or sign up for Devpost to join the conversation.