Skip to content

codrlabs/equalview

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

112 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

equalview

An accessibility-focused web application that helps make the web more inclusive for everyone.

πŸš€ Quick Start

Prerequisites

  • Docker and Docker Compose
  • Node.js 22+ (for local development without Docker)

Running the Application

Option 1: Using Docker (Recommended)

git clone https://github.com/codrlabs/equalview.git
cd equalview
docker compose up --build

Option 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 dev

The frontend will be available at http://localhost:5173 and proxies /api and /problems to the backend at http://localhost:3000.

πŸ“ Project Structure

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

🎯 Overview

This project addresses the gap in web accessibility tools. Many websites unintentionally exclude people with disabilities, and existing solutions are often expensive or limited.

Value Proposition

  • 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

Current Status

  • 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 in localStorage. src/lib/scanAdapter.js maps the backend ScanResult into the report view model (severity counts, weighted 0–100 score, WCAG criteria derived from axe tags); src/lib/apiClient.js remains the only file that calls fetch.
  • Backend: Express API exposing /health, POST /api/scan, GET /api/scan-results, and GET /problems/:id. Layered into routes/ β†’ controllers/ β†’ services/ with a composition root in backend/app.js. services/scanRunner.js drives 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/scan runs 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.

Planned Features

  • 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

πŸ› οΈ Tech Stack

Current Stack

  • 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

Future Stack

  • Auth: OAuth (GitHub / Google) β€” scans stored in user-owned storage rather than a project database

πŸ“‹ Development Workflow

  1. Branch from main: git checkout -b feat/task-name (or fix/, chore/, docs/)
  2. Implement changes and add tests where appropriate
  3. Test locally: docker compose up --build or run backend + frontend separately
  4. Open a PR: push the branch and open a pull request β€” main is protected
  5. Review and merge

For details and recovery from common Git mistakes, see docs/guides/workflow.md.

πŸ§ͺ Testing

# 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)

πŸ“š Documentation

See docs/README.md for an index. Highlights:

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch from main
  3. Commit your changes
  4. Open a Pull Request

πŸ“‹ Accessibility Standards

Following WCAG guidelines:

  • Visual Accessibility: Contrast ratios, focus indicators
  • Structure & Semantics: Heading hierarchy, landmarks
  • Multi-media: Alt text, captions, transcripts

πŸ“„ License

MPL-2.0 (compatible with commercial use)

πŸ™ Acknowledgments

Built with ❀️ for a more accessible web. Thanks to the accessibility community for their work in making the web inclusive for everyone.

About

An open-source web accessibility tool that analyzes any website URL and provides WCAG-compliant accessibility reports with fix suggestions. An idea by @DevOlabode.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages