Inspiration
During difficult times, something as simple as getting medicine or groceries became a real challenge. There is no no easy way to ask for help, and the community had no structured way to respond. Unmet needs can turn to emergencies very quickly and calls for an app like Meridian: a voluntary, community-powered platform that connects people in need with those nearby who can help. This is especially critical during emergencies, natural disasters, or any situation where someone is vulnerable and isolated. Existing tools fall short in key ways. Facebook groups are unstructured and noisy, with no accountability or follow-through. Nextdoor surfaces needs but has no dispatch mechanism. Ushahidi and Google Crisis Map show pins on a map but nothing formally happens next. There is no assignment, no tracking, no resolution. None of these tools close the loop between a reported need and confirmed help. I wanted to build something different: anonymous, intuitive, and powerful enough that the same person can report a need and also respond to someone else's. Because in a real community, everyone plays both roles. It really does take a village.
What it does
Meridian is built around a three-role model and a stateful incident system. A Reporter submits a plain-text description of their need. Groq AI powered by Llama 3.3 70B automatically extracts urgency level, category, a plain-language summary, and the number of responders needed. The incident enters a live feed sorted by urgency. A Responder sees open incidents filtered by location and urgency. They can claim an incident, which tracks their commitment and removes it from the feed once enough responders have claimed it. Reporters retain the ability to resolve their own incident at any time. A Coordinator sees the full operational picture: a live Leaflet map with urgency-colored incident markers, real-time metrics on active incidents, unclaimed critical needs, and coverage gaps across the area. Every reported need becomes a stateful ticket. From triaged, to claimed, and tracked through to resolution. No need falls through the cracks.
How we built it
Meridian is a Next.js 14 monorepo where the frontend, API routes, and server logic all live in one project deployed on Vercel. The AI triage engine sends plain-text reports to the Groq API with a structured system prompt, returning a clean JSON object with urgency, category, summary, suggested responder, and responders needed. This happens in the /api/triage route before anything is saved. AWS DynamoDB stores all incidents in a single-table design with PK/SK structure, enabling efficient queries without table scans. The responder feed polls /api/incidents every 5 seconds for live updates. Authentication is handled by NextAuth.js with a credentials provider backed by DynamoDB for real user accounts and hardcoded demo accounts for judging. Leaflet and OpenStreetMap handle all mapping with no API key required. The design was built in Figma Make and implemented with custom React inline styles, Fraunces and Yeseva One typography, and a cozy and vibrant gradient palette inspired by warmth and care.
Challenges we ran into
Getting Groq to return clean JSON consistently required careful prompt engineering and a post-processing step to strip markdown code fences. The claim threshold system, where incidents stay visible until enough responders have claimed them, required rethinking the DynamoDB update logic to track arrays of responder IDs. Leaflet's "container already initialized" error in React's strict mode required careful lifecycle management.
Accomplishments that we're proud of
The AI triage pipeline works end to end where a citizen types a sentence and within seconds a structured, actionable incident appears in the responder feed. The claim threshold system is genuinely novel. Incidents requiring multiple responders stay visible in the feed until the community collectively meets the need. The design is distinctive and intentional. The full incident lifecycle from report to resolution is tracked and functional.
What we learned
How to design a single-table DynamoDB schema that supports multiple query patterns without scans. How to structure Next.js API routes as a real REST API. How to prompt LLMs for structured JSON output reliably. How to wire Leaflet into a Next.js app with server-side rendering disabled. How to build role-aware authentication with NextAuth without over-engineering it.
What's next for Meridian
Real-time notifications to reporters when their incident is claimed or resolved. SMS alerts via Twilio for critical incidents. A mobile-native version for faster reporting in the field. Verified responder badges for organizations. Community Hubs: localized groups tied to a specific event or geography, like a school fair or a flood zone, where reporters and responders operate within a shared context while remaining fully anonymous. Voice-to-text reporting for users who are unable to type, and full multi-language support with automatic translation so that language is never a barrier to getting help or giving it.
Built With
- api
- aws-dynamodb
- aws-sdk-v3
- bcryptjs
- dm-sans-(google-fonts)
- figma-make
- fraunces-(google-fonts)
- geocoding
- groq
- leaflet.js
- llama-3.3-70b
- lucide-react
- next.js-14
- nextauth.js
- node.js
- nominatim
- openstreetmap
- react
- shadcn/ui
- tailwind-css
- typescript
- uuid
- vercel
- yeseva-one-(google-fonts)
Log in or sign up for Devpost to join the conversation.