About the project

BlindSpot is a community powered safety map that helps people pick safer places to meet. It blends community reports with map signals to recommend nearby spots for common real life situations like meeting a marketplace buyer, going on a first date, or walking at night.

Inspiration

A lot of safety advice online is generic, but real safety is location specific. People already try to meet near places like police stations, busy cafes, or malls, but it is hard to know what is actually around you and what the community has seen there. I wanted a tool that is quick, practical, and driven by real observations, not just assumptions.

What it does Community reports (H3 grid)

Users can click an area on the map and submit:

Camera present or camera absent

A short note

Optional place identity (name, kind, source)

Structured details like indoors, lighting, crowd, time of day, and camera location

AI recommendations

Users can type something like:

"meeting someone from marketplace"

"going to study"

"walking at night"

BlindSpot classifies the intent and suggests nearby places (cafe, mall, police station, etc.) while prioritizing:

Community evidence (yes/no reports + signage)

Distance

Camera markers density from map data

Voice mode

A hands free mode reads the top recommendations aloud and lets the user say:

"option 1", "option 2", "repeat", "new request", or "stop"

Analytics dashboards (Snowflake)

Each report is mirrored into Snowflake to power:

Heatmaps by H3 cell over time

Daily trends (yes/no/signage counts)

Conflict rate and "community confirmed" rollups

Stakeholder friendly views for demo

How I built it Frontend

Next.js + React

MapLibre + DeckGL for map rendering (cells, markers, highlights)

H3 indexing to make report aggregation stable and consistent

Backend (Next.js API routes)

/api/report validates submissions, runs moderation + summary, stores into Postgres, and mirrors into Snowflake

/api/recommend scores nearby places using community evidence, distance, and camera markers, with optional AI reranking

/api/reviews aggregates nearby evidence for a selected location

/api/analytics/* reads Snowflake views for dashboards

Data + AI

Postgres for live app storage

Snowflake for analytics and dashboard views

Gemini for moderation and report summarization

Overpass API to help block private property reports

Challenges

Picking an H3 resolution that is small enough to feel building level but still stable for aggregation

Avoiding wrong place attribution when two places are close (added name matching and careful evidence borrowing)

Snowflake key pair auth and connection reliability under concurrent dashboard queries

What I learned

Structured community data becomes much more useful than unstructured notes

Recommendations feel more trustworthy when the system explains evidence (reports, signage, conflict)

A clean analytics layer (Snowflake views) makes demos and stakeholder conversations way easier

What is next

More report types (lighting hazards, security presence, unsafe patterns)

Stronger anti abuse controls (rate limits, reputation, better moderation)

More dashboard widgets (top hotspots, week over week changes, export)

Built with

TypeScript

Next.js (React, App Router)

MapLibre + react-map-gl

DeckGL

H3 (h3-js)

PostgreSQL

Snowflake

Google Gemini API

Overpass API

ElevenLabs TTS (with browser TTS fallback)

Built With

  • api
  • app
  • browser
  • deckgl
  • elevenlabs
  • gemini
  • google
  • h3
  • h3js
  • maplibre
  • nextjs
  • osm
  • overpass
  • place
  • postgresql
  • public
  • react
  • react-map-gl
  • router
  • runs-gemini-moderation-+-summary
  • scores-them
  • snowflake
  • stores-in-postgres
  • tts
  • typescript
Share this project:

Updates