Skip to main content

What is Webyes Auditor?

Webyes Auditor is a SaaS web accessibility and performance auditing platform. It allows users to:
  • Scan websites for accessibility (WCAG), performance (Lighthouse), SEO, and quality issues
  • Track issues over time with scan history and trend analysis
  • Monitor uptime with real-time alerting
  • Collect RUM (Real User Monitoring) data from live visitors
  • Generate reports (PDF/online) for stakeholders
  • Manage teams and billing (subscriptions via Stripe)

Two Frontend Apps, One Backend

The platform ships as two separate React SPAs that share code through a monorepo:

full-suite

The full-featured product: accessibility + performance + SEO + uptime + RUM + billing + team management. Deployed at app.webyes.com.

a11y

Accessibility-only SaaS — a simplified, standalone version focused purely on WCAG auditing. Deployed at accessibility.webyes.com.
Both apps talk to the same backend (auditor-backend — FastAPI on Python).

Repository Map


Key Concepts to Understand First

Before diving into code, make sure you’re comfortable with these:
Both apps use TanStack Router with file-based routing. Routes live in src/routes/ and the router tree is auto-generated into src/routeTree.gen.ts by the Vite plugin — never edit that file manually.
  • _layout.tsx files define nested layouts
  • .lazy.tsx suffix = code-split, loaded on demand
  • $param in filenames = dynamic route segment
  • (group) folders = route groups (no URL segment added)
All API data is fetched and cached through TanStack Query (React Query v5). You’ll find query hooks in src/store/server/features/. The pattern is:
  • queries.ts — read operations (useQuery)
  • mutate.ts / mutation.ts — write operations (useMutation)
UI state that doesn’t come from the server (modals open/closed, selected scan, etc.) lives in Zustand stores under src/store/client/. Each store is a single file exporting one create() hook.
Never copy-paste components between apps. If a component is needed in both apps, it belongs in packages/common/src/components/. Both apps import from there directly.
The backend uses FastAPI’s dependency injection system extensively. Database sessions, the current authenticated user, and rate limiters are all injected via Depends(...). Look for dependencies/ folders or inline Depends in route handlers.

Next Step

Set up your local environment

Follow the step-by-step guide to get all three servers running locally.