Composition matching
-The build preserved the mock's asymmetric rhythm: full-bleed hero artwork, dark agenda block, orange manifesto band, drifting installation grid, and structured ticket field.
-diff --git a/.gitignore b/.gitignore index 49d921109..d895f5001 100644 --- a/.gitignore +++ b/.gitignore @@ -58,13 +58,21 @@ extension/detector/ evals/ tests/evals-v2/ -# Generated sub-pages (built from source/skills + content/site at build time) +# Generated sub-pages (legacy, now replaced by Astro content collections) public/docs/ public/anti-patterns/ public/tutorials/ public/visual-mode/ public/slop/ +# Build artifacts written to public/ so Astro copies them to build/ +public/_data/ +public/_headers +public/_redirects +public/_routes.json +public/js/detect-antipatterns-browser.js +public/js/generated/ + # Note: harness skill directories (.claude/skills/, .cursor/skills/, etc.) # are intentionally tracked. npx skills reads them from this repo at install # time, and they enable clean submodule use. Run `bun run build` to refresh @@ -73,3 +81,4 @@ public/slop/ # Codex CLI consumes `.agents/skills/`; `.codex/` is not used. Ignore it so # local artifacts or old trees are never committed. .codex/ +.astro/ diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 000000000..59f958655 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,15 @@ +import { defineConfig } from 'astro/config'; + +export default defineConfig({ + srcDir: './site', + output: 'static', + build: { + format: 'directory', + }, + outDir: './build', + vite: { + build: { + assetsInlineLimit: 0, + }, + }, +}); diff --git a/demos/landing-demo/DESIGN.json b/demos/landing-demo/DESIGN.json new file mode 100644 index 000000000..d7767547c --- /dev/null +++ b/demos/landing-demo/DESIGN.json @@ -0,0 +1,281 @@ +{ + "schemaVersion": 2, + "generatedAt": "2026-04-29T00:00:00Z", + "title": "Design System: Lumina", + "extensions": { + "colorMeta": { + "cream": { + "role": "neutral", + "displayName": "Cream", + "canonical": "oklch(96.5% 0.012 80)", + "tonalRamp": [ + "oklch(15% 0.012 80)", + "oklch(25% 0.012 80)", + "oklch(35% 0.012 80)", + "oklch(50% 0.012 80)", + "oklch(65% 0.012 80)", + "oklch(80% 0.012 80)", + "oklch(90% 0.012 80)", + "oklch(96.5% 0.012 80)" + ] + }, + "cream-warm": { + "role": "neutral", + "displayName": "Cream Warm", + "canonical": "oklch(92% 0.020 75)", + "tonalRamp": [ + "oklch(15% 0.020 75)", + "oklch(25% 0.020 75)", + "oklch(35% 0.020 75)", + "oklch(50% 0.020 75)", + "oklch(65% 0.020 75)", + "oklch(78% 0.020 75)", + "oklch(85% 0.020 75)", + "oklch(92% 0.020 75)" + ] + }, + "peach": { + "role": "neutral", + "displayName": "Peach", + "canonical": "oklch(91% 0.040 60)", + "tonalRamp": [ + "oklch(20% 0.040 60)", + "oklch(30% 0.060 60)", + "oklch(45% 0.080 60)", + "oklch(60% 0.080 60)", + "oklch(72% 0.060 60)", + "oklch(82% 0.050 60)", + "oklch(88% 0.045 60)", + "oklch(91% 0.040 60)" + ] + }, + "line": { + "role": "neutral", + "displayName": "Line (Hairline Border)", + "canonical": "oklch(89% 0.018 75)", + "tonalRamp": [ + "oklch(15% 0.018 75)", + "oklch(25% 0.018 75)", + "oklch(40% 0.018 75)", + "oklch(55% 0.018 75)", + "oklch(70% 0.018 75)", + "oklch(80% 0.018 75)", + "oklch(85% 0.018 75)", + "oklch(89% 0.018 75)" + ] + }, + "ink": { + "role": "neutral", + "displayName": "Ink", + "canonical": "oklch(15% 0.010 60)", + "tonalRamp": [ + "oklch(15% 0.010 60)", + "oklch(22% 0.010 60)", + "oklch(30% 0.010 60)", + "oklch(40% 0.010 60)", + "oklch(55% 0.010 60)", + "oklch(70% 0.010 60)", + "oklch(85% 0.010 60)", + "oklch(94% 0.010 60)" + ] + }, + "soft": { + "role": "neutral", + "displayName": "Soft", + "canonical": "oklch(40% 0.012 60)", + "tonalRamp": [ + "oklch(15% 0.012 60)", + "oklch(25% 0.012 60)", + "oklch(35% 0.012 60)", + "oklch(40% 0.012 60)", + "oklch(55% 0.012 60)", + "oklch(70% 0.012 60)", + "oklch(82% 0.012 60)", + "oklch(92% 0.012 60)" + ] + }, + "accent": { + "role": "primary", + "displayName": "Burnt Orange Accent", + "canonical": "oklch(60% 0.150 40)", + "tonalRamp": [ + "oklch(15% 0.060 40)", + "oklch(25% 0.090 40)", + "oklch(35% 0.120 40)", + "oklch(48% 0.150 40)", + "oklch(60% 0.150 40)", + "oklch(72% 0.130 40)", + "oklch(85% 0.080 40)", + "oklch(95% 0.040 40)" + ] + }, + "accent-deep": { + "role": "primary", + "displayName": "Accent Deep", + "canonical": "oklch(50% 0.150 38)", + "tonalRamp": [ + "oklch(15% 0.060 38)", + "oklch(25% 0.090 38)", + "oklch(35% 0.120 38)", + "oklch(50% 0.150 38)", + "oklch(62% 0.140 38)", + "oklch(75% 0.110 38)", + "oklch(86% 0.070 38)", + "oklch(95% 0.035 38)" + ] + } + }, + "typographyMeta": { + "display": { + "displayName": "Display", + "purpose": "Hero headlines only. Fraunces, weight 400, optical-sized for large display." + }, + "headline": { + "displayName": "Headline", + "purpose": "Section headlines (the features-head h2, cta-section h2)." + }, + "title": { + "displayName": "Title", + "purpose": "Card headings inside the feature grid." + }, + "lede": { + "displayName": "Lede", + "purpose": "The supporting paragraph that sits below a hero headline." + }, + "body": { + "displayName": "Body", + "purpose": "Default paragraph copy. Cap line length at 65–75ch." + }, + "label": { + "displayName": "Label", + "purpose": "The eyebrow chip and any small uppercase labels." + } + }, + "shadows": [], + "motion": [ + { + "name": "ease-button", + "value": "ease", + "duration": "150ms", + "purpose": "Default easing for button hover transforms." + }, + { + "name": "ease-card", + "value": "ease", + "duration": "300ms", + "purpose": "Card hover transition (currently unused but reserved)." + } + ], + "breakpoints": [ + { "name": "container", "value": "1180px" }, + { "name": "logo-strip", "value": "1100px" } + ] + }, + "components": [ + { + "name": "Primary Button", + "kind": "button", + "refersTo": "button-primary", + "description": "The default CTA. Ink background, cream text, fully rounded.", + "html": "Start free trial", + "css": ".ds-btn-primary { display: inline-flex; align-items: center; gap: 8px; padding: 14px 28px; border-radius: 999px; background: #1f1a15; color: #faf6ef; font-family: 'Inter', system-ui, sans-serif; font-weight: 500; font-size: 15px; text-decoration: none; transition: transform 150ms ease; } .ds-btn-primary:hover { transform: translateY(-1px); }" + }, + { + "name": "Ghost Button", + "kind": "button", + "refersTo": "button-ghost", + "description": "Secondary CTA, always paired with the primary.", + "html": "Watch demo", + "css": ".ds-btn-ghost { display: inline-flex; align-items: center; gap: 8px; padding: 14px 28px; border-radius: 999px; background: transparent; color: #1f1a15; border: 1px solid #1f1a15; font-family: 'Inter', system-ui, sans-serif; font-weight: 500; font-size: 15px; text-decoration: none; transition: transform 150ms ease; } .ds-btn-ghost:hover { transform: translateY(-1px); }" + }, + { + "name": "Nav Pill", + "kind": "button", + "refersTo": "nav-pill", + "description": "Compact primary CTA used in the nav. Smaller padding than the full button.", + "html": "Get started", + "css": ".ds-nav-pill { display: inline-flex; align-items: center; padding: 9px 18px; border-radius: 999px; background: #1f1a15; color: #faf6ef; font-family: 'Inter', system-ui, sans-serif; font-weight: 500; font-size: 14px; text-decoration: none; }" + }, + { + "name": "Eyebrow Chip", + "kind": "chip", + "description": "The small uppercase label sitting above the hero headline. Pure typography, no background.", + "html": "
Move from idea to production in minutes.
\nThe all-in-one platform that helps modern teams ship better products in record time. Powered by AI, designed for humans.
+ +One platform. Endless possibilities. Built for the future.
+Move from idea to production in minutes, not months. Our AI handles the heavy lifting so you can focus on what matters.
+SOC 2 compliant infrastructure with end-to-end encryption. Your data is safe, always.
+From your first prototype to millions of users, Lumina grows with your team without breaking a sweat.
+Join thousands of teams already shipping faster with Lumina.
+ Get early access → +The all-in-one platform that helps product teams ship better software in record time. Powered by AI, designed for humans.
+One platform. Endless possibilities. Built for teams who care about craft.
+Move from idea to production in minutes, not months. Our AI handles the heavy lifting so you can focus on what matters.
+SOC 2 compliant infrastructure with end-to-end encryption. Your data is safe, always.
+From your first prototype to millions of users — Lumina grows with your team without breaking a sweat.
+Join thousands of teams already shipping faster with Lumina.
+ Start your free trial → +The all-in-one platform that helps product teams ship better software in record time. Powered by AI, designed for humans.
+One platform. Endless possibilities. Built for teams who care about craft.
+Move from idea to production in minutes, not months. Our AI handles the heavy lifting so you can focus on what matters.
+SOC 2 compliant infrastructure with end-to-end encryption. Your data is safe, always.
+From your first prototype to millions of users — Lumina grows with your team without breaking a sweat.
+Join thousands of teams already shipping faster with Lumina.
+ Start your free trial → +The all-in-one platform that helps modern teams ship better products in record time. Powered by AI, designed for humans.
+ +One platform. Endless possibilities. Built for the future.
+Move from idea to production in minutes, not months. Our AI handles the heavy lifting so you can focus on what matters.
+SOC 2 compliant infrastructure with end-to-end encryption. Your data is safe, always.
+From your first prototype to millions of users, Lumina grows with your team without breaking a sweat.
+Join thousands of teams already shipping faster with Lumina.
+ Get early access → +A retro-futurist AI design conference became a real static site through the full Impeccable loop: visual reference, brand direction, implementation, asset regeneration, responsive fixes, animation polish, and browser verification.
- -
-
-
-
-
-
- The build preserved the mock's asymmetric rhythm: full-bleed hero artwork, dark agenda block, orange manifesto band, drifting installation grid, and structured ticket field.
-Image-native pieces stayed image-native. The manifesto city, speaker portraits, pine overlay, and supporting illustrations were regenerated or isolated where raster detail mattered.
-The page was tested in the browser after each pass. Overlaps, bad crops, active nav state, speaker carousel behavior, mobile heights, and large-viewport balance were fixed visually.
-
-
-
- /impeccable craft is the right command when a feature needs shaping, visual direction, implementation, and browser iteration in one run.
/impeccable craft retro-futurist AI design conference websiteNew in v3.0 Alpha
-Pick any element in the browser. Drop a comment or a stroke. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
-Why alpha: Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
-/impeccable live
-
- Monthly-ish design notes.
- -A postcard from the editor, about once a month. No tracking pixels, no "just checking in."
- -Click the frame or scroll it into view to start the loop. Respects prefers-reduced-motion.
Click any element on your running dev server. Add a comment pin where the issue lives. Draw a stroke through the bit you want to change. Or just type "more playful".
-Variants anchor to different archetypes, not three riffs on color. Each one explores a different primary axis: hierarchy, typography, density, layout, or palette strategy.
-The accepted variant replaces the picked element in your source file. CSS consolidates into your real stylesheet, not inline. Discard all three and the original stays.
-A ten-minute walkthrough from first run to accepted variant. Covers CSP patching, the picker actions, and the fallback flow for generated files.
- Open the tutorial → - - - Reference -Everything your AI harness reads when /impeccable live runs: the poll loop, the wrap/accept helpers, the CSP templates, and every event shape.
Install the skill and CLI once, then run /impeccable live from your AI harness. Works with Claude Code, Cursor, Codex, Gemini, and more.
Last updated: April 6, 2026
- -Impeccable is an open-source collection of agent skills (text files) that run locally in your AI coding tool. The skills themselves collect no data, make no network requests, and have no analytics.
- -The Impeccable website (impeccable.style) uses Google Analytics to understand traffic patterns (page views, referrers, country). No personal information is collected beyond what Google Analytics provides by default. No cookies are used for advertising.
- -When you download a skill bundle from the website, we log the download event (which bundle, timestamp) for usage statistics. No personal information is attached to these logs.
- -When installed as a Claude Code plugin, Impeccable runs entirely within your local Claude Code session. No data is sent to Impeccable's servers. Anthropic's own privacy policy governs the Claude Code application itself.
- -The Impeccable Chrome DevTools extension runs entirely in your browser. All anti-pattern detection happens locally on the page you are inspecting. No page content, URLs, or detection results are ever sent to any external server.
-The extension stores your rule preferences (which detections are enabled or disabled) using Chrome's built-in sync storage (chrome.storage.sync), which syncs settings across your Chrome instances via your Google account. No other data is stored or transmitted.
The extension requests the following permissions:
-The source code is hosted on GitHub. Interactions with the repository (issues, pull requests, stars) are governed by GitHub's privacy policy.
- -Questions about this policy? Open an issue on GitHub or reach out to @pbakaus.
-Drag or hover to compare
-${escapeHtml(caption)}
` : ''} - After -Docs / ${escapeHtml(categoryLabel)}
-${escapeHtml(tagline)}
- ${metaStrip} -${escapeHtml(shortTagline)}
- ${metaHtml} -${escapeHtml(CATEGORY_DESCRIPTIONS[category])}
-1 skill · ${commandCount} commands
-Impeccable gives you a shared design vocabulary with your AI. ${commandCount} commands that each encode a specific design discipline, so you can steer with precision. Pick one for the job or let the skill route you automatically.
-${escapeHtml(homeTagline)}
-Call /impeccable directly for freeform design work with the full guidebook loaded. Or reach for one of its specialized modes:
${escapeHtml(rule.description)}
- ${skillLink} -${escapeHtml(t.tagline || t.description)}
-${tutorials.length} walk-throughs
-Short, opinionated walk-throughs of the highest-leverage workflows. Each one takes around ten minutes and ends with something working in your project.
-${rules.length} ${rules.length === 1 ? 'rule' : 'rules'}
-
- ${escapeHtml(item.desc)}
-The visible tells of AI design
-${totalRules} patterns that mark an interface as AI-generated, and the detection overlay that catches them in place. Watch it flag them live, try it on ${GALLERY_ITEMS.length} synthetic specimens, or browse the full catalog. ${detectedCount} rules run deterministically (npx impeccable detect or the browser extension); ${llmCount} need /impeccable critique's LLM review pass.
Hover or tap any outlined element to see which rule fired.
-These ${GALLERY_ITEMS.length} synthetic slop pages ship with the detector script baked in. Click any to see the overlay running on a real page, then hover the outlined elements.
-Every pattern /impeccable teaches against. AI slop rules flag the tells of AI-generated UIs; Quality rules flag general design mistakes that hurt regardless of who wrote them.
-Each rule shows how it is detected:
-npx impeccable detect on files, no browser required.Inside /impeccable critique
-The design review command opens the overlay automatically during its browser assessment pass. Deterministic findings highlighted in place while the LLM runs its separate heuristic review.
-Standalone CLI
-npx impeccable liveStarts a local server that serves the detector script. Inject it into any page via a <script> tag to see the overlay. Works on your own dev server, a staging URL, or anyone's live page.
Easiest
-One-click activation on any tab. Install from Chrome Web Store →
-Monthly-ish design notes.
- -A postcard from the editor, about once a month. No tracking pixels, no "just checking in."
- -New in v3.0 Alpha
-Pick any element in the browser. Drop a comment or a stroke. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
-Why alpha: Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
-/impeccable live
-
- Click the frame or scroll it into view to start the loop. Respects prefers-reduced-motion.
Click any element on your running dev server. Add a comment pin where the issue lives. Draw a stroke through the bit you want to change. Or just type "more playful".
-Variants anchor to different archetypes, not three riffs on color. Each one explores a different primary axis: hierarchy, typography, density, layout, or palette strategy.
-The accepted variant replaces the picked element in your source file. CSS consolidates into your real stylesheet, not inline. Discard all three and the original stays.
-A ten-minute walkthrough from first run to accepted variant. Covers CSP patching, the picker actions, and the fallback flow for generated files.
- Open the tutorial → - - - Reference -Everything your AI harness reads when /impeccable live runs: the poll loop, the wrap/accept helpers, the CSP templates, and every event shape.
Install the skill and CLI once, then run /impeccable live from your AI harness. Works with Claude Code, Cursor, Codex, Gemini, and more.
Shipping a real interface is a loop. Four phases, each with one place to begin.
-Three commands, one arc. /impeccable teach writes the brief, once per project. /impeccable shape drafts a reference you can look at. /impeccable craft codes toward what you can see. Words, then pictures, then code.
Teach runs a short discovery interview about audience, register, voice, and anti-references. It writes PRODUCT.md and, if there's code to scan, a DESIGN.md. Every later command reads both files before generating.
Since image generation crossed the reference-quality threshold, shape can draft a brand toolkit you review at a glance, and craft can code toward a hi-fi mock instead of a paragraph. Neo Mirai is the full loop: generated direction, implemented page, browser iteration.
-
- Brand toolkit. Identity, palette, type, icon language, applications, social tiles, UI direction. One plate, reviewable at a glance. Approved decisions get written into DESIGN.md.
-
- Hi-fi reference. The destination, before the first line of CSS. Craft codes toward a concrete image, not an abstract brief. That is the step change.
-
-
- Live build. The mock became semantic markup, regenerated assets, responsive fixes, nav state, speaker carousel behavior, and browser-verified polish. Open the live site.
-The first two plates were generated by OpenAI GPT Image 2. The third is the implemented Neo Mirai page. Gemini Nano Banana Pro, Imagen 4 Ultra, and Grok Imagen work the same way, via Codex, Gemini CLI, and compatible harnesses.
-Once something exists, you're iterating. There are two paths: specific commands for named dimensions, or Live Mode for visual exploration.
-Type a command and let the skill encode a specific discipline. Best when you know the word: typography, layout, color, motion.
- -Pick any element in the browser, draw, type, hit Go. Three production-quality variants. Accept one and it writes to source.
- -| Fix something "off" that you can't name | -/impeccable live | -
|---|---|
| Apply a specific discipline: type, layout, color, motion | -/typeset · /layout · /colorize · /animate | -
| Explore three directions side by side | -/impeccable live | -
| Ask "is this any good?" | -/impeccable critique | -
| Bring a safe design to life, or tone a shouting one down | -/bolder · /quieter | -
Three commands in sequence before anything ships. They don't redesign; they find what still needs to change.
-Five dimensions scored 0 to 4: accessibility, performance, theming, responsive, anti-patterns. Findings tagged P0 to P3.
-Labels, error messages, empty-state prose, microcopy. Tuned to the audience from PRODUCT.md.
-60-character names, German product titles, prices in the billions, 500s, offline. Production data is messy.
-Features ship, drift happens. Two commands close the gap before it solidifies.
-Find patterns used three or more times with the same intent. Propose tokens and primitives.
-Scans tokens, components, and rendered output. Writes a spec-compliant DESIGN.md.
-Two defaults with different vocabularies. Impeccable picks the lane from your task cue and PRODUCT.md before every command, so typeset, animate, colorize, and friends adjust their output to match. You rarely need to set it by hand.
Design IS the product. Marketing, landing, editorial, long-form, portfolio.
- -Design serves the task. App UI, admin, dashboards, tools.
- -An anti-patterns list, for using the anti-patterns tool.
-Anthropic still promotes their skill in Claude Code, but it's been unmaintained and is now behind on recommended patterns. Run both and they collide on vocabulary, cancelling each other out. Pick one.
-Pinning brings back /audit, /polish, /critique as shortcuts. Pin everything and you've re-exploded the / menu the v3.0 consolidation cleaned up. Pin the two or three you reach for daily.
teach
- Commands still run without PRODUCT.md and DESIGN.md. They default to generic SaaS patterns. The floor is meaningfully higher with context. Run teach once; every later command benefits.
-Impeccable is an opinionated design partner, not a validator. It has a point of view. Push back with a reason and it'll work with you. Ignore the opinion without a reason and output gets worse, not better.
-Tutorials / ${String(tutorial.order).padStart(2, '0')}
-${escapeHtml(tutorial.tagline)}
` : ''} -Five dimensions scored 0 to 4, each finding tagged P0 (blocks release) to P3 (polish). Audit documents; it doesn't fix. Route the findings into /impeccable harden, /impeccable polish, or /impeccable optimize.
Every phase is non-skippable. The discovery step is where most AI output fails: by the time code exists, the thinking is locked in.
+The two passes (LLM design review plus the deterministic detector) merge into one prioritized list. What's working, what to fix, and the provocative questions worth answering before shipping.
+Creative North Star: "The Editorial Sanctuary." Quiet type, generous air, one committed accent.
+Flat by default. Shadows appear only as a response to state.
+The six sections are fixed, in a fixed order, with fixed names. Alongside, DESIGN.json ships as a machine-readable sidecar for the Live Mode design panel.
The skill only extracts what's used three or more times with the same intent. Two usages are not a pattern, and migration always happens in the same pass.
+return (...), array .map(...), and asChild parents like Radix's <DialogPrimitive.Title>. Carbonize stopped double-wrapping CSS in nested template literals on TSX targets, accept and discard restore the picked element at its original indent (with relative depth between lines preserved), and the screenshot overlay no longer flashes solid black on default-background pages. Closes #114, with thanks again to @dergachoff for the detailed bug report.<Card className="card"> rendered three times with the same classes used to land on the first one regardless of which the user picked. live-wrap.mjs now accepts --text TEXT (the picked element's textContent) and narrows candidates accordingly, falling back to first-match when the text is too short or doesn't appear literally in source (data-driven children like {title}), and erroring with element_ambiguous when multiple branches still match equally.<Card className="card"> rendered three times with the same classes used to land on the first one regardless of which the user picked. live-wrap.mjs now accepts --text TEXT (the picked element's textContent) and narrows candidates accordingly, falling back to first-match when the text is too short or doesn't appear literally in source (data-driven children like {title}), and erroring with element_ambiguous when multiple branches still match equally.live-inject CSP-meta unwrap now byte-for-byte preserves self-closing tag whitespace. The patch+revert cycle on a <meta http-equiv="Content-Security-Policy" ... /> tag was eating the space before /> via a double-space artifact in the marker insertion path; common Vite shapes that ship a CSP meta now round-trip cleanly.live.md spec gained explicit guidance for three real authoring traps. Variant CSS must use a descendant combinator (:scope > .card, not bare :scope) or it lands on the wrapper instead of the picked element. JSX <style> bodies need {`...`} template-literal wrapping. Aborting an in-flight session uses live-poll --reply EVENT_ID error "msg", not live-accept --discard; the latter only mutates source while the bar stays stuck on GENERATING dots forever.live.md spec gained explicit guidance for three real authoring traps. Variant CSS must use a descendant combinator (:scope > .card, not bare :scope) or it lands on the wrapper instead of the picked element. JSX <style> bodies need {`...`} template-literal wrapping. Aborting an in-flight session uses live-poll --reply EVENT_ID error "msg", not live-accept --discard; the latter only mutates source while the bar stays stuck on GENERATING dots forever./impeccable craft now treats approved mocks as visual contracts. The craft flow requires a mock fidelity inventory before build, maps major visible ingredients to code or assets, and flags missing hero objects, imagery, section structure, nav/CTA treatment, and distinctive motifs as blocking defects unless the user accepted the deviation./impeccable craft and /impeccable shape hardened against autonomous agents. Codex-class harnesses had started writing files before the user confirmed a design brief, treating their own summary as the brief. Setup now ships a preflight checklist (context, product, command reference, shape, image gate, mutation), and craft enforces an explicit build gate: shape=pass only counts when the user separately approves the brief or supplies a pre-confirmed one. Self-authored briefs and "the implementation will be semantic anyway" no longer skip the visual probe.body { pointer-events: none } or attach outside-click dismissers, the picker chrome had become unclickable, and any click that did land would dismiss the host dialog. The bar, picker, params panel, annotation overlay, and design panel now defang outside-handlers at the chrome boundary and force pointer-events: auto on themselves. Theme detection also stopped misreading a transparent body as black. Closes #113, with thanks to @dergachoff for the thoughtful bug report.body { pointer-events: none } or attach outside-click dismissers, the picker chrome had become unclickable, and any click that did land would dismiss the host dialog. The bar, picker, params panel, annotation overlay, and design panel now defang outside-handlers at the chrome boundary and force pointer-events: auto on themselves. Theme detection also stopped misreading a transparent body as black. Closes #113, with thanks to @dergachoff for the thoughtful bug report.New in v3.0 Alpha
+Pick any element in the browser. Drop a comment or a stroke. Three production-quality variants swap in via your framework's HMR. Accept the one you want and it writes back to source.
+Why alpha: Live Mode works end-to-end and is ready to try, but it still needs more testing against real-world repos and framework configs. Expect rough edges on uncommon setups, and please report what breaks.
+/impeccable live
+ Monthly-ish design notes.
+A postcard from the editor, about once a month. No tracking pixels, no "just checking in."
+Click the frame or scroll it into view to start the loop. Respects prefers-reduced-motion.
Click any element on your running dev server. Add a comment pin where the issue lives. Draw a stroke through the bit you want to change. Or just type "more playful".
+Variants anchor to different archetypes, not three riffs on color. Each one explores a different primary axis: hierarchy, typography, density, layout, or palette strategy.
+The accepted variant replaces the picked element in your source file. CSS consolidates into your real stylesheet, not inline. Discard all three and the original stays.
+A ten-minute walkthrough from first run to accepted variant. Covers CSP patching, the picker actions, and the fallback flow for generated files.
+ Open the tutorial → + + + Reference +Everything your AI harness reads when /impeccable live runs: the poll loop, the wrap/accept helpers, the CSP templates, and every event shape.
Install the skill and CLI once, then run /impeccable live from your AI harness. Works with Claude Code, Cursor, Codex, Gemini, and more.
Last updated: April 6, 2026
+ +Impeccable is an open-source collection of agent skills (text files) that run locally in your AI coding tool. The skills themselves collect no data, make no network requests, and have no analytics.
+ +The Impeccable website (impeccable.style) uses Google Analytics to understand traffic patterns (page views, referrers, country). No personal information is collected beyond what Google Analytics provides by default. No cookies are used for advertising.
+ +When you download a skill bundle from the website, we log the download event (which bundle, timestamp) for usage statistics. No personal information is attached to these logs.
+ +When installed as a Claude Code plugin, Impeccable runs entirely within your local Claude Code session. No data is sent to Impeccable's servers. Anthropic's own privacy policy governs the Claude Code application itself.
+ +The Impeccable Chrome DevTools extension runs entirely in your browser. All anti-pattern detection happens locally on the page you are inspecting. No page content, URLs, or detection results are ever sent to any external server.
+The extension stores your rule preferences (which detections are enabled or disabled) using Chrome's built-in sync storage (chrome.storage.sync), which syncs settings across your Chrome instances via your Google account. No other data is stored or transmitted.
The extension requests the following permissions:
+The source code is hosted on GitHub. Interactions with the repository (issues, pull requests, stars) are governed by GitHub's privacy policy.
+ +Questions about this policy? Open an issue on GitHub or reach out to @pbakaus.
+37 patterns that mark an interface as AI-generated, and the detection overlay that catches them in place. Watch it flag them live, try it on 11 synthetic specimens, or browse the full catalog. 25 rules run deterministically (npx impeccable detect or the browser extension); 12 need /impeccable critique's LLM review pass.
Every wave of AI-generated UIs converges on a recognizable aesthetic. The detector catches both. The patterns just change.
+Hover or tap any outlined element to see which rule fired.
+Hover or tap any outlined element to see which rule fired. Toggle the era to see how the patterns shifted.
+
+
+
+
+
+
+
+
+
+
{entry.data.tagline}
} +Step-by-step guides, from first install to live browser iteration.
+{t.data.description}
+