looksy
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@looksyScreenshot https://example.com and run a11y + performance audit"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
looksy
Screenshot any URL from the command line. Built for AI-assisted development — lets Claude Code (or any AI) see rendered pages and iterate on designs visually.
Zero config. One command. Works with any framework.
looksy https://mysite.com --design # Full-page screenshot + compact metadataFeatures
Screenshot any URL — local files (auto-served), dev servers, deployed sites
AI-optimized output — metadata sidecar with exact CSS values, not just pixels
Visual regression — baseline save/diff with pixel-level change detection
Accessibility audits — WCAG contrast, landmarks, heading structure, missing labels
Anti-fingerprint audits — class audit (with recurring class combos), font sources, asset hashes, SEO, JSON-LD schema
Structural fingerprinting — cross-site similarity scoring with
fingerprint collect/compare(8 dimensions including inline script hashes)Tailwind utility profile —
--tailwindgroups class names by category (spacing, sizing, colors, layout, typography, borders, animation)Component-level contrast — React fiber walk maps WCAG failures back to
file:linesource locationTheme validation — WCAG AA/AAA checks for theme color configs, no browser needed
Batch mode — screenshot multiple pages or directory trees in one command
Design suggestions — actionable fix recommendations with exact CSS values for contrast, a11y, SEO
Layout debugging — flex/grid container overlay with numbered labels
Responsive audit — overflow, touch targets, text size checks at 3 breakpoints
Visual regression gate — one-command
guardsubcommand for CI/CDDelta tracking — incremental diffs showing only what changed (~80 tokens)
Design spec validation — validate pages against a JSON specification
Component catalog — multi-selector element capture with grid composite
Capture history — timestamped timeline of all captures per URL
Performance analysis — bundle analysis, image audit, compression, third-party impact, cache audit, critical path, resource hints, server timing
Performance budgets — CI/CD gate with
--budget(exit code 1 on failure)One-command perf audit —
--speedruns all performance modules in one flagToken-efficient — three tiers: full meta (~2,500 tokens), compact (~1,000), text-only (~100)
CI/CD ready —
--fail-on-aa(with failure details to stderr),--budget,--jsonoutput, exit codesFast — persistent Chromium server cuts captures from ~2s to ~100ms
Security hardened — CSS selector injection prevention, path traversal guard, TOCTOU race elimination, restrictive
/tmppermissionsStrict flag parsing — typos like
--contrast-aaerror immediately instead of being silently ignoredConfigurable storage —
LOOKSY_DIRenv var for persistent baselines in CI (default:/tmp/looksy)MCP integration — runs as a tool server for Claude Code
Related MCP server: ScreenshotRender MCP Server
Install
Install straight from GitHub (not yet published to npm):
npm install -g github:atre/looksyOr from source:
git clone https://github.com/atre/looksy.git
cd looksy
npm install
npm run build
npm linkLooksy auto-installs Playwright Chromium on first install. If it doesn't, run:
npx playwright install chromiumRequires Node.js 18.3+.
PATH (mise / non-interactive shells)
npm link (or a global install) only lands looksy on PATH for shells that source your
normal shell rc. Non-interactive shells — CI steps, cron, an agent's own tool-call shell —
often skip that, especially with a version manager like mise managing
node: the shim directory isn't on PATH until mise has hooked the shell, which a
non-interactive shell frequently hasn't done. Symptom: looksy: command not found even though
npm link reported success.
Fixes, in order of preference:
# 1. Point at the linked global bin explicitly (works regardless of shell/mise state)
# (npm bin -g was removed in npm 9 — use npm prefix instead)
"$(npm prefix -g)/bin/looksy" <url>
# 2. With mise, activate its shims for the current shell
mise activate bash # or: mise activate zsh
looksy <url>
# 3. Fallback that always works — run the built CLI entry point directly with node,
# no PATH resolution involved at all:
node /path/to/looksy/dist/cli.js <url>Option 3 is the most portable one for scripts/CI: it has no dependency on PATH, npm link,
or a version manager being initialized — only that dist/ has been built (npm run build).
Quick Start
# Start persistent browser (optional but recommended — ~100ms vs ~2s per capture)
looksy --serve
# Screenshot with metadata
looksy http://localhost:3000 --design
# Check accessibility
looksy http://localhost:3000 --check "contrast:aa"
# Batch audit multiple pages
looksy http://localhost:3000 --pages "/,/pricing,/about" --contrast --fail-on-aa
# Batch audit build output directory
looksy batch test-builds/ --glob "*/index.html" --report --contrast
# Fleet audit across live domains (defaults to contrast + a11y, exit 1 on AA failure)
looksy fleet https://site-a.com https://site-b.com
# Structural fingerprint (cross-site similarity detection)
looksy fingerprint collect https://site-a.com --save site-a
looksy fingerprint collect https://site-b.com --save site-b
looksy fingerprint compare site-a site-b
looksy fingerprint diff site-a-v1 site-a-v2 # What changed between versions
looksy fingerprint collect-batch --serve-dir ./builds --glob "*/index.html" # Batch
looksy fingerprint list
# Theme validation (no browser needed)
looksy validate-theme theme.json
looksy validate-theme theme.json --compact --fail-on-aaWorkflows
Design iteration (most common)
looksy --serve # Start once per session
looksy <url> --design --name step1 # Full-page + compact metadata, labeled
looksy <url> --check "contrast:aa" # WCAG AA pass/fail with failing element details
looksy <url> --diff-inline /tmp/looksy/preview-step1.png --name step2 # Before/afterBatch site audit
looksy <url> --pages "/,/pricing,/about" --full # Screenshot multiple pages
looksy <url> --pages "/,/pricing" --design --concurrency 2 # Heavy analysis with limited parallelism
looksy <url> --pages "/,/pricing" --contrast --fail-on-aa # Contrast check all pages (details to stderr)
looksy <url> --pages "/,/pricing" --consistency # Flag cross-page divergences
looksy <url> --pages "/,/pricing" --locales "en,de" # Cross-product: 4 pagesBatch directory audit
looksy batch test-builds/ --glob "*/index.html" --report --contrast # All matching files
looksy --serve-dir ./build --pages "/,/about" --report # Serve dir + pages
looksy ./build/index.html --report # Auto-serve local fileStructural fingerprinting
looksy fingerprint collect https://site-a.com --save site-a # Collect DOM fingerprint
looksy fingerprint collect https://site-b.com --save site-b # Collect another
looksy fingerprint collect --serve-dir ./build --save my-site # Fingerprint a static build
looksy fingerprint collect-batch --serve-dir ./dist --glob "*/index.html" # Batch collect
looksy fingerprint compare site-a site-b # 0-100 similarity score
looksy fingerprint diff v1 v2 # Show what changed between versions
looksy fingerprint list # List saved fingerprintsTheme validation
looksy validate-theme theme.json # WCAG AA/AAA check for all color pairs
looksy validate-theme theme.json --compact # Condensed output
looksy validate-theme theme.json --fail-on-aa # Exit code 1 on AA failures (CI/CD)No browser needed — validates color contrast ratios directly from a theme config file.
Visual regression
looksy save <url> homepage # Save baseline
# ... make changes ...
looksy diff <url> homepage # Pixel diff → /tmp/looksy/diff.png
looksy diff before.png after.png # Or compare two local filesVisual regression gate (CI/CD)
looksy guard homepage https://staging.example.com # Auto-creates baseline on first run
looksy guard homepage https://staging.example.com # Compares on subsequent runs
looksy guard homepage https://staging.example.com --threshold 1.0 # Custom thresholdOne command that auto-creates baselines, diffs on subsequent runs, and exits with code 1 if changes exceed the threshold.
Watch mode with auto-serve
looksy --watch ./src # Auto-serves ./src, re-screenshots on change
looksy <url> --watch ./src # Watch with explicit URLWhen no URL is given, --watch auto-serves the watched directory via HTTP.
Performance audit
looksy <url> --speed # Full perf audit (all modules, one command)
looksy <url> --bundles --images --compression # Individual modules
looksy <url> --critical-path --server-timing # Render-blocking + TTFB breakdown
looksy <url> --third-party --cache-audit # Third-party impact + caching
looksy <url> --resource-hints # Preload/preconnect suggestions
looksy <url> --budget "totalJS:200KB,FCP:1800" # CI gate (exit 1 on failure)
looksy <url> --budget budget.json # Budget from JSON fileCheap verification loop
looksy <url> --report # Text-only (~100 tokens, no screenshot)
looksy <url> --check "sticky header, contrast:aa" # Pass/fail assertions (~50 tokens)
# Want the PNG too, e.g. to eyeball it later? Add -o/--name/--suffix — an explicit
# output path is honored even in --report's normally screenshot-free text-only mode.
looksy <url> --report --name cart # Text summary AND preview-cart.pngUsage
# Basic screenshot
looksy <url> # Screenshot to /tmp/looksy/preview.png
looksy ./mock.html # Screenshot a local file (auto-served via HTTP)
looksy <url> --meta # + metadata sidecar (.meta.md)
looksy <url> --annotate --meta # + numbered bounding boxes on elements
looksy <url> --perf --meta # + Core Web Vitals (FCP, LCP, CLS, TTFB)
looksy <url> -o ./screenshot.png # Custom output path
# Viewports
looksy <url> --mobile # Mobile viewport (390x844)
looksy <url> --tablet # Tablet viewport (768x1024)
looksy <url> --multi # Desktop + mobile in one shot (parallel)
looksy <url> --width 1440 --height 900 # Custom viewport
# Output naming
looksy <url> --suffix hero # Output: preview-hero.png
looksy <url> --name hero # Same as --suffix (alias)
# Capture options
looksy <url> --full # Full page scroll capture
looksy <url> --full --max-height 2000 # Full page capped at 2000px
looksy <url> --selector ".hero-section" # Screenshot specific element
looksy <url> --wait 2000 # Wait ms before screenshot
looksy <url> --dark # Emulate prefers-color-scheme: dark
looksy <url> --design # Shorthand for --full --meta --compact --fonts --css-vars --contrast --suggest
looksy <url> --fold # Above-fold only (viewport height)
looksy <url> --micro # Thumbnail mode (640px, JPEG q40)
looksy <url> --selector ".card" --all # Screenshot every matching element
looksy <url> --design-spec ./spec.json # Validate against design spec
looksy <url> --diff-report baseline-name # Semantic diff vs saved baseline
looksy <url> --format jpeg --quality 80 # JPEG output (smaller files)
# Interact before capture
looksy <url> --interact "click:.btn,wait:500" # Click, wait, then screenshot
looksy <url> --interact "scroll:800,wait:200" # Scroll down, then screenshot
looksy <url> --interact "scroll-to:.footer" # Scroll element into view
looksy <url> --interact "type:.search=hello" # Type into input, then screenshot
looksy <url> --interact "hover:.menu" # Hover element, then screenshot
# CSS injection (test visual changes without editing files)
looksy <url> --inject "body { background: red }" # Inject CSS before capture
# Navigation timeout
looksy <url> --timeout 60000 # Custom timeout (default: 30000ms)
# Force a hostname to a specific IP (stale local DNS after a fresh domain cutover)
looksy <url> --host-resolver staging.example.com:203.0.113.5
# HTML pipe (no file needed)
echo '<div>hello</div>' | looksy --html # Screenshot piped HTML snippet
# Side-by-side before/after diff
looksy <url> --diff-inline before.png # Compare current vs "before" PNG
# Visual regression (baseline diff)
looksy save <url> <name> # Save screenshot as named baseline
looksy diff <url> <name> # Compare current vs baseline → diff.png
looksy diff before.png after.png # Compare two local image files → diff.png
looksy list # List saved baselines
# Batch directory mode
looksy batch <dir> --glob "*/index.html" # Batch screenshot matching files (auto-served)
looksy batch <dir> --glob "**/*.html" --report # With analysis
looksy --serve-dir ./build --pages "/,/about" # Serve directory + batch pages
# Watch mode
looksy <url> --watch ./src # Re-screenshot when files change (with diff %)
looksy --watch ./src # Auto-serves ./src, re-screenshots on change
# Analysis (appended to .meta.md)
looksy <url> --a11y # Accessibility audit
looksy <url> --contrast # WCAG color contrast check (semantic grouping)
looksy <url> --contrast --fail-on-aa # Exit code 1 + failure details to stderr
looksy <url> --contrast --fail-on-aaa # Exit code 1 + failure details to stderr
looksy <url> --contrast --visible-only # Skip hidden elements (dropdowns, modals)
looksy <url> --network # Network waterfall
looksy <url> --css-vars # CSS custom properties from :root
looksy <url> --fonts # Font loading verification
looksy <url> --lighthouse # Extended perf (memory, long tasks, INP)
looksy <url> --dom-stats # DOM complexity one-liner
looksy <url> --links # Dead link checker (HEAD all hrefs)
looksy <url> --coverage --meta # CSS/JS code coverage
looksy <url> --class-audit # Extract all CSS class names + recurring class combos
looksy <url> --tailwind # Tailwind utility profile (groups by category, implies --meta)
looksy <url> --font-sources # List all font file URLs and CDN domains
looksy <url> --asset-hashes # List hashed asset filenames (build fingerprints)
looksy <url> --seo # SEO audit (robots.txt, sitemap, og, canonical)
looksy <url> --schema # JSON-LD structured data extraction + validation
# Advanced capture
looksy <url> --sweep # 5 responsive breakpoints (parallel)
looksy <url> --sweep --sweep-widths 375,768 # Custom breakpoint widths
looksy <url> --sweep --check "contrast:aa" # Check contrast at all breakpoints
looksy <url> --sections # Screenshot each section individually
looksy <url> --filmstrip 2000 # 8-frame filmstrip over 2s
looksy <url> --filmstrip 2000 --filmstrip-scroll 1200 # Scroll 1200px across the filmstrip
looksy <url> --compare https://other.com # Visual diff between two URLs
looksy <url> --compare https://other.com --class-audit # + CSS class fingerprint overlap
looksy <url> --pdf # Export as PDF
looksy <url> --record 3000 # Record 3s video (WebM)
looksy <url> --har # Export HTTP Archive (.har)
# Token-saving
looksy <url> --compact --meta # Condensed metadata (~50-60% fewer tokens)
looksy <url> --report # Text-only summary (~100 tokens, no screenshot)
looksy <url> --check "sticky header, dark bg" # Pass/fail checklist (no screenshot)
looksy <url> --check "contrast:aa" # WCAG AA pass/fail with failing elements
looksy <url> --check "text:Hello, selector:h1" # Extended check grammar
looksy <url> --check "count:3 .card" # Exact element count
looksy <url> --check "dark bg:.hero" # Scoped background luminance check
looksy <url> --check "no generator" # Verify no <meta name="generator"> tag
looksy <url> --check "translated" # Flag untranslated text on non-English pages
looksy <url> --audit "border-primary/10" # Flag deprecated design token usage
looksy <url> --meta --perf --json # Machine-parseable JSON output
# Performance analysis
looksy <url> --speed # Full perf audit (all modules + report)
looksy <url> --bundles # JS bundle analysis (chunks, categories)
looksy <url> --images # Image audit (oversized, lazy/eager, format)
looksy <url> --compression # Compression check (gzip/brotli/none)
looksy <url> --third-party # Third-party resource impact by origin
looksy <url> --cache-audit # Cache policy audit
looksy <url> --critical-path # Critical rendering path analysis
looksy <url> --resource-hints # Resource hints audit (preload/preconnect)
looksy <url> --server-timing # Server timing + TTFB breakdown
looksy <url> --budget "totalJS:200KB,FCP:1800" # Performance budget gate (CI/CD)
looksy <url> --budget budget.json # Budget from JSON file
# New analysis & capture modes
looksy <url> --delta # Incremental diff vs previous (~80 tokens)
looksy <url> --suggest # Actionable fix recommendations
looksy <url> --layout --meta # Flex/grid overlay + legend
looksy <url> --responsive-check # Responsive audit (3 breakpoints)
looksy <url> --responsive-check --target-size 24 # AA touch-target threshold (default 44 = AAA)
looksy <url> --components ".hero,.cta" # Screenshot elements + grid composite
looksy <url> --history # Save to timestamped timeline
looksy guard <name> <url> # Visual regression gate (auto-baseline)
looksy guard <name> <url> --threshold 1.0 # Custom pixel change threshold
looksy history # Show capture history timeline
# Batch mode
looksy <url> --pages "/,/pricing,/contact" # Screenshot multiple pages in one command
looksy <url> --pages "/,/pricing" --concurrency 3 # Limit parallel captures (default: 3 with --design)
looksy <url> --pages "/,/pricing" --output-dir ./shots # Output to directory
looksy <url> --pages "/,/pricing" --locales "en,de" # Cross-product: 4 pages
looksy <url> --pages "/,/pricing" --consistency # Flag cross-page divergences
looksy <url> --pages "/,/pricing" --contrast # Consolidated contrast summary
looksy <url> --i18n-check "/en/pricing,/de/pricing" # Structural comparison of locale pages
looksy --urls "https://a.com,https://b.com" --batch-report # Multi-domain batch
looksy --url-file sites.txt --contrast # URLs from a file (one per line, # comments)
looksy fleet https://a.com https://b.com # Fleet audit (contrast+a11y, batch-report.md)
looksy --cat-meta # Print last meta file to stdout
# Structural fingerprint (cross-site similarity)
looksy fingerprint collect <url> --save <name> # Collect DOM fingerprint from URL
looksy fingerprint collect --serve-dir <dir> --save <name> # Fingerprint a static build
looksy fingerprint collect-batch --serve-dir <dir> [--glob "*/index.html"] # Batch collect
looksy fingerprint compare <name1> <name2> # 0-100 similarity score (or N names for matrix)
looksy fingerprint diff <before> <after> # Show what changed between two versions
looksy fingerprint list # List saved fingerprints
# Theme validation (no browser needed)
looksy validate-theme theme.json # WCAG AA/AAA check for all color pairs
looksy validate-theme theme.json --compact --fail-on-aa # CI/CD gate
# Auth
looksy <url> --cookie "session=abc123" # Set cookies before capture
looksy <url> --storage-state ./auth.json # Playwright storage state file
looksy <url> --basic-auth user:password # HTTP basic auth
# Speed
looksy --serve # Start persistent Chromium (~100ms captures)
looksy <url> # Uses running server automatically
looksy --serve-stop # Stop server
# MCP integration
looksy --mcp # Run as MCP tool server for Claude Code
# Utility
looksy --version # Print version number
LOOKSY_DIR=./baselines looksy <url> # Custom base directory (CI persistent baselines)Output
Screenshots save to /tmp/looksy/preview.png by default (overwritten each time). Set LOOKSY_DIR env var to change the base directory (e.g., LOOKSY_DIR=./baselines for persistent CI storage). Every invocation prints page dimensions and timing:
Page: 1280x4200px "My Site" (1.2s)Metadata sidecar (--meta)
Writes .meta.md alongside the PNG with:
Heading hierarchy (H1-H6 tree)
Color palette (computed RGB values)
Font stack
Console errors and broken images
Key element computed styles (font-size, padding, margin, colors, display, gap, dimensions)
Above/below fold tagging
Image optimization hints (natural vs display dimensions)
Analysis flags
Flag | What it does | Tokens |
| Shorthand for | ~1,000 |
| Full metadata sidecar | ~2,500 |
| Condensed metadata (no tables, shorthand CSS) | ~1,000 |
| Text-only summary, no screenshot | ~100 |
| Pass/fail checklist, no screenshot | ~50 |
| Numbered bounding boxes on elements | — |
| Core Web Vitals (FCP, LCP, CLS, TTFB) | — |
| Accessibility audit (landmarks, headings, issues) | — |
| WCAG AA/AAA contrast ratios with semantic grouping (+ React | — |
| Max elements sampled by contrast checks (default 150; reports coverage when capped) | — |
| Network waterfall (top 15 slowest resources) | — |
| CSS custom properties from | — |
| Font loading verification | — |
| Extended perf (memory, long tasks, INP) | — |
| DOM complexity (elements, depth, inline styles) | — |
| Dead link checker | — |
| CSS/JS code coverage via CDP | — |
| All CSS class names + recurring class combos (component shape detection) | — |
| Tailwind utility profile by category (auto-implies | — |
| Font file URLs and CDN domains | — |
| Hashed asset filenames (build fingerprints) | — |
| SEO audit (robots.txt, sitemap, OG, canonical, schema) | — |
| JSON-LD structured data extraction + validation | — |
| Validate page against a design spec (fonts, colors, spacing) | — |
| Semantic diff against a saved baseline | — |
| Actionable fix recommendations (contrast, a11y, SEO) | ~100 |
| Incremental diff vs previous capture (only what changed) | ~80 |
| Flex/grid container overlay with numbered labels | — |
| Responsive audit at 3 breakpoints (overflow, touch, text) | — |
| Touch-target threshold for | — |
| Multi-selector element capture with grid composite | — |
| Save capture to timestamped timeline | — |
| Visual regression gate (auto-baseline, threshold, CI exit codes) | — |
| Design token audit | — |
| Compound: all 11 performance modules + | — |
| JS bundle analysis (chunks, categories, large bundles) | — |
| Image audit (oversized, lazy/eager, format, dimensions) | — |
| Compression check (gzip/brotli/none per text resource) | — |
| Third-party resource impact by origin (categorized) | — |
| Cache policy audit (status, TTL, issues) | — |
| Critical rendering path (blocking resources, LCP, TTFB) | — |
| Resource hints audit (preload/preconnect suggestions) | — |
| Server timing + TTFB breakdown (DNS/TCP/TLS/server) | — |
| Performance budget gate (exit code 1 on failure) | — |
| Structural fingerprint, 0-100 similarity score (8 dimensions incl. inline script hashes) | — |
| Batch fingerprint collection from a directory | — |
| Show what changed between two fingerprint versions | — |
| WCAG AA/AAA contrast for theme color configs (no browser) | — |
| Pre-launch QA: | — |
| With | — |
| Multi-domain batch capture (shared browser, concurrency-limited) | — |
| Multi-URL audit: defaults to | — |
| Output | — |
| Inject custom CSS before capture | — |
| Navigation timeout (default: 30000ms) | — |
| Force one hostname to one IP for this run (stale local DNS) | — |
| Max parallel page captures (default: 3 with | — |
| Output directory for batch captures | — |
| With | — |
| Print version number and exit | — |
Check assertions
The --check flag supports these patterns:
Pattern | Example | What it checks |
|
| Header position: sticky/fixed |
|
| Body background luminance |
|
| Scoped element luminance |
|
| Case-insensitive text search |
|
| CSS selector presence |
|
| Exact element count |
|
| WCAG AA check with failing element details |
|
| WCAG AAA check with failing element details |
|
| Meta generator tag absence |
|
| Absence check (class/style) |
|
| Presence check |
|
| Visibility check |
|
| Hidden check |
|
| Flag untranslated text on non-English pages |
|
| Computed font-family check |
|
| Background color (±5 tolerance) |
|
| Text color (±5 tolerance) |
|
| Fails if any external font domain found |
|
| GDPR: fails if Google Fonts detected |
|
| Footer presence (use with |
|
| Nav presence (use with |
Batch mode
--pages screenshots multiple paths with a shared browser. Concurrency defaults to 3 when --design, --full, or --speed is active (prevents Chromium memory exhaustion). Override with --concurrency N.
looksy http://localhost:3000 --pages "/,/pricing,/contact"
# → preview-index.png, preview-pricing.png, preview-contact.pngCombine with --locales for cross-product expansion:
looksy http://localhost:3000 --pages "/,/pricing" --locales "en,de"
# → 4 pages: /en/, /en/pricing, /de/, /de/pricingUse --consistency to flag divergences across pages (headings, colors, fonts, nav, footer). Use --i18n-check to compare two locale versions structurally.
Batch directory mode
looksy batch screenshots files matching a glob pattern with auto-served HTTP:
looksy batch test-builds/ --glob "*/index.html" --report --contrast
# → preview-site-a.png, preview-site-b.png, ...Each file's parent directory is auto-served via HTTP, so root-relative paths (/_astro/, /_next/) resolve correctly. No manual python3 -m http.server needed.
Use --serve-dir with --pages for explicit directory serving. Clean URLs are supported — /about resolves to /about.html for Astro format:'file' builds and similar static site generators:
looksy --serve-dir ./build --pages "/,/about,/pricing" --report # Clean URLs work
looksy --serve-dir ./build --pages "/index.html,/about.html" --report # Explicit paths too--serve-dir also works with fingerprint collect:
looksy fingerprint collect --serve-dir ./build --save my-site
looksy fingerprint collect-batch --serve-dir ./dist --glob "*/index.html"Local file paths are also auto-served: looksy ./build/index.html serves the directory via HTTP instead of using file://.
Persistent server
looksy --serve starts a background Chromium server and detaches: it prints the pid and
WS endpoint, then returns control to your shell/script — the browser keeps running after the
command exits. All subsequent looksy invocations connect via WebSocket for ~100ms captures
instead of ~2s cold starts. Idempotent — calling it again while a server is already running
just prints its status and exits 0, it doesn't start a second one.
looksy --serve # Start, detached (prints "server started (pid N)" + ws endpoint), returns immediately
looksy --serve # Already running → prints "server already running (pid N)", exits 0
looksy <url> # Uses server automatically
looksy --serve-stop # StopNeed the old blocking behavior (e.g. to supervise it yourself under systemd/pm2, or just
& it manually) — looksy --serve --foreground runs chromium.launchServer in the
current process and never returns until it's killed (Ctrl+C / SIGTERM).
Before this, plain
--serveblocked the calling process forever — fine interactively (you justCtrl+Cor background it with&), but it silently hung any script or CI step that called it expecting a normal command that returns.--servenow does the backgrounding itself;--foregroundis there for when you specifically want the old behavior.
MCP server
looksy --mcp runs as an MCP tool server over stdio, providing screenshot, save-baseline, diff-baseline, and list-baselines tools for direct Claude Code integration.
How It Works
AI coding assistants can read images but can't judge spacing, subtle colors, or pixel alignment from screenshots alone. The --meta sidecar fixes this by providing exact computed CSS values alongside the visual.
The iteration loop:
Edit your template/component
looksy <url> --design— full-page screenshot + compact metadataAI reads the PNG (layout, structure) +
.meta.md(exact font-size, padding, colors, gap)AI fixes code with precise data, not guesswork
Repeat
Real-world result: 4 iterations from blank to production-ready dark-mode landing page. ~15,800 tokens total (~4-5% of a conversation). With --compact: ~10,000 tokens (~2-3%). With --report + --check: ~2,000 tokens (~0.5%).
CI/CD Integration
# Fail build on WCAG AA contrast violations (failure details to stderr)
looksy https://staging.example.com --contrast --fail-on-aa
# JSON output for assertion scripts
looksy https://staging.example.com --meta --contrast --json
cat /tmp/looksy/preview.meta.json | jq '.contrast.aaFailures'
# Batch check all pages
looksy https://staging.example.com --pages "/,/pricing,/about" --check "contrast:aa"
# Batch check build output directory
looksy batch test-builds/ --glob "*/index.html" --contrast --fail-on-aa
# Performance budget gate
looksy https://staging.example.com --perf --bundles --budget "totalJS:200KB,FCP:1800"Exit codes: 0 on success, 1 on failure, --fail-on-aa/--fail-on-aaa violations, --budget exceeded, or unknown flags (strict parsing).
Development
npm install
npm run build # tsc → dist/
npm run dev # tsc --watch
npm test # Build + run all tests
npx vitest run # Run tests only (skip build)
npx vitest # Watch modeTests
326 tests across 43 test files:
Unit tests (
tests/unit/) — 308 tests, no browser. Each test file mirrors a source module (e.g.,cli.test.ts,contrast.test.ts,budget.test.ts). Covers: CLI parsing, interactions, metadata formatting, theme validation, fingerprinting (incl. inline script hashes + asset filenames), check assertions, static server, delta/diff-report, batch-report, design-audit, class-audit (incl. recurring combo detection), and 3-5 tests each for ~20 formatter modules (bundles, images, compression, cache-audit, etc.).Integration tests (
tests/integration/) — 18 tests across 3 files, real browser.
Architecture
See ARCHITECTURE.md for detailed component descriptions, data flow diagrams, and design decisions.
~70 source files, ~11,000 lines. Key components:
Component | File | Role |
CLI |
| Arg parsing, routing, batch orchestration |
Screenshot Engine |
| Core orchestrator, browser management |
Server |
| Persistent Chromium via WebSocket |
Static Server |
| HTTP server for local directories + glob file finder |
Metadata |
| Page data extraction + formatting |
Contrast |
| WCAG AA/AAA checker with semantic failure grouping |
Check |
| Pass/fail assertion engine (with contrast element details) |
Report |
| Lightweight text-only summary |
Diff |
| Baseline save/load + pixel diff |
Sweep |
| Responsive breakpoint screenshots |
Class Audit |
| CSS class extraction, recurring combo detection, fingerprint detection, cross-page compare |
Tailwind |
| Tailwind utility classification by category (spacing, sizing, colors, etc.) |
SEO |
| SEO audit (robots.txt, sitemap, OG, canonical, schema) |
Schema |
| JSON-LD structured data extraction + validation |
Font Sources |
| Font file URL and CDN domain listing |
Asset Hashes |
| Hashed asset filename detection |
Fingerprint |
| DOM fingerprint collection (8 dimensions incl. inline script hashes), cross-site similarity scoring |
Validate Theme |
| Theme color contrast validation (no browser) |
Delta |
| Incremental diff vs previous capture |
Suggest |
| Actionable fix recommendations |
Layout |
| Flex/grid container visual overlay |
Responsive Check |
| Responsive audit at 3 breakpoints |
Components |
| Multi-selector element capture with grid |
History |
| Timestamped capture timeline |
Design Spec |
| Design specification validation |
Diff Report |
| Semantic diff against baseline |
Bundles |
| JS bundle analysis (chunks, categories) |
Images |
| Image audit (oversized, lazy/eager, format) |
Compression |
| Compression check (gzip/brotli/none) |
Third-Party |
| Third-party resource impact by origin |
Cache Audit |
| Cache policy audit |
Critical Path |
| Critical rendering path analysis |
Resource Hints |
| Resource hints audit (preload/preconnect) |
Server Timing |
| Server timing + TTFB breakdown |
Budget |
| Performance budget gate |
Navigate |
| Shared error-resilient navigation ( |
Pixel Diff |
| Shared pixel comparison logic (diff threshold: |
MCP |
| MCP tool server for Claude Code |
Dependencies
Package | Purpose |
Browser automation (Chromium only) | |
PNG read/write for pixel diff + filmstrip | |
MCP server (optional — only loaded with |
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to capture screenshots of web pages using automated browser sessions. Supports full-page and element-specific screenshots, device simulation, and JavaScript execution for comprehensive web testing and monitoring.Last updated612MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to capture screenshots of any public URL, returning images inline with page metadata. Supports full-page captures, custom wait times, and timeouts.Last updated128MIT
- Alicense-qualityAmaintenanceEnables AI assistants to capture screenshots, run visual diffs, accessibility audits, and batch sweep plans for web pages via MCP tools.Last updated362MIT
- Alicense-qualityCmaintenanceEnables AI agents to capture pixel-perfect screenshots with synchronized DOM data and quality metrics, supporting auth injection and MCP integration for vision AI tasks.Last updated2MIT
Related MCP Connectors
Screenshot, diff, audit and sitemap-capture any web page — 5 MCP tools for AI agents.
Capture screenshots, detect visual regressions between page versions, and analyze with AI.
Screenshots, PDFs and Markdown from any URL or HTML for AI agents, via the SnapForge API
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/atre/looksy'
If you have feedback or need assistance with the MCP directory API, please join our Discord server