Inspiration
Over a billion people live with a disability, yet most of the web is built as if they don't exist. Images have no alt text, buttons are announced as just "button", text is too faint to read, and many controls can't be reached with a keyboard. Manual accessibility audits are slow and expensive, so small businesses, schools and NGOs rarely fix these problems. We wanted a tool that finds the barriers and fixes them, without anyone having to rewrite their site.
What it does
AccessForAll scans a web page for barriers that block blind, deaf and motor-impaired users, repairs what it can safely, and flags what still needs a human.
- Detects WCAG violations with axe-core, plus a keyboard-traversal audit that finds unreachable controls and focus traps.
- Fixes contrast, language, viewport and tabindex problems with fast deterministic rules.
- Uses Gemini AI to infer missing labels for buttons, links, form fields, frames and page titles, and Gemini vision plus OCR to write meaningful alt text (or mark an image decorative).
- Verifies every fix. Each patch is applied in a fresh headless browser and the page is re-audited. A fix is kept only if it solves its target issue and introduces no regressions.
- Reports everything in a WCAG-mapped HTML or JSON report, and lets you accept, reject or edit any fix.
The interactive demo includes a broken online shop you can scan and repair in one click, a screen reader view that shows what a blind user hears, a tab-order overlay, a colour-contrast checker, and display settings (text size up to 300%, line spacing, reduced motion). A Scan a real page section runs the full backend pipeline on any URL or pasted HTML, in Fast (rules only) or Thorough (adds AI) mode.
How we built it
- Backend: Python, FastAPI, Celery, Redis and PostgreSQL
- Detection: Playwright (headless Chromium) and axe-core
- Perception and repair: Tesseract OCR and the Google Gemini API
- Frontend: a static, build-free site designed to be accessible itself (skip link, ARIA live regions, Atkinson Hyperlegible font)
- Deployment: Docker, with the frontend on Vercel and the backend on Render, and live scan progress streamed over WebSocket
The key design choice: the AI never writes HTML. It returns only a short text value, which the server wraps in a whitelisted patch. Only safe attributes and styles are allowed, and scripts, event handlers and javascript: URLs are rejected. The same apply_patch.js runs in both the validator and the live preview, so what we test is exactly what ships.
Challenges we ran into
- Making AI fixes trustworthy. Models can be confidently wrong, so we built a verify-by-re-testing loop instead of trusting the output.
- Avoiding regressions. A fix for one issue can break another, so every patch is checked against the full audit and the keyboard-trap check.
- Free-tier rate limits. Gemini's free API allows about 10 requests a minute, so we added a global throttle with retry and backoff, plus caching so nothing is paid for twice.
- Safe server-side scanning. Fetching arbitrary URLs is risky, so we added SSRF protection on every request, API-key auth, rate limiting, and stripping of form values and scripts from page snapshots.
Accomplishments that we're proud of
- A working end-to-end pipeline that detects, fixes and proves each fix.
- A security model where the AI is limited to a small set of safe actions.
- A demo site that is itself fully keyboard and screen-reader friendly.
What we learned
Accessibility is as much about trust as technology: a tool that silently changes a page is only useful if you can see, verify and undo every change. We also learned how much deterministic rules can do before an AI is even needed, which keeps the tool fast, cheap and predictable.
What's next for accessforall
- A browser extension (Chromium first) so people can fix sites they don't own
- Live Tesseract.js OCR inside the extension
- A CLI mode for CI that fails a build when the accessibility score drops
- Iframe and shadow-DOM scanning, and batch patch validation for speed
Live demo: https://acessforall-web.vercel.app/app/index.html#live Code: https://github.com/millyshreenp-ship-it/acessforall
Built With
- axe-core
- celery
- css3
- docker
- fastapi
- gemini-api
- google-ai-studio
- html5
- javascript
- playwright
- postgresql
- python
- redis
- tesseract
- vercel
- websockets
Log in or sign up for Devpost to join the conversation.