An accessibility-focused web application that helps make the web more inclusive for everyone.
- Docker and Docker Compose
- Node.js 22+ (for local development without Docker)
Option 1: Using Docker (Recommended)
git clone https://github.com/codrlabs/equalview.git
cd equalview
docker compose up --buildOption 2: Local Development
Run the backend and frontend in two terminals.
# Terminal 1 β backend (Express API on :3000)
cd backend
npm install
npm run dev
# Terminal 2 β frontend (Vite dev server on :5173)
cd frontend
npm install
npm run devThe frontend will be available at http://localhost:5173 and proxies
/api and /problems to the backend at http://localhost:3000.
equalview/
βββ backend/ # Node + Express API
β βββ index.js # Bootstrap (load .env, listen)
β βββ app.js # Composition root (DI wiring)
β βββ routes/ # Express routers
β β βββ index.js # Mount /api and /problems
β β βββ scan.js # POST /api/scan, GET /api/scan-results
β β βββ problems.js # GET /problems/:id
β βββ controllers/
β β βββ scanController.js # Class with bound handlers
β βββ services/
β β βββ scanRunner.js # Puppeteer + axe-core scan lifecycle
β β βββ axeTransformer.js # Pure: axe β ScanResult shape
β β βββ ssrfGuard.js # Pure: URL allow/deny rules
β βββ data/
β β βββ mockScanResults.js # Legacy fixture (problem lookup route)
β βββ tests/ # node:test + supertest
β βββ .env.example
β βββ Dockerfile
β βββ README.md
β βββ package.json
βββ frontend/ # React + Vite app
β βββ src/
β β βββ main.jsx # React bootstrap (loads fonts + theme)
β β βββ App.jsx # BrowserRouter, routes, theme + auth state
β β βββ design-system/ # Reusable UI kit components
β β β βββ Logo / Badge / Button / Card / Input
β β β βββ CodeBlock / ProblemRow / ScoreDial / SeverityBadge
β β βββ views/ # One component per screen
β β β βββ AppShell.jsx # Header + footer chrome
β β β βββ LandingView.jsx # URL entry, runs the scan
β β β βββ ResultsView.jsx # Score dial + categorised findings
β β β βββ ProblemView.jsx # Root cause + how-to-fix detail
β β β βββ StoryView / DonateView / LegalView / NotFoundView
β β β βββ SignInView / ConnectView / DashboardView / AccountView
β β βββ hooks/
β β β βββ useScan.js # Loading / error / data state machine
β β βββ lib/
β β β βββ apiClient.js # The only file that imports `fetch`
β β β βββ scanAdapter.js # Backend ScanResult β report view model
β β β βββ icons.jsx # lucide wrapper + GitHub / Google marks
β β βββ utils/
β β β βββ urlValidator.js # isValidUrl + normalizeUrl
β β βββ data/
β β β βββ placeholders.js # Auth/storage placeholder data
β β βββ styles/
β β β βββ theme.css # Design tokens, light/dark, base layer
β β β βββ fonts.css # Self-hosted Public Sans + JetBrains Mono
β β βββ assets/fonts/ # woff2 files
β β βββ __tests__/ # Vitest + React Testing Library
β β βββ setupTests.js
β βββ vite.config.js
β βββ Dockerfile
βββ shared/
β βββ types.js # JSDoc Problem / ScanResult / Impact
βββ docs/
β βββ README.md # Documentation index
β βββ guides/ # How-to guides
β βββ plans/ # Tracked implementation roadmaps
β β βββ project-roadmap.md
β β βββ architecture-map.md
β β βββ axecore-integration-roadmap.md
β β βββ codebase-reorganization.md
β βββ obsidian/ # Obsidian vault (canvas + scratch notes)
βββ docker-compose.yml # Frontend + backend
This project addresses the gap in web accessibility tools. Many websites unintentionally exclude people with disabilities, and existing solutions are often expensive or limited.
- Make accessibility testing available to everyone without high costs
- Support developers, testers, and businesses who cannot afford $500β5000+/month solutions
- Provide actionable insights and fix suggestions
- Frontend: full design-system UI (ported from the design kit in
EqualView_App.html). Routes mirror the product flow β/(scan entry),/results,/problem/:id,/story,/donate,/signin,/connect,/dashboard,/account,/privacy,/terms, and a 404 fallback β with light/dark theming persisted inlocalStorage.src/lib/scanAdapter.jsmaps the backendScanResultinto the report view model (severity counts, weighted 0β100 score, WCAG criteria derived from axe tags);src/lib/apiClient.jsremains the only file that callsfetch. - Backend: Express API exposing
/health,POST /api/scan,GET /api/scan-results, andGET /problems/:id. Layered intoroutes/βcontrollers/βservices/with a composition root inbackend/app.js.services/scanRunner.jsdrives a headless Chromium via Puppeteer, injects axe-core, and returns transformed results; the SSRF guard rejects non-http URLs and private hosts. - Real scanning: Implemented β
POST /api/scanruns a live Puppeteer + axe-core scan of the submitted URL. - Auth & saved scans: UI flow ships as a placeholder
(SignIn β Connect storage β Dashboard, data in
src/data/placeholders.js); the real OAuth + user-owned storage backend is Phase 5 of the roadmap.
- OAuth sign-in (GitHub / Google) with scans saved to user-owned storage (private repo / Drive)
- PDF report generation (browser print works today via "Download PDF")
- Rate limiting, caching and queueing for scans
- Frontend: React 19 + Vite 7 + react-router 7
- Scanner: Puppeteer + axe-core (headless Chromium)
- Backend: Node 22 + Express 5
- Styling: design-token CSS (
styles/theme.css, light/dark) with component-level inline styles; self-hosted Public Sans + JetBrains Mono; lucide-react icons - Testing: Vitest + React Testing Library (frontend), node:test + supertest (backend)
- Container: Docker (Node 22-alpine) + Docker Compose
- Auth: OAuth (GitHub / Google) β scans stored in user-owned storage rather than a project database
- Branch from main:
git checkout -b feat/task-name(orfix/,chore/,docs/) - Implement changes and add tests where appropriate
- Test locally:
docker compose up --buildor run backend + frontend separately - Open a PR: push the branch and open a pull request β
mainis protected - Review and merge
For details and recovery from common Git mistakes, see
docs/guides/workflow.md.
# Frontend
cd frontend
npm test # Vitest + React Testing Library
npm run lint
npm run build
# Backend
cd backend
npm install
npm run dev # nodemon
npm test # node --test (node:test + supertest)See docs/README.md for an index. Highlights:
docs/guides/workflow.mdβ Git/GitHub workflowdocs/guides/axecore-integration.mdβ How-to for the real scannerdocs/plans/project-roadmap.mdβ Phased roadmap (housekeeping β real scanner β UX β reliability β accounts)docs/plans/architecture-map.mdβ Per-screen architecture map and code organizationdocs/plans/axecore-integration-roadmap.mdβ Sub-roadmap for replacing the mock scannerdocs/plans/codebase-reorganization.mdβ Final repo layout after the Phase 1 / Phase 3 reorgdocs/obsidian/β Obsidian vault (canvas + supporting notes)- deepwiki.com/codrlabs/equalview/ β Interactive knowledge platform that helps navigate the codebase and makes it accessble for others to contribute.
- Fork the repository
- Create a feature branch from
main - Commit your changes
- Open a Pull Request
Following WCAG guidelines:
- Visual Accessibility: Contrast ratios, focus indicators
- Structure & Semantics: Heading hierarchy, landmarks
- Multi-media: Alt text, captions, transcripts
MPL-2.0 (compatible with commercial use)
Built with β€οΈ for a more accessible web. Thanks to the accessibility community for their work in making the web inclusive for everyone.