Inspiration
Over 12% of Canadians report pain, mobility, or flexibility-related disabilities, yet finding truly accessible spaces is still difficult. We were inspired by the gap between accessibility standards on paper and what people can confidently use in real life. We wanted to build a tool that makes accessibility easier for everyday users to understand, compare, and discover, not just architects or code specialists.
What it does
Haven helps users identify and evaluate accessible homes and public spaces.
- Users upload floor plans or building documents.
- Haven extracts accessibility-related features from the file (e.g., ramps, elevators, signage, routes).
- It compares the extracted content against an accessibility rubric using chunked semantic matching and weighted scoring.
- It produces an explainable score (with what was found and what was missing).
- It can place the result on a map as a pin/heatmap entry so users can explore accessible places across the city.
How we built it
- Vite + React frontend for upload flow, map visualization, settings, reports, and final score views
- Django + Django REST Framework backend for APIs, upload handling, geocoding, and report retrieval
- SQLite database for locations, comparisons, scores, and chunk-level match results
- OpenAI embeddings for semantic similarity scoring between extracted content and rubric criteria
- Markdown chunking + cosine similarity to compare building reports against housing/commercial accessibility rubrics
- Weighted rubric scoring to prioritize important criteria (e.g., tactile markers, signage, ramps, elevators, visual alerts)
- We also added geocoding and reverse geocoding so extracted locations can appear on the map and display readable addresses.
Challenges we ran into
- Turning messy extracted text into useful, structured accessibility evidence
- Designing rubric comparison that is explainable (not just a black-box score)
- Tuning similarity thresholds so incomplete plans still get meaningful results
- Handling documents with no address or incomplete location data
- Keeping frontend and backend flows consistent (upload -> location confirmation -> final score -> map)
- Database schema drift / migration issues while evolving tables for scoring and chunk matches
- Making results readable in the UI (top criteria shown clearly instead of dumping everything)
Accomplishments that we're proud of
- Building an end-to-end workflow from file upload to explainable accessibility score
- Creating a rubric-based scoring system with chunk-level semantic matching and custom weights
- Showing why a place scored the way it did (criteria met / not met), not just a percentage
- Integrating scoring results with a map and pins for discoverability
- Supporting both commercial and housing rubrics with different weighting priorities
- Improving UX flows for missing-location cases so users can still reach the final score page
What we learned
- Chunking documents by headings/sections is much better than embedding an entire file
- Vectors are useful for semantic matching, but they need rule-based checks and good thresholds
- Accessibility scoring needs explainability to build trust
- Frontend/backend integration details (routing, async scoring, polling, DB writes) matter as much as the ML logic
- Iterating on UX with real edge cases (missing addresses, private reports, delayed scoring) improves product quality quickly
What's next for Haven
- Add stronger authentication and user accounts (saved history, private/public controls)
- Replace workaround logic for private reports with a proper is_public flag in the database
- Improve address handling with better geocoding validation and manual correction
- Add richer rubric breakdowns (category scores, evidence confidence, compliance summaries)
Built With
- cosine-similarity
- data-processing
- django
- django-rest-framework
- google-maps-geocoding-api
- jwt-(simplejwt)
- leaflet.js
- nominatim
- openai-api-(embeddings/extraction)
- python
- react
- react-leaflet
- react-router
- sqlite
- vite


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