Inspiration
Accessibility maps rely on community reports, but conditions change block by block. An elevator gets repaired, a construction barrier moves, and an old report turns into a “ghost hazard.” A plain map pin can’t tell you whether the information is current, independent, or disputed. We wanted to make that uncertainty visible.
What it does
AccessMap AI lets people report obstacles such as blocked ramps, broken elevators, uneven pavement and missing curb ramps in plain text. The app:
Converts each report into a structured accessibility record (obstacle type, severity, wheelchair and stroller passability, temporary or permanent). Clusters nearby reports of the same obstacle, so repeated reports build evidence instead of cluttering the map. Lets the community confirm an obstacle is still there or mark it resolved. Gives every obstacle a transparent trust score, a status (High Support, Provisional or Uncertain), and a “last confirmed” freshness indicator. Shows a full breakdown of how each score was calculated, with a clear note that the score is not a safety guarantee. How we built it
A React and Leaflet map frontend talks to a FastAPI backend with SQLite storage. When a Nebius API key is configured, report text is sent to NVIDIA Nemotron on Nebius Token Factory through its OpenAI-compatible API, and the result is validated against a strict Pydantic schema. If the key is missing or a request fails, a deterministic local extractor keeps the app working, and every report is labeled with its source (live Nemotron, local fallback, or seeded demo).
The trust score is deliberately not generated by the model. A deterministic Python engine combines extraction quality, measurable details (such as a 12 cm drop), logarithmic corroboration from independent anonymous sessions, community confirmations and resolutions, and an obstacle-specific half-life decay. Every term is visible in the UI, so anyone can inspect why a score looks the way it does.
Challenges we ran into Keeping the AI useful without letting it decide trust, so we separated extraction from scoring. Handling conflicting reports, so disagreements stay visible instead of being averaged away. Making the app reliable with no API key or when the provider fails, using a clearly labeled fallback. Choosing decay rates, since a construction barrier and a broken elevator age very differently. Accomplishments that we’re proud of A fully auditable trust score with a visible breakdown. Honest provenance labels on every record. Automated tests for the trust engine, spatial clustering, API and provenance, with CI. Four reproducible demo scenarios: corroborated, aged, conflicting and measured reports. What we learned
Trust in crowdsourced data comes from showing evidence, not hiding it. Using an LLM for structuring text and plain code for scoring keeps the system explainable.
What’s next Calibrating trust scores against real-world outcomes. Pedestrian routing that avoids low-trust obstacles. Photo evidence, multilingual reports and local-language support for Indian cities. A broader accessibility audit of the interface itself.
Built With
- ai
- css
- docker
- fastapi
- github-actions
- html
- httpx
- javascript
- leaflet.js
- lucide-react
- nebius-token-factory
- node.js
- nvidia-nemotron
- openai-api
- openstreetmap
- pydantic
- pytest
- python
- react
- react-leaflet
- rest-api
- sqlite
- tailwindcss
- uvicorn
- vite
Log in or sign up for Devpost to join the conversation.