What it does • QuietScore™: Turns 30 days of NYC 311 noise complaints into a heat map. Click any listing → see nearby incidents with timestamps and descriptors. • Vision-verified amenities: Deterministic “confidence badges” for things like desk, office chair, TV—grounded in listing photos for demo repeatability. • Group consensus & negotiator: Borda voting to pick a favorite; a scripted “host negotiator” agent to try a discount or late checkout. • Booking helper: Creates an iCalendar (.ics) file with the selected dates so the trip lands in your calendar. • All claims are traceable—every insight links back to a concrete receipt (311 incident or image evidence).
How we built it • Architecture: Next.js app (App Router) → GraphQL gateway (Node) → FastAPI (Python) over SQLite fixtures. Everything runs with Docker Compose. • Data/geo: NYC 311 GeoJSON, bbox filters, server-sorted & capped incident lists, MapLibre GL for the heat layer. • Determinism: Hash-based scoring and fixed fixtures so demos are stable and testable. • DX & testing: Simple GraphQL layer over FastAPI, pytest for API tests, curl/jq recipes for quick validation. • Polish: Resilient error handling, ESC-to-close modals, background scroll lock, NYC timezone for timestamps, clear capped messaging.
Challenges • Making a live-feeling product deterministic for a hackathon. • Reliable bbox filtering and pagination across API → Gateway → UI. • Robust GraphQL shaping (never throw; always return data or empty arrays). • Performance trade-offs rendering dense incident clusters on map + list.
What we learned • Fixture-driven development speeds iteration and keeps demos honest. • A thin GraphQL layer is great glue for multi-service stacks. • “Receipts-first” UX builds trust: show the why, not just the what.
What’s next • Swap demo vision for real models (e.g., YOLO/CLIP) with explainable evidence. • Add more cities’ 311/open data, plus POI distance scoring. • Stripe + host messaging for real bookings. • Public share links and mobile polish.

Log in or sign up for Devpost to join the conversation.