Skip to content

ravidsrk/frontguard

Repository files navigation

πŸ›‘οΈ Frontguard

CI npm: @frontguard/cli npm: @frontguard/playwright License: MIT Tests

AI-powered frontend visual regression testing for web teams β€” detect, understand, and fix visual bugs before they ship to production.

Backend has Datadog, Sentry, PagerDuty β€” a $20B+ monitoring ecosystem. Frontend gets... manual QA and hoping for the best. Frontguard changes that.

44 test files Β· multi-browser Β· AI vision analysis Β· self-hostable Β· MIT

Numbers above are derived from source by scripts/stats.ts (regenerated on every npm run stats). See scripts/stats.json for the canonical snapshot.

Frontguard demo: init, doctor, run, AI classification
πŸ“½οΈ Demo: frontguard init β†’ doctor β†’ run β†’ AI classification.

πŸš€ 0.2.0 is live

Five packages just shipped to npm: @frontguard/cli, @frontguard/playwright, @frontguard/mcp, @frontguard/netlify-plugin, create-frontguard-plugin. Full release notes in CHANGELOG.md; go/no-go in docs/launch-readiness.md; first validation run results in validation/results-v0.2.md (0.0% pixel-only false positives on 43 recheck routes).

Built in the open

Every line of Frontguard is MIT-licensed and lives in this repo. The CLI, the AI vision pipeline, the cloud-api (Cloudflare Workers + D1 + R2), the four integrations (Slack / GitHub / Vercel / Netlify), the MCP server, the Dockerised cross-OS renderer, and the self-host docker-compose are all here. The 21 PRs that built v0.2.0 are all on main β€” you can read the adversarial review we audited the prior state against, the competitive research that anchored the boundary, and the product-completion plan that defined what "complete" meant. Nothing is hidden behind a "request a demo."

If you'd rather not run your own AI keys, the cloud is opt-in. If you'd rather not use the cloud, the CLI is free forever. If you'd rather run the whole stack on your own machines, the self-host guide is the recipe.

Why Frontguard?

  • 🧠 AI-powered analysis β€” Doesn't just say "pixels differ." It classifies the change (regression vs intentional vs content update), explains why, and suggests a fix. This kills the #1 pain of visual testing: false positives.
  • 🎯 Anti-flake rendering β€” Multi-render consensus eliminates the flaky-screenshot noise that makes teams disable their visual suites.
  • πŸ€– In-IDE agents via MCP β€” @frontguard/mcp exposes "what regressed on this PR" and "give me the suggested fix for diff N" to Claude Code / Cursor / Copilot.
  • 🐳 Cross-OS byte-equivalent baselines β€” pinned Docker renderer so a fix that closes the diff on macOS closes it on Linux CI too. No more 428-day flake debugging.
  • πŸ”“ Open-source & self-hostable β€” CLI-first, free forever. No per-screenshot pricing cliff, no dashboard lock-in, BYO AI key. The self-host guide is a one-command recipe.

What It Does

Developer pushes code β†’ Frontguard renders every page β†’ Compares to baselines β†’
AI explains what changed and why β†’ Suggests fixes β†’ Posts PR comment
  • Detect β€” Pixel diff + DOM diff catches what humans miss
  • Understand β€” AI explains why something broke, not just "pixels differ"
  • Fix β€” Verified code fixes, re-rendered to confirm they work (Phase 2)

Quick Start

Prerequisites: Node.js 20+ and npm 9+

# Install
npm install @frontguard/cli

# Initialize config (auto-detects your framework, --ci adds a GitHub Action)
npx -p @frontguard/cli frontguard init --ci

# Verify your environment is ready
npx -p @frontguard/cli frontguard doctor

# Run visual regression tests
npx -p @frontguard/cli frontguard run --url http://localhost:3000

# Accept current screenshots as new baselines
npx -p @frontguard/cli frontguard update-baselines

Full documentation: frontguard.dev/docs Β· internal notes in docs/

Features

  • Zero-config route discovery β€” Auto-crawls your app to find all pages
  • Multi-browser β€” Chromium, Firefox, WebKit via Playwright
  • AI-powered analysis β€” BYOK (OpenAI/Anthropic) classifies regressions vs intentional changes
  • Smart rendering β€” Dependency graph renders only pages affected by your changes
  • Preview deployments β€” Auto-detects Vercel/Netlify preview URLs
  • Git-native baselines β€” Stored in orphan branch, zero main branch bloat
  • Framework detection β€” Next.js, Remix, SvelteKit, Nuxt, Astro out of the box
  • Security hardened β€” Shell injection prevention, path traversal guards, API key redaction
  • Memory managed β€” Streaming buffers, temp file cleanup, bounded concurrency
  • PR thumbnails β€” Baseline/current/diff images embedded in PR comments (R2/S3/GitHub artifacts)
  • Per-route thresholds β€” Strict on /checkout, relaxed on /blog β€” all in one config

How Frontguard Compares

Frontguard Percy Chromatic BackstopJS Lost Pixel Argos
Open source βœ… MIT ❌ ◐ βœ… ◐ (read-only) βœ… MIT
CLI-first βœ… ❌ ❌ βœ… βœ… βœ…
AI change classification βœ… ❌ ❌ ❌ ❌ ❌
AI fix verification βœ… ❌ ❌ ❌ ❌ ❌
Anti-flake rendering βœ… ◐ ◐ ❌ ❌ ◐
Self-hostable βœ… ❌ ❌ βœ… ◐ 🟑
Free tier Forever (CLI) Trial β†’ $399/mo Storybook hobby Free Sunset Hobby + unlimited Playwright traces
Pro entry $29/mo (optional) ~$399/mo $179/mo n/a n/a $100/mo
Actively maintained βœ… βœ… βœ… ❌ (low activity) ❌ (Figma acqui-hire 2026-04-22) βœ…

Migrating? See the BackstopJS, Lost Pixel, and Argos guides. Comparisons: Percy Β· Chromatic Β· Argos.

AI Classification Example

  ✘ /dashboard @ 375px β€” 2.34% changed
    πŸ”΄ AI Analysis β€” Regression (94% confidence)
    "The sidebar overlaps the main content on mobile. A flex-direction
     change in Dashboard.module.css:28 removed the column stacking."
    Suggested fix: restore `flex-direction: column` at the < 768px breakpoint.

  βœ“ /pricing @ 1440px β€” 0.8% changed
    🟒 AI Analysis β€” Intentional (91% confidence)
    "New 'Enterprise' pricing tier added. Layout intact, content expanded."

Configuration

// frontguard.config.ts
export default {
  version: 1,
  baseUrl: 'http://localhost:3000',

  // Auto-discover routes (zero config)
  discover: {
    startUrl: '/',
    maxDepth: 3,
    exclude: ['/admin/*', '/api/*'],
  },

  // Or explicit routes
  // routes: ['/', '/pricing', '/checkout'],

  viewports: [375, 768, 1440],
  browsers: ['chromium'],
  threshold: 0.1,

  // AI analysis (optional, BYOK)
  ai: {
    provider: 'openai',
    model: 'gpt-4o',
  },

  // Ignore dynamic content
  ignore: [
    { selector: '.dynamic-timestamp' },
  ],
};

How It Works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ROUTE DISCOVERY │───▢│  RENDER PAGES    │───▢│  PIXEL DIFF     β”‚
β”‚  Crawl / Config  β”‚    β”‚  Playwright Γ—    β”‚    β”‚  pixelmatch     β”‚
β”‚  / Filesystem    β”‚    β”‚  viewports Γ—     β”‚    β”‚  fast gate      β”‚
β”‚                  β”‚    β”‚  browsers        β”‚    β”‚  (90% pass here)β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                        β”‚ changed
                                                        β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  PR COMMENT     │◀───│  AI ANALYSIS     │◀───│  DOM DIFF       β”‚
β”‚  Visual diffs   β”‚    β”‚  GPT-4V / Claude β”‚    β”‚  Structural +   β”‚
β”‚  Explanation    β”‚    β”‚  Classify +      β”‚    β”‚  computed styles β”‚
β”‚  Fix suggestion β”‚    β”‚  explain + fix   β”‚    β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

CLI Output

 frontguard

 πŸ” Discovering routes... found 47 routes
 πŸ“Š 12/47 routes affected by changed files
 πŸ–₯  Rendering 12 routes Γ— 3 viewports

 ───────────────────────────────────────────
  RESULTS                        12 routes
 ───────────────────────────────────────────
  βœ“ /                375  768  1440   PASS
  βœ“ /pricing         375  768  1440   PASS
  ⚠ /checkout        375  768  1440   WARNING
  ✘ /dashboard       375  768  1440   REGRESSION
  β˜… /settings        375  768  1440   NEW
 ───────────────────────────────────────────

  ✘ /dashboard @ 375px
    AI: "Sidebar overlaps main content on mobile.
         flex-direction change in Dashboard.module.css:28"
    Severity: πŸ”΄ Critical (confidence: 94%)

  1 regression Β· 1 warning Β· 9 passed Β· 1 new

Plugins

Frontguard ships with a plugin architecture (6 lifecycle hooks) and 5 built-in plugins:

Plugin Description Key Features
Figma (src/plugins/figma.ts) Design-to-code comparison Figma API integration, design token extraction, component mapping
Performance Budgets (src/plugins/perf-budgets.ts) Web Vitals & budgets LCP/CLS/TTFB thresholds, violations correlated with the visual diff
Accessibility (src/plugins/accessibility.ts) axe-core audits WCAG checks (contrast, alt text, target size, focus, headings) in the same render pass
Third-Party Scripts (src/plugins/third-party-scripts.ts) Script drift detection Flags ad/analytics/widget origins that appear or disappear between runs
Monitor (src/plugins/monitor.ts) Production visual monitoring (CLI + optional cloud scheduler) Live-URL checks, threshold alerting, history tracking

Plugin lifecycle hooks: beforeDiscover, afterDiscover, afterRender, afterCompare, afterRun, onError

// frontguard.config.ts
import { createFigmaPlugin } from '@frontguard/cli/plugins';

export default {
  // ...base config
  plugins: [
    createFigmaPlugin({ fileKey: 'your-figma-file-key' }),
  ],
};

Architecture

src/
β”œβ”€β”€ cli/              # CLI entry point (Commander.js)
β”œβ”€β”€ core/             # Pipeline orchestrator, types, config, plugin system
β”œβ”€β”€ discovery/        # Route discovery (crawler + filesystem)
β”œβ”€β”€ render/           # Playwright rendering engine
β”œβ”€β”€ diff/             # Pixel diff + AI vision analysis
β”œβ”€β”€ storage/          # Git orphan branch baselines
β”œβ”€β”€ report/           # Console, JSON, HTML, GitHub PR reporters
β”œβ”€β”€ plugins/          # Figma, perf budgets, accessibility, third-party scripts, monitoring
└── utils/            # Redaction, logging, retry

Pipeline: discover β†’ filter β†’ render β†’ diff β†’ analyze β†’ report

Each stage is independent with error boundaries β€” one page failing doesn't kill the run.

Documentation

See docs/ for:

Roadmap

See ROADMAP.md for the full milestone history and upcoming plans.

Releasing

The release flow is documented and reproducible β€” no hidden steps.

  1. Tag a version: git tag -a v0.X.Y -m "..." and git push origin v0.X.Y.
  2. .github/workflows/release.yml runs on the tag push: scripts/release.sh --dry-run first as a sanity check, then real publish with NPM_TOKEN from repo secrets (provenance signing in CI). Marketplace submissions emit as a workflow summary.
  3. scripts/release.sh is the single source of truth. Run it locally with --dry-run for any audit β€” npm pack --dry-run per package, manifest checks, no state mutated.

Idempotent: already-published versions are skipped automatically. Scoped packages are forced public after publish so org defaults can't silently restrict them.

Environment Variables

# AI Analysis (optional, BYOK β€” bring your own key, pick one)
FRONTGUARD_OPENAI_KEY=sk-...
FRONTGUARD_ANTHROPIC_KEY=...

# GitHub PR comments
GITHUB_TOKEN=ghp_...

Note: AI keys are optional. Frontguard works without them β€” pixel diff and DOM diff run locally. AI analysis (classification, explanations, fix suggestions) activates only when a key is provided.

Contributing

Contributions welcome! See CONTRIBUTING.md for guidelines, development setup, and how to submit PRs.

License

MIT

About

AI-powered frontend visual regression testing. Detect, understand, and fix visual bugs before production.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors