Contrast, A design audit tool built for designers, not developers.

A free, public web tool that audits any live URL for design quality and accessibility compliance — returning a scored, shareable report in under 15 seconds.

01The Problem

Any designer should be able to paste a URL and know — in 10 seconds — whether their product is accessible.

Manual WCAG reviews are slow, require expertise, and are rarely done pre-launch. Enterprise tools like Siteimprove and Deque are priced out of reach for most teams. Free tools like axe and Lighthouse output raw JSON or developer dashboards — unusable by most designers.

AI-generated UIs are everywhere in 2025. Most of them fail basic accessibility checks. There is a real, growing need for a tool that catches this fast — and presents findings in a way designers can actually act on.

Paid tools cost $500+/month

Free tools output raw JSON, not designer-readable reports

AI-generated UIs routinely fail basic WCAG checks

No one runs accessibility checks pre-launch

02What It Does

Paste a URL. Get a score. Know exactly what to fix.

Contrast audits any publicly accessible URL across four dimensions: color contrast ratios (WCAG AA), alt text coverage, typography consistency, and spacing grid alignment. The entire audit completes in under 15 seconds, powered by a Playwright headless browser injecting axe-core directly into the page DOM.

The output is a scored, shareable report — not a wall of error codes. Each result gets a unique URL that can be shared on LinkedIn or downloaded as a PDF. The tool also generates a social card (OG image) so audit scores can be embedded directly in posts.

Scoring Logic

  • Overall = (Contrast × 0.4) + (Alt Text × 0.3) + (Typography × 0.15) + (Spacing × 0.15). Contrast is weighted highest — it has the greatest direct impact on users with low vision or color blindness.
03How It Was Built

A full backend pipeline — from headless browser to scored, stored, shareable result.

The audit pipeline runs as a Next.js API route. When a URL is submitted, the backend calls Browserless.io (a hosted Playwright service) which visits the page in a real Chromium instance. A custom DOM evaluation script extracts text color pairs, image alt attributes, font families, and spacing values. axe-core is injected into the page for WCAG violation detection.

Four custom detector modules process the raw DOM data: typographyDrift.ts, spacingDrift.ts, colorDrift.ts, and buttonDrift.ts. A scoring engine applies weighted averages to produce the overall score. Results are stored in Vercel KV (Redis) with a 30-day TTL, enabling persistent shareable URLs. A Google Gemini 1.5 Flash integration generates plain-English fix suggestions for each finding.

Playwright via Browserless.io — real browser, real DOM

axe-core injected for WCAG AA violation detection

Gemini 1.5 Flash for plain-English fix suggestions

Vercel KV (Redis) for persistent shareable result URLs

04Architecture

350MB of Playwright can't run in a 50MB serverless function. So it doesn't.

Vercel serverless functions have a 50MB bundle limit. Playwright + Chromium weighs ~350MB. The solution: offload the browser to Browserless.io's free tier (1,000 sessions/month). The Next.js API route stays thin — it orchestrates, stores, and scores. The browser work happens remotely.

Stack

  • Next.js 14 (App Router) · TypeScript · Playwright via Browserless.io · axe-core · color.js for WCAG math · Google Gemini 1.5 Flash (free tier) · Vercel KV (Redis) · @vercel/og for OG image generation · Vercel for deployment

Rate limiting is applied at 10 audits per IP per hour (stored in Vercel KV to survive cold starts). URL results are cached for 24 hours to avoid burning Browserless sessions on repeated audits of the same URL. The tool itself is required to score 90+ on its own audit — enforced as a pre-launch checklist item.

05What I Shipped
<15sAudit time target
4Audit dimensions
10Rate limit per IP/hour
30dResult TTL in KV

V1 shipped in two weeks: URL input with validation, full Playwright audit pipeline, scored results page, shareable URLs, OG image generation, and PDF report via browser print. The Gemini integration generates human-readable fix suggestions for each finding — no accessibility jargon, just instructions.

Scored results page at /audit/[id] — persistent, shareable

OG image generation via @vercel/og for social sharing

Gemini 1.5 Flash: plain-English fixes for every finding

PDF report via print-optimised /audit/[id]/report route

06What I Learned
Infrastructure constraints shape product decisions

The 50MB Vercel function limit forced a smarter architecture. Offloading the browser to Browserless.io kept the API thin and the user experience fast.

Design the output, not just the input

Most audit tools fail at presentation. Contrast's differentiator is that the results page is as carefully designed as the products it audits.

Caching is a product decision

24-hour URL result caching prevents redundant browser sessions — but it also means repeated visits to the same URL feel instant. Performance and cost optimization overlapped.

Dogfooding is non-negotiable

The tool must score 90+ on its own homepage before launch. If the accessibility audit tool fails accessibility checks, nothing else matters.