Skip to main content
Dan Spelt
Back to engineering proof
Active
Founder and developer

AccessLens

Accessibility intelligence platform for cities

The problem

People with disabilities cannot tell in advance whether a restaurant, park, clinic, or transit stop will actually work for them. Accessibility information is inconsistent, unverified, or missing entirely.

The approach

Crowdsourced accessibility reports scored across ten criteria and rendered as colour-coded markers on an OpenStreetMap map, so a place can be assessed before travelling to it.

Evidence in the implementation

These points are grounded in the project repository, its tests, and its technical documentation. They are not estimates of business impact.

Accessibility evidence

Accessibility is the product data model, not a decorative claim: places record entrance, door, elevator, washroom, parking, signage, transit, aisle, and service-animal information alongside photos and issue reports.

Security and validation

Auth.js supports Google, magic-link, and credential sign-in. Reviewer and business capabilities are enforced in API routes and UI, with Zod schemas covering runtime input validation.

Testing

Vitest covers accessibility scoring, validation, and badge thresholds; Playwright provides an end-to-end smoke suite. A Docker test workflow is also documented.

Known constraint

Photo uploads currently use local filesystem storage, and business subscriptions use a pending placeholder state until billing is connected. Both limitations are called out in the README.

Working outcomes

  • Each place receives a calculated accessibility score across 10 criteria

    Evidence: Implemented in the Place scoring model with unit coverage.

  • Seed data covers roughly 50 Victoria places and roughly 15 high-confidence Vancouver civic and transit locations

    Evidence: Documented in the repository README and seed scripts.

  • Place pages combine scores with checklist details, photo evidence, reviews, and current issue reports

    Evidence: Documented in the README and represented by dedicated models and routes.

Technical choices and tradeoffs

Leaflet with OpenStreetMap and Nominatim instead of a commercial map API

Why: No paid key is required, so a civic project can run without per-request billing risk.

Tradeoff: Less polished geocoding, so results are cached and corrected manually where needed.

MongoDB 2dsphere index with a TTL geocode cache

Why: Proximity search needs to stay fast as the dataset grows city by city.

Tradeoff: Compound indexes have to be maintained as new filters are added.

Multi-provider sign-in (Google OAuth, email magic link, credentials)

Why: Contributors should not be blocked by one identity provider or by password friction.

Tradeoff: Three authentication paths to secure and test rather than one.

Technical foundation

  • Next.js 16 (App Router)
  • React
  • TypeScript
  • Tailwind CSS
  • MongoDB
  • Auth.js (NextAuth v5)
  • Zod
  • Leaflet + OpenStreetMap
  • Docker
  • Coolify