MapD – Urban Development Intelligence
Inspiration
We all see the signs: a new condo, a townhouse complex, a high-rise. Most people walk by with a lingering question: How will this actually impact our community during construction and long after? MapD turns that concern into clarity.
What it does
MapD is a geospatial storytelling platform that translates fragmented open data into a single, understandable view of an urban project. Drop a pin (or paste a permit address) and MapD:
- Aggregates relevant public datasets (permits, zoning, transit, 311/service requests, and more).
- Normalizes & links records to the same place and time windows.
- Summarizes likely impacts (traffic, noise, accessibility, nearby amenities) into plain language.
- Visualizes changes with a clean, minimal map.
How we built it
24-hour goals
- Ship a deployed MVP
- Prioritize unity & clarity over flash
- Engage our community with approachable language
Frontend: Vite + React + Tailwind for a unified, minimalist UI/UX (Mapbox GL for interactive layers).
Backend: Python + FastAPI with MongoDB for schema-light ingestion, all containerized via Docker Compose.
Intelligence: OpenAI-assisted parsing to reconcile messy fields (addresses, parcel IDs, neighborhood names) and to generate concise, non-technical summaries.
Infra: Vercel (frontend) + DigitalOcean (API) + MongoDB, with Cloudflare Workers bridging edge routing and caching.
Challenges we ran into
- No common standards across open datasets. Address formats, IDs, and time fields varied wildly. We built a reconciliation layer (geocoding + fuzzy matching) to align records.
- Concurrent cleaning and embedding. We needed embeddings early for entity linking while cleansing was still in flight; we solved this with staged, idempotent jobs.
- Token efficiency at scale. Summarizing many small records can be costly; we batched by spatial/temporal tiles and cached intermediate prompts.
- Mapbox GL integration details. Style performance and hit-testing across overlapping layers required careful source/layer ordering and debounced queries.
Accomplishments that we’re proud of
- Deployed MVP that lets anyone paste an address and see a unified, human-readable impact brief in seconds.
- One-click summaries: auto-generated “What this means for your block” blurbs with cited data rows.
- Deterministic ETL → LLM loop: prompts are fed only clean, structured fields; results are cached with traceable inputs.
- Graceful UX under messy data: if a dataset is missing, the UI explains what’s absent and why—no silent failures.
What we learned
- Clarity beats complexity. People want “what, where, when, why it matters” in <200 words, backed by a map.
- Spatial joins need human language. A parcel ID is useless to a resident unless translated into landmarks and street names.
- LLMs excel as glue, after rigor. With consistent schemas, small prompts do more, cheaper.
- Performance is UX. Caching and debouncing map events mattered as much as typography.
What’s next for MapD
- More data sources: development phases, construction schedules, bike/ped safety layers, air/noise sensors.
- Community notes: let residents pin local knowledge (detours, school pick-up congestion) with light moderation.
- Impact scenarios: compare “as-is” vs. “post-build” (parking load, stop frequency, service requests).
- Accessibility & language support: alt-text for all map layers and summaries in multiple languages.
- Civic partner pilot: work with a municipality or neighborhood association to validate workflows and data freshness SLAs. -*Responsive viewport design: Implementing mobile and differing viewport responsive UI/UX
Built With
- cloudflare
- digitalocean
- docker
- fastapi
- mongodb
- openai
- python
- react
- tailwind
- vite


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