AllyCheck is a production-ready web accessibility testing platform that helps developers build inclusive digital experiences. It combines:
- axe-core - Industry-standard accessibility scanning
- Puppeteer - Automated browser testing
- Gemini AI - Natural language explanations of issues
- Beautiful UI - Modern, accessible results dashboard
- β WCAG 2.1 AA compliance checking
- β Automated issue detection with descriptions
- β Impact severity classification (Critical/Serious/Moderate/Minor)
- β HTML code snippets for affected elements
- π€ AI-generated explanations for each issue
- π€ Why users are affected (visual, keyboard, screen reader users, etc.)
- π€ Step-by-step fix recommendations with code examples
- π€ Best practices to prevent issues
- π€ Executive summary of overall accessibility
- π€ Prioritized improvement roadmap
- π Real-time scan progress tracking
- π Accessibility score (0-100%)
- π¨ Dark mode support
- π± Fully responsive design
- βΏ Accessible UI (WCAG 2.1 AA compliant)
- π₯ JSON export of results
- π Re-scan functionality
- π Security headers configured
- β‘ Rate limiting (10 req/min default)
- π Structured logging system
- π¨ Error handling & recovery
- πͺ΅ Request tracking with IDs
- π Environment-based configuration
- Node.js 18+
- npm 9+
- Gemini API Key
# Clone the repository
git clone <repository-url>
cd allycheck
# Install dependencies
npm install
# Configure environment
cp .env.example .env.local
# Edit .env.local and add your NEXT_PUBLIC_GEMINI_API_KEY
# Run development server
npm run devOpen http://localhost:3000 in your browser.
npm run build
npm start- Enter Website URL - Type any website URL (e.g.,
example.com) - Start Scan - Click "Start Test" button
- View Results - See:
- Overall accessibility score
- Breakdown by severity (Critical, Serious, Moderate, Minor)
- Detailed issue explanations
- AI-powered fix recommendations
- Improvement roadmap
- Export - Download results as JSON for records/CI-CD integration
βββββββββββββββββββββββββββββββββββββββ
β Next.js Frontend β
β - Landing page (URL input) β
β - Real-time progress modal β
β - Results dashboard β
β - Dark mode + Accessibility β
ββββββββββββββββ¬βββββββββββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββββββββββ
β Backend API (/api/scan) β
β - Rate limiting β
β - Input validation β
β - Security headers β
β - Error handling β
ββββββββββββββββ¬βββββββββββββββββββββββ
β
ββββββββββββββββΌβββββββββββββββββββββββ
β Scan Services β
β - Puppeteer (browser automation) β
β - axe-core (WCAG testing) β
β - Gemini AI (explanations) β
βββββββββββββββββββββββββββββββββββββββ
# Required
NEXT_PUBLIC_GEMINI_API_KEY=your_api_key
# Optional
NODE_ENV=production
NEXT_PUBLIC_APP_NAME=AllyCheck
NEXT_PUBLIC_APP_URL=https://yourdomain.com
NEXT_PUBLIC_SCAN_TIMEOUT=60000
NEXT_PUBLIC_PAGE_LOAD_TIMEOUT=45000
RATE_LIMIT_REQUESTS_PER_MINUTE=10
LOG_LEVEL=infoSee .env.example for all options.
allycheck/
βββ src/
β βββ app/
β β βββ api/scan/route.js # Main scan endpoint
β β βββ results/
β β β βββ page.jsx # Results page (Suspense wrapper)
β β β βββ ResultsContent.jsx # Results client component
β β βββ layout.js # Root layout with metadata
β β βββ page.js # Home/landing page
β βββ component/
β β βββ LandingPage.jsx # URL input & progress modal
β βββ lib/
β β βββ accessibilityScanner.js # Puppeteer + axe-core
β β βββ gemini.js # Gemini AI API
β β βββ logger.js # Structured logging
β β βββ rateLimiter.js # Rate limiting service
β βββ Test/
β βββ page.jsx # Test page (can be deleted)
βββ .env.example # Environment template
βββ DEPLOYMENT.md # Production guide
βββ next.config.mjs # Next.js config
βββ package.json # Dependencies
βββ README.md # This file
- API Key: Stored in environment variables, never exposed to client
- Rate Limiting: 10 requests/minute per IP (configurable)
- Input Validation: URL format checked, timeout protection
- Security Headers: XSS, Clickjacking, Content-Type protections
- Error Messages: Safe, non-revealing error responses
- Request Tracking: All scans logged with request IDs
- Average scan time: 10-30 seconds (depends on site complexity)
- AI explanation generation: 5-15 seconds per violation
- Memory usage: ~200-500MB per scan (Puppeteer)
- Network calls: 3 API calls per full scan (axe-core, explanations, summary/plan)
Recommendation: 2GB+ RAM for production deployments
npm install -g vercel
vercel
# Add NEXT_PUBLIC_GEMINI_API_KEY in environment variables
vercel deploy --proddocker build -t allycheck .
docker run -p 3000:3000 -e NEXT_PUBLIC_GEMINI_API_KEY=key allycheckSee DEPLOYMENT.md for AWS, GCP, Digital Ocean, etc.
Fixed! Results page now uses proper Suspense wrapper.
- Verify API key is correct
- Ensure Gemini API is enabled in Google Cloud
- Check quota limits
Configure in .env.local:
NEXT_PUBLIC_PAGE_LOAD_TIMEOUT=60000
NEXT_PUBLIC_SCAN_TIMEOUT=90000- Ensure 2GB+ RAM available
- Consider implementing queue system for high-traffic scenarios
- Implement caching for frequently scanned sites
Scans a website for accessibility violations.
Request:
{
"url": "https://example.com"
}Response (200 OK):
{
"requestId": "scan-1234567890",
"url": "https://example.com",
"violations": [...],
"passes": [...],
"summary": "AI-generated executive summary",
"improvementPlan": "AI-generated roadmap",
"stats": {
"total": 15,
"critical": 2,
"serious": 5,
"moderate": 8,
"minor": 0
},
"timestamp": "2025-02-07T10:30:00.000Z"
}- Security headers configured
- Rate limiting implemented
- Error handling in place
- Logging system set up
- Environment variables for secrets
- Input validation on all endpoints
- API timeout protection
- Browser safety (sandboxing)
- Dark mode support
- Accessibility compliant UI
- JSON export feature
- Request ID tracking
- Suspense boundaries for dynamic content
- Next.js build optimization
MIT License - see LICENSE file for details.
AllyCheck Team - Building accessible digital experiences
Made with βΏ accessibility in mind