Rating the accessibility of the physical world — one city at a time.
Website · Documentation · Sozialhelden e.V.
a11yscore is an open-source platform that computes accessibility scores for cities and regions based on OpenStreetMap data. It evaluates how accessible public infrastructure — such as transport, education, health care, and public spaces — is for people with different disabilities, and condenses this into transparent, comparable scores.
The project is being developed by Sozialhelden e.V., a non-profit organization that works on digital solutions for social participation and inclusion.
The a11yscore wants to answer the question: How accessible is a city?
It does this by analyzing millions of data points from OpenStreetMap and computing a multi-level score that covers:
| Category | Examples |
|---|---|
| 🚍 Public Transport | Bus stops, train stations |
| 🏥 Health Care | Hospitals, pharmacies |
| 🎓 Education | Schools, universities |
| 🏛️ Public Institutions | Government offices, libraries |
| 🍽️ Food & Drinks | Restaurants, cafés |
| 🎭 Culture | Museums, theaters |
| 🧑🤝🧑 Social Care | Social services |
| 🛤️ Ways & Crossings | Sidewalks, pedestrian crossings |
| 💼 Work | Office buildings |
Scores are broken down by disability topics such as wheelchair accessibility, vision, hearing and general accessibility.
The algorithm uses a hierarchical, weighted scoring model:
- Individual places are scored per criterion based on OSM tag values (e.g.
wheelchair=yes→ 100 points) - Criteria are averaged across all places in a region
- Topics (e.g. "vision", "mobility") aggregate criteria scores with data-quality-adjusted weights
- Sub-categories (e.g. "train stations") combine topic scores
- Categories (e.g. "public transport") combine sub-category scores
- The overall a11yscore is the weighted sum of all category scores
A built-in data quality model ensures that regions with sparse or inconsistent data don't produce misleading scores. Read more in the scoring algorithm documentation.
The a11yscore maps its categories to the UN Sustainable Development Goals, making it a useful metric for municipalities and policy makers tracking progress on Goal 11 (Sustainable Cities and Communities) and Goal 10 (Reduced Inequalities), among others.
The backend is a Nitro server written in TypeScript. It connects to two PostgreSQL databases:
- OSM Sync DB — contains OpenStreetMap data imported via imposm3 with the PostGIS extension
- App DB — stores computed scores, admin areas, and application state, managed with Drizzle ORM
Background jobs (score computation, admin area syncing) are managed via BullMQ with Redis as message broker.
The frontend is a separate React Router application using Sozialhelden's own UI library. Translations across all projects are managed with Transifex Native.
┌─────────────┐ ┌───────────────────┐ ┌──────────────────┐
│ Frontend │◄────►│ Nitro API Server │◄────►│ App DB (PG) │
│ (React) │ │ + BullMQ Worker │◄────►│ OSM Sync DB(PG) │
└─────────────┘ └────────┬──────────┘ └──────────────────┘
│
┌─────▼─────┐
│ Redis │
└───────────┘
Refer to the architecture overview and the architectural decision records for more information.
- nvm (or any Node.js version manager)
- Docker & Docker Compose
- Access to a PostgreSQL database containing OSM data (imported via imposm3)
# 1. Clone the repository
git clone https://github.com/sozialhelden/a11yscore.git
cd a11yscore
# 2. Install the correct Node.js version and dependencies
nvm install
npm ci
# 3. Create your environment file
cp .env.example .env
# Edit .env with your database credentials
# 4. Start PostgreSQL and Redis
docker-compose up -d
# 5. Run database migrations
npm run db:migrate
# 6. Start the development server
npm run dev
# Run all tests (unit + e2e)
npm run test
# Run only unit tests (with watch mode)
npm run test:unit:watch
# Run only e2e tests
npm run test:e2eThe API server starts at http://localhost:3000. Open it in your browser to view the interactive API documentation (powered by Scalar).
# Sync admin areas from OSM
npm run job:sync-admin-areas
# Wait for the job to complete, then compute all scores
npm run job:compute-scores
# Or compute a single admin area by ID
npm run job:compute-admin-area-score <admin-area-id>Comprehensive documentation lives in the docs/ directory:
- Architecture Overview
- Scoring Algorithm
- Algorithm Equations
- Architectural Decision Records
- Getting Started
- Internationalization
| 🔗 Project homepage | a11yscore.org |
| 🏠 Sozialhelden e.V. | sozialhelden.de |
| 📦 Frontend repo | github.com/sozialhelden/a11yscore-frontend |
| 🎨 UI library | github.com/sozialhelden/ui |
This project is licensed under the MIT License.
Copyright © 2026 Sozialhelden e.V.