{"id":4144,"date":"2026-08-18T15:28:11","date_gmt":"2026-08-18T07:28:11","guid":{"rendered":"https:\/\/ai.wuaishare.cn\/hub\/?p=4144"},"modified":"2026-08-18T15:28:11","modified_gmt":"2026-08-18T07:28:11","slug":"impeccable","status":"publish","type":"post","link":"https:\/\/ai.wuaishare.cn\/hub\/en\/4144","title":{"rendered":"Impeccable"},"content":{"rendered":"<p># Impeccable<\/p>\n<p>Design guidance for AI coding agents. 1 skill, 23 commands, live browser iteration, and 59 deterministic detector rules for AI-generated frontend design.<\/p>\n<p>> **Quick start:** From your project root, run `npx impeccable install`, then run `\/impeccable init` inside your AI coding tool. Full docs: [impeccable.style](https:\/\/impeccable.style).<\/p>\n<p>## Why Impeccable?<\/p>\n<p>Anthropic&#8217;s [frontend-design](https:\/\/github.com\/anthropics\/skills\/tree\/main\/skills\/frontend-design) was the first widely-used design skill for Claude. Impeccable started from there.<\/p>\n<p>Every model trained on the same SaaS templates. Skip the guidance and you get the same handful of tells on every project: Inter for everything, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, the rounded-square icon tile above every heading.<\/p>\n<p>Impeccable adds:<br \/>\n&#8211; **One setup flow.** `\/impeccable init` writes `PRODUCT.md` and offers `DESIGN.md`, so later commands know the audience, brand\/product lane, voice, anti-references, colors, type, and components.<br \/>\n&#8211; **23 commands.** A shared design vocabulary with your AI: `polish`, `audit`, `critique`, `distill`, `animate`, `bolder`, `quieter`, and more.<br \/>\n&#8211; **59 deterministic detector rules** plus LLM-only critique checks. The CLI and browser extension run the deterministic rules with no LLM and no API key.<\/p>\n<p>## What&#8217;s Included<\/p>\n<p>### The Skill: impeccable<\/p>\n<p>The skill installs as one command:<\/p>\n<p>&#8220;`bash<br \/>\n\/impeccable <command> <target><br \/>\n&#8220;`<\/p>\n<p>Start every new project with:<\/p>\n<p>&#8220;`bash<br \/>\n\/impeccable init<br \/>\n&#8220;`<\/p>\n<p>`init` asks whether the surface is brand (marketing, landing, portfolio) or product (app UI, dashboard, tool), then writes design context that every later command reads.<\/p>\n<p>### 23 Commands<\/p>\n<p>All commands are accessed through `\/impeccable`:<\/p>\n<p>| Command | What it does |<br \/>\n|&#8212;&#8212;&#8212;|&#8212;&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `\/impeccable craft` | Full shape-then-build flow with visual iteration |<br \/>\n| `\/impeccable init` | One-time setup: gather design context, write PRODUCT.md and DESIGN.md, configure live mode, recommend next steps |<br \/>\n| `\/impeccable document` | Generate root DESIGN.md from existing project code |<br \/>\n| `\/impeccable extract` | Pull reusable components and tokens into the design system |<br \/>\n| `\/impeccable shape` | Plan UX\/UI before writing code |<br \/>\n| `\/impeccable critique` | UX design review: hierarchy, clarity, emotional resonance |<br \/>\n| `\/impeccable audit` | Run technical quality checks (a11y, performance, responsive) |<br \/>\n| `\/impeccable polish` | Final pass, design system alignment, and shipping readiness |<br \/>\n| `\/impeccable bolder` | Amplify boring designs |<br \/>\n| `\/impeccable quieter` | Tone down overly bold designs |<br \/>\n| `\/impeccable distill` | Strip to essence |<br \/>\n| `\/impeccable harden` | Error handling, i18n, text overflow, edge cases |<br \/>\n| `\/impeccable onboard` | First-run flows, empty states, activation paths |<br \/>\n| `\/impeccable animate` | Add purposeful motion |<br \/>\n| `\/impeccable colorize` | Introduce strategic color |<br \/>\n| `\/impeccable typeset` | Fix font choices, hierarchy, sizing |<br \/>\n| `\/impeccable layout` | Fix layout, spacing, visual rhythm |<br \/>\n| `\/impeccable delight` | Add moments of joy |<br \/>\n| `\/impeccable overdrive` | Add technically extraordinary effects |<br \/>\n| `\/impeccable clarify` | Improve unclear UX copy |<br \/>\n| `\/impeccable adapt` | Adapt for different devices |<br \/>\n| `\/impeccable optimize` | Performance improvements |<br \/>\n| `\/impeccable live` | Visual variant mode: iterate on elements in the browser |<\/p>\n<p>Use `\/impeccable pin <command>` to create standalone shortcuts (e.g., `pin audit` creates `\/audit`).<\/p>\n<p>#### Usage Examples<\/p>\n<p>&#8220;`<br \/>\n\/impeccable audit blog           # Audit blog hub + post pages<br \/>\n\/impeccable critique landing     # UX design review<br \/>\n\/impeccable polish settings      # Final pass before shipping<br \/>\n\/impeccable harden checkout      # Add error handling + edge cases<br \/>\n&#8220;`<\/p>\n<p>Or use `\/impeccable` directly with a description:<br \/>\n&#8220;`<br \/>\n\/impeccable redo this hero section<br \/>\n&#8220;`<\/p>\n<p>### Anti-Patterns<\/p>\n<p>The skill includes explicit guidance on what to avoid:<\/p>\n<p>&#8211; Don&#8217;t use overused fonts (Arial, Inter, system defaults)<br \/>\n&#8211; Don&#8217;t use gray text on colored backgrounds<br \/>\n&#8211; Don&#8217;t use pure black\/gray (always tint)<br \/>\n&#8211; Don&#8217;t wrap everything in cards or nest cards inside cards<br \/>\n&#8211; Don&#8217;t use bounce\/elastic easing (feels dated)<\/p>\n<p>## See It In Action<\/p>\n<p>Visit [the Neo Mirai case study](https:\/\/impeccable.style\/cases\/neo-mirai) to see a before\/after case study of a real project transformed with Impeccable commands.<\/p>\n<p>## Installation<\/p>\n<p>### Option 1: CLI installer (Recommended)<\/p>\n<p>From the root of your project, run:<\/p>\n<p>&#8220;`bash<br \/>\nnpx impeccable install<br \/>\n&#8220;`<\/p>\n<p>This shows the harness folders it detected (for example `~\/.claude`, `~\/.codex`, `~\/.grok`, or project-local `.cursor`), lets you keep the detected set or customize providers, then asks whether to install into the current project or globally. Use `&#8211;providers=claude,codex,cursor,grok` and `&#8211;scope=project|global` to skip those choices in scripts. On Claude Code, Cursor, Codex, GitHub Copilot, and Grok Build, it also installs the provider-native hook manifest for the current project. Works with Cursor, Claude Code, Gemini CLI, Codex CLI, Grok Build, and every other supported tool. Reload your harness afterward.<\/p>\n<p>To refresh an existing install, run:<\/p>\n<p>&#8220;`bash<br \/>\nnpx impeccable update<br \/>\n&#8220;`<\/p>\n<p>Codex users should open `\/hooks` after install or update and approve the project hook when prompted. Codex tracks trust by hook definition, so updates that change `.codex\/hooks.json` can require approval again. Grok Build users need project folder trust (`\/hooks-trust` or launch with `&#8211;trust`) before `.grok\/hooks\/` scripts run.<\/p>\n<p>### Option 2: Git Submodule<\/p>\n<p>For teams that want to keep Impeccable vendored and updated through Git, add this repo as a submodule and link the compiled provider build into your harness folders:<\/p>\n<p>&#8220;`bash<br \/>\ngit submodule add https:\/\/github.com\/pbakaus\/impeccable .impeccable<br \/>\nnpx impeccable link &#8211;source=.impeccable &#8211;providers=claude,cursor<br \/>\ngit add .gitmodules .impeccable .claude .cursor<br \/>\ngit commit -m &#8220;Add Impeccable skills&#8221;<br \/>\n&#8220;`<\/p>\n<p>Use the providers your project needs, for example `claude`, `cursor`, `gemini`, `codex`, `github`, `grok`, `opencode`, `pi`, `qoder`, `trae`, `trae-cn`, `rovo-dev`, or `vibe`. The command links individual skill folders from `.impeccable\/dist\/universal\/` and leaves existing real skill directories untouched unless you pass `&#8211;force`.<\/p>\n<p>To update later:<\/p>\n<p>&#8220;`bash<br \/>\ngit submodule update &#8211;remote .impeccable<br \/>\nnpx impeccable link &#8211;source=.impeccable &#8211;providers=claude,cursor<br \/>\n&#8220;`<\/p>\n<p>### Option 3: Plugin install<\/p>\n<p>**Claude Code:**<br \/>\n&#8220;`bash<br \/>\n\/plugin marketplace add pbakaus\/impeccable<br \/>\n&#8220;`<\/p>\n<p>> Claude Code only. After adding the marketplace, open `\/plugin` and install Impeccable from the list.<\/p>\n<p>**Grok Build:**<br \/>\n&#8220;`bash<br \/>\ngrok plugin install pbakaus\/impeccable#plugin &#8211;trust<br \/>\n&#8220;`<\/p>\n<p>> Grok Build only. The `#plugin` suffix installs the slim plugin package (skills, agents, and hooks) instead of the full monorepo. Then run `\/impeccable init` in a Grok session. Project-scoped installs via `npx impeccable install &#8211;providers=grok` also work and write `.grok\/skills\/` plus `.grok\/hooks\/impeccable.json`.<\/p>\n<p>### Option 4: Download from Website<\/p>\n<p>Visit [impeccable.style](https:\/\/impeccable.style), download the ZIP for your tool, and extract to your project.<\/p>\n<p>### Option 5: Copy from Repository<\/p>\n<p>**Cursor:**<br \/>\n&#8220;`bash<br \/>\ncp -r dist\/cursor\/.cursor your-project\/<br \/>\n&#8220;`<\/p>\n<p>> **Note:** Cursor skills require setup:<br \/>\n> 1. Switch to Nightly channel in Cursor Settings \u2192 Beta<br \/>\n> 2. Enable Agent Skills in Cursor Settings \u2192 Rules<br \/>\n><br \/>\n> [Learn more about Cursor skills](https:\/\/cursor.com\/docs\/context\/skills)<\/p>\n<p>**Claude Code:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/claude-code\/.claude your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\ncp -r dist\/claude-code\/.claude\/* ~\/.claude\/<br \/>\n&#8220;`<\/p>\n<p>**OpenCode:**<br \/>\n&#8220;`bash<br \/>\ncp -r dist\/opencode\/.opencode your-project\/<br \/>\n&#8220;`<\/p>\n<p>**Pi:**<br \/>\n&#8220;`bash<br \/>\ncp -r dist\/pi\/.pi your-project\/<br \/>\n&#8220;`<\/p>\n<p>**Gemini CLI:**<br \/>\n&#8220;`bash<br \/>\ncp -r dist\/gemini\/.gemini your-project\/<br \/>\n&#8220;`<\/p>\n<p>> **Note:** Gemini CLI skills require setup:<br \/>\n> 1. Install preview version: `npm i -g @google\/gemini-cli@preview`<br \/>\n> 2. Run `\/settings` and enable &#8220;Skills&#8221;<br \/>\n> 3. Run `\/skills list` to verify installation<br \/>\n><br \/>\n> [Learn more about Gemini CLI skills](https:\/\/geminicli.com\/docs\/cli\/skills\/)<\/p>\n<p>**Codex CLI:**<br \/>\n&#8220;`bash<br \/>\n# Project-local<br \/>\ncp -r dist\/agents\/.agents your-project\/<br \/>\nmkdir -p your-project\/.codex<br \/>\ncp dist\/codex\/.codex\/hooks.json your-project\/.codex\/hooks.json<\/p>\n<p># Or install the skill user-wide. Copy .codex\/hooks.json into each project<br \/>\n# where you want the design hook to run.<br \/>\nmkdir -p ~\/.agents\/skills<br \/>\ncp -r dist\/agents\/.agents\/skills\/* ~\/.agents\/skills\/<br \/>\n&#8220;`<\/p>\n<p>> The asset-producer subagent ships nested inside the skill&#8217;s own `agents\/` folder, which Codex auto-discovers. No separate `.codex\/agents\/` copy is needed. The hook is project-local because Codex discovers hooks from `.codex\/hooks.json` next to trusted project config.<\/p>\n<p>**GitHub Copilot:**<br \/>\n&#8220;`bash<br \/>\ncp -r dist\/github\/.github your-project\/<br \/>\n&#8220;`<\/p>\n<p>**Trae:**<br \/>\n&#8220;`bash<br \/>\n# Trae China (domestic version)<br \/>\ncp -r dist\/trae\/.trae-cn\/skills\/* ~\/.trae-cn\/skills\/<\/p>\n<p># Trae International<br \/>\ncp -r dist\/trae\/.trae\/skills\/* ~\/.trae\/skills\/<br \/>\n&#8220;`<\/p>\n<p>> **Note:** Trae has two versions with different config directories:<br \/>\n> &#8211; **Trae China**: `~\/.trae-cn\/skills\/`<br \/>\n> &#8211; **Trae International**: `~\/.trae\/skills\/`<br \/>\n><br \/>\n> After copying, restart Trae IDE to activate the skills.<\/p>\n<p>**Rovo Dev:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/rovo-dev\/.rovodev your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\ncp -r dist\/rovo-dev\/.rovodev\/skills\/* ~\/.rovodev\/skills\/<br \/>\n&#8220;`<\/p>\n<p>**Qoder:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/qoder\/.qoder your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\ncp -r dist\/qoder\/.qoder\/skills\/* ~\/.qoder\/skills\/<br \/>\n&#8220;`<\/p>\n<p>**Mistral Vibe:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/vibe\/.vibe your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\ncp -r dist\/vibe\/.vibe\/skills\/* ~\/.vibe\/skills\/<br \/>\n&#8220;`<\/p>\n<p>**Grok Build:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/grok\/.grok your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\ncp -r dist\/grok\/.grok\/skills\/* ~\/.grok\/skills\/<br \/>\n&#8220;`<\/p>\n<p>> Prefer `npx impeccable install &#8211;providers=grok` or `grok plugin install pbakaus\/impeccable#plugin &#8211;trust` so the design hook installs too. Project hooks need `\/hooks-trust` (or `&#8211;trust`) once per folder.<\/p>\n<p>**Google Antigravity:**<br \/>\n&#8220;`bash<br \/>\n# Project-specific<br \/>\ncp -r dist\/antigravity\/.agent your-project\/<\/p>\n<p># Or global (applies to all projects)<br \/>\nmkdir -p ~\/.gemini\/config\/skills<br \/>\ncp -r dist\/antigravity\/.agent\/skills\/* ~\/.gemini\/config\/skills\/<br \/>\n&#8220;`<\/p>\n<p>## Usage<\/p>\n<p>Once installed, every command runs through the single `\/impeccable` skill:<\/p>\n<p>&#8220;`<br \/>\n\/impeccable audit        # Find issues<br \/>\n\/impeccable polish       # Final cleanup<br \/>\n\/impeccable distill      # Remove complexity<br \/>\n\/impeccable critique     # Full design review<br \/>\n&#8220;`<\/p>\n<p>Type `\/impeccable` alone to see the full command list.<\/p>\n<p>Most commands accept an optional argument to focus on a specific area:<\/p>\n<p>&#8220;`<br \/>\n\/impeccable audit the header<br \/>\n\/impeccable polish the checkout form<br \/>\n&#8220;`<\/p>\n<p>If you reach for one command often, pin it with `\/impeccable pin audit` to get `\/audit` as a standalone shortcut.<\/p>\n<p>**Note:** Codex uses skills here, not `\/prompts:` commands. Open `\/skills` or type `$impeccable`. Repo-local installs live in `.agents\/skills\/`; user-wide installs live in `~\/.agents\/skills\/`. GitHub Copilot uses `.github\/skills\/`. Restart the tool if a newly installed skill does not appear.<\/p>\n<p>## Keeping `.impeccable` out of git<\/p>\n<p>As you run commands, Impeccable writes working files under `.impeccable\/`: critique and polish screenshots, live-mode session and preview state, runtime caches, and per-developer config. Most of it is ephemeral and should not be committed, while a few files are shared project artifacts that belong in the repo. Add this block to your project&#8217;s `.gitignore`:<\/p>\n<p>&#8220;`gitignore<br \/>\n# impeccable-ignore-start<br \/>\n# Ephemeral output, runtime state, and per-dev overrides.<br \/>\n# Unanchored: .impeccable may sit at the repo root or under a nested<br \/>\n# workspace (apps\/web\/.impeccable\/&#8230;); anchored patterns would miss it.<br \/>\n# Shared artifacts stay tracked: config.json, live\/config.json,<br \/>\n# design.json, critique\/*.md.<br \/>\n.impeccable\/config.local.json<br \/>\n.impeccable\/hook.cache.json<br \/>\n.impeccable\/hook.pending.json<br \/>\n.impeccable\/*.png<br \/>\n.impeccable\/live\/server.json<br \/>\n.impeccable\/live\/sessions\/<br \/>\n.impeccable\/live\/previews\/<br \/>\n.impeccable\/live\/annotations\/<br \/>\n.impeccable\/live\/cache\/<br \/>\n.impeccable\/live\/manual-edit-apply-transaction.json<br \/>\n.impeccable\/live\/manual-edit-events.jsonl<br \/>\n.impeccable\/live\/manual-edit-evidence\/<br \/>\n.impeccable\/live\/pending-manual-edits.json<br \/>\n.impeccable\/live\/deferred-svelte-component-accepts.json<br \/>\n.impeccable\/live\/*.png<br \/>\n# impeccable-ignore-end<br \/>\n&#8220;`<\/p>\n<p>The block is wrapped in `# impeccable-ignore-start` \/ `# impeccable-ignore-end` markers so you can recognize and refresh it later. Patterns are unanchored on purpose: in a monorepo the active project (and its `.impeccable\/` directory) often lives under a nested workspace path like `apps\/web\/`, and a root-anchored pattern would miss it.<\/p>\n<p>**Keep these tracked** (they are shared project artifacts, do not add them to `.gitignore`):<\/p>\n<p>&#8211; `.impeccable\/config.json` (unified shared config)<br \/>\n&#8211; `.impeccable\/live\/config.json` (live-mode framework wiring)<br \/>\n&#8211; `.impeccable\/design.json` (shared design spec)<br \/>\n&#8211; `.impeccable\/critique\/*.md` (review reports)<\/p>\n<p>If an ephemeral file (a screenshot, `config.local.json`) was committed before you added the block, `.gitignore` will not untrack it automatically. Run `git rm &#8211;cached <path>` to stop tracking it without deleting your local copy.<\/p>\n<p>## Design hook<\/p>\n<p>On Claude Code, GitHub Copilot, Codex, Cursor, and Grok Build, `npx impeccable install` and `npx impeccable update` install a provider-native hook manifest along with the skill payload. The hook runs the Impeccable design detector on direct UI file edits and surfaces findings back into the agent flow. Claude Code, GitHub Copilot, Codex, and Grok Build surface findings after the edit (and run a deeper pass on Stop where supported). Cursor blocks bad proposed writes before they land.<\/p>\n<p>Installed hook surfaces:<\/p>\n<p>&#8211; Claude Code: `.claude\/settings.local.json` (gitignored, machine-local) runs `${CLAUDE_PROJECT_DIR}\/.claude\/skills\/impeccable\/scripts\/hook.mjs`. A hook moved into the shared `settings.json` is honored in place.<br \/>\n&#8211; GitHub Copilot: `.github\/hooks\/impeccable.json` (committed, shared by the Copilot CLI and the cloud agent) runs `.github\/skills\/impeccable\/scripts\/hook.mjs`. The Copilot CLI activates it once the file is on the repository&#8217;s default branch and the folder is trusted.<br \/>\n&#8211; Cursor: `.cursor\/hooks.json` runs `.cursor\/skills\/impeccable\/scripts\/hook-before-edit.mjs`.<br \/>\n&#8211; Codex: `.codex\/hooks.json` runs `.agents\/skills\/impeccable\/scripts\/hook.mjs`.<\/p>\n<p>The installer preserves unrelated hook entries and settings. If a hook manifest is malformed, install\/update aborts by default; rerun with `&#8211;force` to back up the malformed file as `.bak` and replace it.<\/p>\n<p>On an interactive `install`\/`update`, Impeccable explains the hook and offers to install it (default yes). Your choice is remembered per-developer in the gitignored `.impeccable\/config.local.json`, so you are not asked again; `&#8211;no-hooks` skips it for that run without recording anything. Hook lifecycle settings live under the `hook` key of `.impeccable\/config.json`; detector ignores live under `detector`, shared by `\/impeccable hooks` and `npx impeccable detect`.<\/p>\n<p>For debugging, set `hook.auditLog` in `.impeccable\/config.json` to a path (or the legacy `IMPECCABLE_HOOK_LOG` env var) to write one NDJSON line per hook invocation. Leave it unset for normal use.<\/p>\n<p>## Build path: comp-first or code-first<\/p>\n<p>When a new surface gets designed, Impeccable either generates a full-fidelity comp first and builds to match it, or builds straight in code with the ambition written into the direction contract and checked at the finish. Comp-first composes bolder and takes longer; code-first is leaner and faster. `\/impeccable init` asks once and records the answer as `buildPath` in `.impeccable\/config.json`:<\/p>\n<p>&#8220;`json<br \/>\n{ &#8220;buildPath&#8221;: &#8220;comp&#8221; }<br \/>\n&#8220;`<\/p>\n<p>The values are `comp` and `code`, and nothing else is read. Set it in the gitignored `.impeccable\/config.local.json` to override the team&#8217;s committed value on one machine, which is what you want when your harness has no image generation. In a monorepo, commit it once at the repo root and any workspace that wants something else sets its own. The choice appears at all only where image generation is available, since without it there is nothing to comp.<\/p>\n<p>You do not have to re-run `init` to set it on a project that predates the setting, and you do not have to edit the file by hand either. Whatever is recorded is a default rather than a lock: every decision page carries a footer toggle, and flipping it binds that session only. Flip it on a project that has recorded nothing and Impeccable asks once, after the round, whether to keep it, then writes your answer. That is the whole migration path for an existing project: use the toggle when the default is wrong, and answer the question that follows.<\/p>\n<p>Codex requires one platform step that Impeccable cannot safely skip: open `\/hooks` after install or update and approve the project hook. There is no Codex marketplace\/plugin install flow for this hook.<\/p>\n<p>Full hook docs: [impeccable.style\/docs\/hooks](https:\/\/impeccable.style\/docs\/hooks).<\/p>\n<p>Manual copy commands are fallback\/debug instructions. The normal path is:<\/p>\n<p>&#8220;`bash<br \/>\nnpx impeccable install<br \/>\nnpx impeccable update<br \/>\n&#8220;`<\/p>\n<p>## CLI<\/p>\n<p>Impeccable includes a standalone CLI for detecting anti-patterns without an AI harness:<\/p>\n<p>&#8220;`bash<br \/>\nnpx impeccable detect src\/                   # scan a directory<br \/>\nnpx impeccable detect index.html             # scan an HTML file<br \/>\nnpx impeccable detect https:\/\/example.com    # scan a URL (Puppeteer)<br \/>\nnpx impeccable detect &#8211;json .               # CI-friendly JSON output<br \/>\nnpx impeccable detect &#8211;no-config src\/       # raw scan, ignoring project config\/context<br \/>\nnpx impeccable ignores list                  # show detector ignores<br \/>\nnpx impeccable ignores add-file &#8220;src\/legacy\/**&#8221;<br \/>\nnpx impeccable ignores add-value overused-font Inter &#8211;reason &#8220;Brand font&#8221;<br \/>\n&#8220;`<\/p>\n<p>The detector catches 59 deterministic issues across AI slop (side-tab borders, purple gradients, bounce easing, dark glows) and general design quality (line length, cramped padding, small touch targets, skipped headings, and more).<\/p>\n<p>By default, `detect` respects the same `.impeccable\/config.json` and `.impeccable\/config.local.json` detector config as the design hook: `detector.ignoreRules`, `detector.ignoreFiles`, `detector.ignoreValues`, and `detector.designSystem.enabled`. Hook lifecycle settings such as `hook.enabled` only affect automatic hook execution.<\/p>\n<p>For a waiver that should travel with one file instead of the repo config, add an inline comment in the file: `<!-- impeccable-disable overused-font: exported brand doc -->`. The marker works in any comment syntax, scopes to the whole file (or one line with `impeccable-disable-line` \/ `impeccable-disable-next-line`), and is bypassed by `&#8211;no-inline-ignores` or `&#8211;no-config`.<\/p>\n<p>Full detector docs: [impeccable.style\/docs\/detector](https:\/\/impeccable.style\/docs\/detector).<\/p>\n<p>## Supported Tools<\/p>\n<p>&#8211; [Cursor](https:\/\/cursor.com)<br \/>\n&#8211; [Claude Code](https:\/\/claude.ai\/code)<br \/>\n&#8211; [GitHub Copilot](https:\/\/github.com\/features\/copilot)<br \/>\n&#8211; [Gemini CLI](https:\/\/github.com\/google-gemini\/gemini-cli)<br \/>\n&#8211; [Codex CLI](https:\/\/github.com\/openai\/codex)<br \/>\n&#8211; [Grok Build](https:\/\/x.ai\/cli)<br \/>\n&#8211; [OpenCode](https:\/\/opencode.ai)<br \/>\n&#8211; [Pi](https:\/\/pi.dev)<br \/>\n&#8211; [Kiro](https:\/\/kiro.dev)<br \/>\n&#8211; [Trae](https:\/\/trae.ai)<br \/>\n&#8211; [Rovo Dev](https:\/\/www.atlassian.com\/software\/rovo)<br \/>\n&#8211; [Qoder](https:\/\/qoder.com)<br \/>\n&#8211; [Mistral Vibe](https:\/\/docs.mistral.ai\/vibe\/code\/overview)<br \/>\n&#8211; [Google Antigravity](https:\/\/antigravity.google)<\/p>\n<p>## Community &#038; Ecosystem<\/p>\n<p>Join the community and ecosystem conversations:<\/p>\n<p>&#8211; GitHub Discussions: file bugs, request features, and help newcomers.<br \/>\n&#8211; [Impeccable on npm](https:\/\/www.npmjs.com\/package\/impeccable): grab the CLI, follow releases, and star the package.<br \/>\n&#8211; Follow @pbakaus on Twitter for release notes, sample lint reports, and video highlights of new rules.<\/p>\n<p>## Contributing<\/p>\n<p>See [DEVELOP.md](docs\/DEVELOP.md) for contributor guidelines and build instructions.<\/p>\n<p>## License<\/p>\n<p>Apache 2.0. See [LICENSE](LICENSE).<\/p>\n<p>&#8212;<\/p>\n<p>Created by [Paul Bakaus](https:\/\/www.paulbakaus.com)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The design language that makes your AI harness better at design.<\/p>\n","protected":false},"author":1,"featured_media":3870,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ai_share_source_url":"https:\/\/github.com\/pbakaus\/impeccable","ai_share_source_title":"pbakaus\/impeccable","ai_share_status":"\u5df2\u53d1\u5e03","ai_share_official_url":"https:\/\/impeccable.style","ai_share_original_content_language":"en","ai_share_i18n_original_source_language":"en","ai_share_author_label":"pbakaus","ai_share_version_label":"skill-v4.1.1","ai_share_primary_category":"\u8bbe\u8ba1\u521b\u610f","ai_share_tool_type":"skill","ai_share_resource_type":"workflow_skill_pack","ai_share_platform_support":"CLI,Chrome,\u6587\u6863","ai_share_collection":"\u8bbe\u8ba1\u4e0e\u54c1\u724c\u7d20\u6750","ai_share_last_verified_at":"2026-05-08","ai_share_provider_observed_at":"2026-08-18T07:21:00.080Z","ai_share_last_commit_at":"2026-08-18T05:38:15Z","ai_share_license":"Apache-2.0","ai_share_language_support":"en","ai_share_target_user":"\u524d\u7aef\u5de5\u7a0b\u5e08,\u8bbe\u8ba1\u5de5\u7a0b\u5e08,\u91cd\u89c6 UI \u8d28\u91cf\u7684 AI \u5f00\u53d1\u8005","ai_share_repo_default_branch":"main","ai_share_pricing_model":"open_source","ai_share_deployment_mode":"self_hosted","ai_share_delivery_mode":"","ai_share_region_availability":"global","ai_share_source_platform":"GitHub","ai_share_download_url":"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v3.9.1\/universal.zip","ai_share_release_url":"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/skill-v4.1.1","ai_share_download_assets_json":"[{\"label\":\"universal.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v4.1.1\/universal.zip\",\"size\":17688388,\"content_type\":\"application\/zip\",\"download_count\":361,\"source\":\"github-release\",\"download\":true}]","ai_share_github_releases_json":"[{\"tagName\":\"skill-v4.1.1\",\"name\":\"Skill 4.1.1\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/skill-v4.1.1\",\"body\":\"- **The review no longer passes on bad screenshots.** Broken or missing captures get retaken and the review runs again on real evidence.\\n\\n- **Pushing back works.** Show a finished build a screenshot of what looks wrong and the whole review reruns against it.\\n\\n- **No more fake cutouts.** Circle masks pretending a photo was cut out are refused in favor of real cut-out assets.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-08-14T12:59:39Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":1,\"assets\":[{\"label\":\"universal.zip\",\"name\":\"universal.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v4.1.1\/universal.zip\",\"content_type\":\"application\/zip\",\"size\":17688388,\"download_count\":361}]},{\"tagName\":\"skill-v4.1.0\",\"name\":\"Skill 4.1.0\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/skill-v4.1.0\",\"body\":\"- **The roll argues with itself, in front of you.** Every dealt world now carries a verdict, and the direction you are handed has already taken what the losing worlds did better. You choose from a hand that has been fought over.\\n\\n- **What you approve looks like a page.** Full-fidelity comps replaced the old sketches, which came back too rough to decide from. Generation costs the same at any fidelity, so the draft quality was buying nothing.\\n\\n- **Steer the next hand instead of re-rolling blind.** Safer and bolder aim the roll along the familiar-to-bold axis, and IMPECCABLE'S PICK shows the model's own favourite when the dice chose otherwise.\\n\\n- **The deck reads as a gradient of standing.** Contenders, then the category standard, then the demoted row last. Stacked raise callouts became a compact cycler, so the assigned card stopped towering over its neighbours.\\n\\n- **Adding a page keeps the world you already have.** Once identity is settled, cards differ in composition rather than character, and each comp anchors on a screenshot of a page you already shipped.\\n\\n- **The board still works with no image generation.** A text-only card keeps its full read on the front, and art that fails to load collapses to a field painted from the card's own palette instead of a dark void.\\n- **Verification knows what platform it is on.** The comp side of the system was platform-aware while everything that checked the work assumed a browser. The verify-and-review pipeline now has a native leg, so an iOS or Android build is reviewed as an app.\\n\\n- **Polish gathers native evidence.** Its classify, triage, and verify steps map per platform instead of asking for browser evidence that a native app cannot produce.\\n\\n- **The detector stops contradicting itself.** Web-only checks no longer fire against native surfaces they were never written for.\\n- **Comp-first or code-first is your call now.** Comp-first buys bolder composition for time; code-first is leaner and writes the ambition into the contract instead. `init` asks once, with the trade stated.\\n\\n- **Change your mind mid-round.** Every board carries the toggle: flip it and the open cards start generating comps without closing the round, flip back and anything already rendered stays.\\n\\n- **Existing projects never re-run setup.** On a project that has recorded nothing, the first flip asks whether to keep it. One machine can differ from the team in `.impeccable\/config.local.json`.\\n- **Windows works.** Installs no longer trip the POSIX hook guard, the runtime probe survives `cmd.exe` metacharacters, the decision page opens in your browser, and a successful roll stops aborting on the way out.\\n\\n- **Plugin subagents actually load.** Marketplace installs shipped four subagents that Claude Code silently never loaded, because the generated manifest carried a key that suppressed them.\\n\\n- **Two more harnesses.** Hermes Agent and Google Antigravity install and run natively, and pinned skills read correctly on Codex.\\n- **Critique tells you what it found.** The report is spoken to you rather than written into a file you never open, and the closing question comes last instead of swallowing the report.\\n\\n- **Live mode reaches the dev hosts it used to refuse.** ddev, Valet, and any named host authorize by session token.\\n\\n- **Svelte variants render again.** A printer upstream had been turning the type annotation in every generated variant into invalid JavaScript, so nothing mounted.\\n\\n- **The design hook stopped nagging.** Agents record confident ignores themselves, waivers scope to the element that earned them, and files outside your project are left alone.\\n\\n- **Copy edits survive the trip.** Live mode's copy-edit prompt is bounded so long pages stop overflowing it, and the Claude transport delivers what it was given.\\n\\n- **Motion guidance is back.** Reduced-motion direction returned to the animation reference after going missing, and DESIGN.md's Layout and Shapes sections parse again.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-08-14T04:31:52Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":1,\"assets\":[{\"label\":\"universal.zip\",\"name\":\"universal.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v4.1.0\/universal.zip\",\"content_type\":\"application\/zip\",\"size\":17675065,\"download_count\":25}]},{\"tagName\":\"ext-v1.3.2\",\"name\":\"Extension 1.3.2\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/ext-v1.3.2\",\"body\":\"- **The quieter detector, in your browser.** Ships the engine that measures real gradient and image-backed grounds instead of assuming white, accounts for elements hidden behind what sits above them, and stops flagging quoted JSX transition values and documented shadow tokens. The same 59 rules, with materially fewer false positives. Chrome and Firefox.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-08-14T04:33:01Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":2,\"assets\":[{\"label\":\"extension-firefox.zip\",\"name\":\"extension-firefox.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/ext-v1.3.2\/extension-firefox.zip\",\"content_type\":\"application\/zip\",\"size\":177021,\"download_count\":9},{\"label\":\"extension.zip\",\"name\":\"extension.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/ext-v1.3.2\/extension.zip\",\"content_type\":\"application\/zip\",\"size\":176929,\"download_count\":16}]},{\"tagName\":\"cli-v3.6.0\",\"name\":\"CLI 3.6.0\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/cli-v3.6.0\",\"body\":\"- **Contrast findings stop assuming white.** Text over a gradient, over an image, or under something else was scored against an assumed white ground, which manufactured low-contrast findings on perfectly legible pages. The engine now measures the real gradient body ground, accounts for image-backed text and for elements occluded by what sits above them, and declines to guess at all when a background genuinely cannot be read.\\n\\n- **Waivers you can scope.** `data-impeccable-ignore` silences the element that carries it rather than a whole rule across the file, and `ignore-file` honors the scope flags you pass it.\\n\\n- **Two more providers.** Hermes Agent and Google Antigravity install like the rest.\\n\\n- **Fewer false positives elsewhere.** Quoted transition values in JSX no longer read as layout transitions, documented sidecar shadow colors are allowed inside shadow contexts, and broken-image findings stop firing on commented-out source.\\n\\n- **Installs and scans that behave.** Explicitly selected providers install without `--force`, the post-install next step points at your agent chat instead of the terminal, Windows installs skip the POSIX hook guard, Blade files turn up in directory scans, and a missing static-HTML parser dependency warns instead of quietly scanning nothing.\\n\\n- **Paths with quotes or spaces stop breaking commands.** Four places built shell commands by wrapping values in double quotes, which is not shell quoting. They now quote properly.\\n\\n- **DESIGN.md frontmatter reads correctly.** Quote escapes in YAML scalars are unescaped, so a design system carrying quoted values parses instead of losing them.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-08-14T04:32:18Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":0,\"assets\":[]},{\"tagName\":\"skill-v4.0.4\",\"name\":\"Skill 4.0.4\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/skill-v4.0.4\",\"body\":\"- **The finish review grew a spine.** It opens with a derived verdict, rebuild, fix, or ship, computed from its fidelity matrix rather than felt, and the build thread must report that word verbatim.\\n\\n- **It reviews the page, not the claims.** The reviewer spawns fresh rather than inheriting the build thread's optimism, scores recaptured screenshots only, and re-reads the craft floor so a banned element is a finding even when the comp contains nothing like it.\\n\\n- **The comp survives translation.** A photographic hero used to be written down as \\\"silhouette in SVG\\\". The implementation inventory now gates on medium: figures, objects, and lit material are raster whatever the stack, while geometry and motion stay vector.\\n\\n- **Three more refusals on the craft floor.** A system display face as a page's display voice, unicode glyphs standing in for an icon system, and hard offset shadows outside a world that is actually neobrutalist.\\n- **Comps are pages, not vignettes.** Prompts lead with the surface's real structure, so the model designs the fish market's website instead of painting the fish market.\\n\\n- **The prompt travels with the asset.** Generated images carry their own prompt in metadata, so an image moved between machines can still say what it is and why it exists.\\n\\n- **Approval is part of the record.** The chosen comp's sidecar carries `approved: true`, so the pick survives sessions and machines. A build with comps and no recorded pick is a material finding.\\n\\n- **The surface owns its aspect.** Native and mobile-first surfaces comp portrait at device viewport, desktop web comps landscape, and the decision board adapts to either.\\n- **The direction can no longer be silently lost.** Some build tools strip a component's leading comment, taking the contract with it. It now lives as the first child of the root layout's body, and the built output is checked for the seed key.\\n\\n- **Compositions leave the deal, for now.** The surface roll still assigns which of your structures gets built, but the composition challengers are withdrawn until their catalog grows real axes.\\n\\n- **Sharper dice.** Staging deals honour approval ratings the way world challengers do, so small per-surface pools stop repeating their weakest option.\\n- **Native subagents on GitHub Copilot and Cursor.** All four shipped roles emit in each harness's own custom-agent format from one source, with the reviewer correctly read-only on Cursor.\\n\\n- **The stack is your decision.** On a greenfield project, `init` asks once: plain HTML\/CSS, a named framework, or delegated, recorded in PRODUCT.md so later work can prove the choice was offered.\\n\\n- **The decision board survives sandboxes.** A sandboxed session's permission error used to read as the server dying, which read as you closing the board. Liveness now leads with the page's own heartbeat.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-07-30T03:18:11Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":1,\"assets\":[{\"label\":\"universal.zip\",\"name\":\"universal.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v4.0.4\/universal.zip\",\"content_type\":\"application\/zip\",\"size\":14654654,\"download_count\":668}]},{\"tagName\":\"ext-v1.3.1\",\"name\":\"Extension 1.3.1\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/ext-v1.3.1\",\"body\":\"- **The detector sees whole pages again.** Ships the engine that resolves versioned stylesheet links (`styles.css?v=3`) instead of going blind on them, catches standard-tracked kickers that slipped under the old 1px tracking floor, and retires the `single-font` rule.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-07-30T03:18:54Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":2,\"assets\":[{\"label\":\"extension-firefox.zip\",\"name\":\"extension-firefox.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/ext-v1.3.1\/extension-firefox.zip\",\"content_type\":\"application\/zip\",\"size\":169112,\"download_count\":126},{\"label\":\"extension.zip\",\"name\":\"extension.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/ext-v1.3.1\/extension.zip\",\"content_type\":\"application\/zip\",\"size\":169014,\"download_count\":299}]},{\"tagName\":\"cli-v3.5.0\",\"name\":\"CLI 3.5.0\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/cli-v3.5.0\",\"body\":\"- **Documentation stops flagging itself.** Fifteen page-level checks used to scan raw source, so prose about CSS, code samples, and comments could trip rules like gradient-text on sites that write about design. Each check is now scoped to what it actually means: real style carriers, class attributes, or rendered text. A changelog documenting a detector rule no longer triggers it, in the CLI and the browser paths both.\\n\\n- **Versioned stylesheets no longer blind the scan.** A page linking `styles.css?v=3` resolved the query string as part of the file path, so the lookup failed silently and every element-level check ran against unstyled markup: one finding on a page that carries eighteen. Stylesheet hrefs now strip query and hash before resolving.\\n\\n- **The kicker net catches standard tracking.** The most common authored kicker, uppercase at 12px with 0.08em letter-spacing, computes to a fraction under the rule's old 1px tracking floor and slipped through. The floor is now proportional to font size, and the exact shape that escaped is pinned in the fixture suite.\\n\\n- **Retired: `single-font`.** One family with weight and size contrast carrying the hierarchy is a legitimate type system, and in practice the rule mostly flagged pages that were doing exactly that. Configs that ignore it will surface as stale via `doctor`.\\n\\n- **Installs place the Copilot and Cursor agents.** Project installs write `.github\/agents\/` and `.cursor\/agents\/`; user-level installs go to `~\/.copilot\/agents\/` and `~\/.cursor\/agents\/`, with a warning where Copilot's user-level copies would shadow a project's newer ones.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-07-30T03:18:24Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":0,\"assets\":[]},{\"tagName\":\"skill-v4.0.3\",\"name\":\"Skill 4.0.3\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/tag\/skill-v4.0.3\",\"body\":\"- **The decision page grew up.** Every direction card shares one anatomy: thesis, palette, materials, first viewport, honest risk, with the longer read behind a Details flip.\\n\\n- **Sketches stream in while you read.** The page serves instantly and each card's sketch lands as it finishes, rendered through one deliberately unfinished shared frame.\\n\\n- **A sketch cannot invent facts.** Only the product name and one real headline are legible; every other text region is greeked, so no sketch invents specs, prices, or dates.\\n\\n- **Catalog inspirations stay labeled.** They ride picture-in-picture as inspiration and take over the frame on hover, rather than posing as your future design.\\n\\n- **The finish ends on a verdict.** Every fix is scored resolved, partial, or unresolved against a same-viewport recapture. Open items earn one more round, and the final table reaches you as it stands.\\n\\n- **The review got eyes for style.** Display lettering of a different character fails however well the layout matches, and flat CSS standing in for painted artwork fails regardless of placement.\\n\\n- **Kickers are banned.** The eyebrow label above a heading leaves the craft floor entirely. The heading carries its own weight.\\n\\n- **DESIGN.md is written from the built page.** A dedicated documenter subagent records what shipped rather than what was intended.\\n\\n- **Sturdier machinery.** The concept roll survives output truncation and comment-stripping build pipelines, catalog challengers carry a breadth axis, and a failed decision-page start says why.\",\"bodyExcerpt\":\"\",\"bodyTruncated\":false,\"publishedAt\":\"2026-07-28T02:18:04Z\",\"prerelease\":false,\"draft\":false,\"assetCount\":1,\"assets\":[{\"label\":\"universal.zip\",\"name\":\"universal.zip\",\"url\":\"https:\/\/github.com\/pbakaus\/impeccable\/releases\/download\/skill-v4.0.3\/universal.zip\",\"content_type\":\"application\/zip\",\"size\":13279029,\"download_count\":129}]}]","ai_share_view_count":4105,"ai_share_bookmark_count":210,"ai_share_first_party_view_count":55,"ai_share_github_stars":60010,"ai_share_github_watchers":172,"ai_share_github_forks":3675,"ai_share_github_open_issues":56,"ai_share_open_source":true,"ai_share_repo_url":"https:\/\/github.com\/pbakaus\/impeccable","ai_share_documentation_url":"https:\/\/impeccable.style\/docs\/detector","creator_id":"github-pbakaus","creator_slug":"pbakaus","creator_name":"pbakaus","creator_type":"person","creator_status":"external","creator_intro":"Creative Technologist  \u2615\ufe0f Entrepreneur \u2022 \ud83d\udddd Gate opener \u2022 \ud83d\uddfa Adventurer \u2022 \ud83c\udfac Geek \u2022 Created jQuery UI, Google for Creators, Spotter Studio \u2022 he\/him","creator_github_url":"https:\/\/github.com\/pbakaus","creator_avatar_url":"https:\/\/avatars.githubusercontent.com\/u\/43004?v=4","ai_share_github_readme_path":"README.md","ai_share_github_readme_sha":"3a71f5981c2872c3eaad7464daf50aa16d7974b6","ai_share_github_readme_hash":"aa0b8ce9d29d24f29d8188299d466655bc166980d82dade6ef778d1a71927a61","ai_share_github_readme_language":"en","ai_share_github_readme_format":"markdown","ai_share_github_description":"The design language that makes your AI harness better at design.","ai_share_one_sentence_definition":"The design language that makes your AI harness better at design.","ai_share_one_sentence_definition_en":"The design language that makes your AI harness better at design.","ai_share_github_readme_url":"https:\/\/github.com\/pbakaus\/impeccable\/blob\/main\/README.md","ai_share_github_readme_raw_url":"https:\/\/raw.githubusercontent.com\/pbakaus\/impeccable\/main\/README.md","ai_share_github_readme_markdown":"# Impeccable\n\nDesign guidance for AI coding agents. 1 skill, 23 commands, live browser iteration, and 59 deterministic detector rules for AI-generated frontend design.\n\n> **Quick start:** From your project root, run `npx impeccable install`, then run `\/impeccable init` inside your AI coding tool. Full docs: [impeccable.style](https:\/\/impeccable.style).\n\n## Why Impeccable?\n\nAnthropic's [frontend-design](https:\/\/github.com\/anthropics\/skills\/tree\/main\/skills\/frontend-design) was the first widely-used design skill for Claude. Impeccable started from there.\n\nEvery model trained on the same SaaS templates. Skip the guidance and you get the same handful of tells on every project: Inter for everything, purple-to-blue gradients, cards nested in cards, gray text on colored backgrounds, the rounded-square icon tile above every heading.\n\nImpeccable adds:\n- **One setup flow.** `\/impeccable init` writes `PRODUCT.md` and offers `DESIGN.md`, so later commands know the audience, brand\/product lane, voice, anti-references, colors, type, and components.\n- **23 commands.** A shared design vocabulary with your AI: `polish`, `audit`, `critique`, `distill`, `animate`, `bolder`, `quieter`, and more.\n- **59 deterministic detector rules** plus LLM-only critique checks. The CLI and browser extension run the deterministic rules with no LLM and no API key.\n\n## What's Included\n\n### The Skill: impeccable\n\nThe skill installs as one command:\n\n```bash\n\/impeccable <command> <target>\n```\n\nStart every new project with:\n\n```bash\n\/impeccable init\n```\n\n`init` asks whether the surface is brand (marketing, landing, portfolio) or product (app UI, dashboard, tool), then writes design context that every later command reads.\n\n### 23 Commands\n\nAll commands are accessed through `\/impeccable`:\n\n| Command | What it does |\n|---------|--------------|\n| `\/impeccable craft` | Full shape-then-build flow with visual iteration |\n| `\/impeccable init` | One-time setup: gather design context, write PRODUCT.md and DESIGN.md, configure live mode, recommend next steps |\n| `\/impeccable document` | Generate root DESIGN.md from existing project code |\n| `\/impeccable extract` | Pull reusable components and tokens into the design system |\n| `\/impeccable shape` | Plan UX\/UI before writing code |\n| `\/impeccable critique` | UX design review: hierarchy, clarity, emotional resonance |\n| `\/impeccable audit` | Run technical quality checks (a11y, performance, responsive) |\n| `\/impeccable polish` | Final pass, design system alignment, and shipping readiness |\n| `\/impeccable bolder` | Amplify boring designs |\n| `\/impeccable quieter` | Tone down overly bold designs |\n| `\/impeccable distill` | Strip to essence |\n| `\/impeccable harden` | Error handling, i18n, text overflow, edge cases |\n| `\/impeccable onboard` | First-run flows, empty states, activation paths |\n| `\/impeccable animate` | Add purposeful motion |\n| `\/impeccable colorize` | Introduce strategic color |\n| `\/impeccable typeset` | Fix font choices, hierarchy, sizing |\n| `\/impeccable layout` | Fix layout, spacing, visual rhythm |\n| `\/impeccable delight` | Add moments of joy |\n| `\/impeccable overdrive` | Add technically extraordinary effects |\n| `\/impeccable clarify` | Improve unclear UX copy |\n| `\/impeccable adapt` | Adapt for different devices |\n| `\/impeccable optimize` | Performance improvements |\n| `\/impeccable live` | Visual variant mode: iterate on elements in the browser |\n\nUse `\/impeccable pin <command>` to create standalone shortcuts (e.g., `pin audit` creates `\/audit`).\n\n#### Usage Examples\n\n```\n\/impeccable audit blog           # Audit blog hub + post pages\n\/impeccable critique landing     # UX design review\n\/impeccable polish settings      # Final pass before shipping\n\/impeccable harden checkout      # Add error handling + edge cases\n```\n\nOr use `\/impeccable` directly with a description:\n```\n\/impeccable redo this hero section\n```\n\n### Anti-Patterns\n\nThe skill includes explicit guidance on what to avoid:\n\n- Don't use overused fonts (Arial, Inter, system defaults)\n- Don't use gray text on colored backgrounds\n- Don't use pure black\/gray (always tint)\n- Don't wrap everything in cards or nest cards inside cards\n- Don't use bounce\/elastic easing (feels dated)\n\n## See It In Action\n\nVisit [the Neo Mirai case study](https:\/\/impeccable.style\/cases\/neo-mirai) to see a before\/after case study of a real project transformed with Impeccable commands.\n\n## Installation\n\n### Option 1: CLI installer (Recommended)\n\nFrom the root of your project, run:\n\n```bash\nnpx impeccable install\n```\n\nThis shows the harness folders it detected (for example `~\/.claude`, `~\/.codex`, `~\/.grok`, or project-local `.cursor`), lets you keep the detected set or customize providers, then asks whether to install into the current project or globally. Use `--providers=claude,codex,cursor,grok` and `--scope=project|global` to skip those choices in scripts. On Claude Code, Cursor, Codex, GitHub Copilot, and Grok Build, it also installs the provider-native hook manifest for the current project. Works with Cursor, Claude Code, Gemini CLI, Codex CLI, Grok Build, and every other supported tool. Reload your harness afterward.\n\nTo refresh an existing install, run:\n\n```bash\nnpx impeccable update\n```\n\nCodex users should open `\/hooks` after install or update and approve the project hook when prompted. Codex tracks trust by hook definition, so updates that change `.codex\/hooks.json` can require approval again. Grok Build users need project folder trust (`\/hooks-trust` or launch with `--trust`) before `.grok\/hooks\/` scripts run.\n\n### Option 2: Git Submodule\n\nFor teams that want to keep Impeccable vendored and updated through Git, add this repo as a submodule and link the compiled provider build into your harness folders:\n\n```bash\ngit submodule add https:\/\/github.com\/pbakaus\/impeccable .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\ngit add .gitmodules .impeccable .claude .cursor\ngit commit -m \"Add Impeccable skills\"\n```\n\nUse the providers your project needs, for example `claude`, `cursor`, `gemini`, `codex`, `github`, `grok`, `opencode`, `pi`, `qoder`, `trae`, `trae-cn`, `rovo-dev`, or `vibe`. The command links individual skill folders from `.impeccable\/dist\/universal\/` and leaves existing real skill directories untouched unless you pass `--force`.\n\nTo update later:\n\n```bash\ngit submodule update --remote .impeccable\nnpx impeccable link --source=.impeccable --providers=claude,cursor\n```\n\n### Option 3: Plugin install\n\n**Claude Code:**\n```bash\n\/plugin marketplace add pbakaus\/impeccable\n```\n\n> Claude Code only. After adding the marketplace, open `\/plugin` and install Impeccable from the list.\n\n**Grok Build:**\n```bash\ngrok plugin install pbakaus\/impeccable#plugin --trust\n```\n\n> Grok Build only. The `#plugin` suffix installs the slim plugin package (skills, agents, and hooks) instead of the full monorepo. Then run `\/impeccable init` in a Grok session. Project-scoped installs via `npx impeccable install --providers=grok` also work and write `.grok\/skills\/` plus `.grok\/hooks\/impeccable.json`.\n\n### Option 4: Download from Website\n\nVisit [impeccable.style](https:\/\/impeccable.style), download the ZIP for your tool, and extract to your project.\n\n### Option 5: Copy from Repository\n\n**Cursor:**\n```bash\ncp -r dist\/cursor\/.cursor your-project\/\n```\n\n> **Note:** Cursor skills require setup:\n> 1. Switch to Nightly channel in Cursor Settings \u2192 Beta\n> 2. Enable Agent Skills in Cursor Settings \u2192 Rules\n>\n> [Learn more about Cursor skills](https:\/\/cursor.com\/docs\/context\/skills)\n\n**Claude Code:**\n```bash\n# Project-specific\ncp -r dist\/claude-code\/.claude your-project\/\n\n# Or global (applies to all projects)\ncp -r dist\/claude-code\/.claude\/* ~\/.claude\/\n```\n\n**OpenCode:**\n```bash\ncp -r dist\/opencode\/.opencode your-project\/\n```\n\n**Pi:**\n```bash\ncp -r dist\/pi\/.pi your-project\/\n```\n\n**Gemini CLI:**\n```bash\ncp -r dist\/gemini\/.gemini your-project\/\n```\n\n> **Note:** Gemini CLI skills require setup:\n> 1. Install preview version: `npm i -g @google\/gemini-cli@preview`\n> 2. Run `\/settings` and enable \"Skills\"\n> 3. Run `\/skills list` to verify installation\n>\n> [Learn more about Gemini CLI skills](https:\/\/geminicli.com\/docs\/cli\/skills\/)\n\n**Codex CLI:**\n```bash\n# Project-local\ncp -r dist\/agents\/.agents your-project\/\nmkdir -p your-project\/.codex\ncp dist\/codex\/.codex\/hooks.json your-project\/.codex\/hooks.json\n\n# Or install the skill user-wide. Copy .codex\/hooks.json into each project\n# where you want the design hook to run.\nmkdir -p ~\/.agents\/skills\ncp -r dist\/agents\/.agents\/skills\/* ~\/.agents\/skills\/\n```\n\n> The asset-producer subagent ships nested inside the skill's own `agents\/` folder, which Codex auto-discovers. No separate `.codex\/agents\/` copy is needed. The hook is project-local because Codex discovers hooks from `.codex\/hooks.json` next to trusted project config.\n\n**GitHub Copilot:**\n```bash\ncp -r dist\/github\/.github your-project\/\n```\n\n**Trae:**\n```bash\n# Trae China (domestic version)\ncp -r dist\/trae\/.trae-cn\/skills\/* ~\/.trae-cn\/skills\/\n\n# Trae International\ncp -r dist\/trae\/.trae\/skills\/* ~\/.trae\/skills\/\n```\n\n> **Note:** Trae has two versions with different config directories:\n> - **Trae China**: `~\/.trae-cn\/skills\/`\n> - **Trae International**: `~\/.trae\/skills\/`\n>\n> After copying, restart Trae IDE to activate the skills.\n\n**Rovo Dev:**\n```bash\n# Project-specific\ncp -r dist\/rovo-dev\/.rovodev your-project\/\n\n# Or global (applies to all projects)\ncp -r dist\/rovo-dev\/.rovodev\/skills\/* ~\/.rovodev\/skills\/\n```\n\n**Qoder:**\n```bash\n# Project-specific\ncp -r dist\/qoder\/.qoder your-project\/\n\n# Or global (applies to all projects)\ncp -r dist\/qoder\/.qoder\/skills\/* ~\/.qoder\/skills\/\n```\n\n**Mistral Vibe:**\n```bash\n# Project-specific\ncp -r dist\/vibe\/.vibe your-project\/\n\n# Or global (applies to all projects)\ncp -r dist\/vibe\/.vibe\/skills\/* ~\/.vibe\/skills\/\n```\n\n**Grok Build:**\n```bash\n# Project-specific\ncp -r dist\/grok\/.grok your-project\/\n\n# Or global (applies to all projects)\ncp -r dist\/grok\/.grok\/skills\/* ~\/.grok\/skills\/\n```\n\n> Prefer `npx impeccable install --providers=grok` or `grok plugin install pbakaus\/impeccable#plugin --trust` so the design hook installs too. Project hooks need `\/hooks-trust` (or `--trust`) once per folder.\n\n**Google Antigravity:**\n```bash\n# Project-specific\ncp -r dist\/antigravity\/.agent your-project\/\n\n# Or global (applies to all projects)\nmkdir -p ~\/.gemini\/config\/skills\ncp -r dist\/antigravity\/.agent\/skills\/* ~\/.gemini\/config\/skills\/\n```\n\n## Usage\n\nOnce installed, every command runs through the single `\/impeccable` skill:\n\n```\n\/impeccable audit        # Find issues\n\/impeccable polish       # Final cleanup\n\/impeccable distill      # Remove complexity\n\/impeccable critique     # Full design review\n```\n\nType `\/impeccable` alone to see the full command list.\n\nMost commands accept an optional argument to focus on a specific area:\n\n```\n\/impeccable audit the header\n\/impeccable polish the checkout form\n```\n\nIf you reach for one command often, pin it with `\/impeccable pin audit` to get `\/audit` as a standalone shortcut.\n\n**Note:** Codex uses skills here, not `\/prompts:` commands. Open `\/skills` or type `$impeccable`. Repo-local installs live in `.agents\/skills\/`; user-wide installs live in `~\/.agents\/skills\/`. GitHub Copilot uses `.github\/skills\/`. Restart the tool if a newly installed skill does not appear.\n\n## Keeping `.impeccable` out of git\n\nAs you run commands, Impeccable writes working files under `.impeccable\/`: critique and polish screenshots, live-mode session and preview state, runtime caches, and per-developer config. Most of it is ephemeral and should not be committed, while a few files are shared project artifacts that belong in the repo. Add this block to your project's `.gitignore`:\n\n```gitignore\n# impeccable-ignore-start\n# Ephemeral output, runtime state, and per-dev overrides.\n# Unanchored: .impeccable may sit at the repo root or under a nested\n# workspace (apps\/web\/.impeccable\/...); anchored patterns would miss it.\n# Shared artifacts stay tracked: config.json, live\/config.json,\n# design.json, critique\/*.md.\n.impeccable\/config.local.json\n.impeccable\/hook.cache.json\n.impeccable\/hook.pending.json\n.impeccable\/*.png\n.impeccable\/live\/server.json\n.impeccable\/live\/sessions\/\n.impeccable\/live\/previews\/\n.impeccable\/live\/annotations\/\n.impeccable\/live\/cache\/\n.impeccable\/live\/manual-edit-apply-transaction.json\n.impeccable\/live\/manual-edit-events.jsonl\n.impeccable\/live\/manual-edit-evidence\/\n.impeccable\/live\/pending-manual-edits.json\n.impeccable\/live\/deferred-svelte-component-accepts.json\n.impeccable\/live\/*.png\n# impeccable-ignore-end\n```\n\nThe block is wrapped in `# impeccable-ignore-start` \/ `# impeccable-ignore-end` markers so you can recognize and refresh it later. Patterns are unanchored on purpose: in a monorepo the active project (and its `.impeccable\/` directory) often lives under a nested workspace path like `apps\/web\/`, and a root-anchored pattern would miss it.\n\n**Keep these tracked** (they are shared project artifacts, do not add them to `.gitignore`):\n\n- `.impeccable\/config.json` (unified shared config)\n- `.impeccable\/live\/config.json` (live-mode framework wiring)\n- `.impeccable\/design.json` (shared design spec)\n- `.impeccable\/critique\/*.md` (review reports)\n\nIf an ephemeral file (a screenshot, `config.local.json`) was committed before you added the block, `.gitignore` will not untrack it automatically. Run `git rm --cached <path>` to stop tracking it without deleting your local copy.\n\n## Design hook\n\nOn Claude Code, GitHub Copilot, Codex, Cursor, and Grok Build, `npx impeccable install` and `npx impeccable update` install a provider-native hook manifest along with the skill payload. The hook runs the Impeccable design detector on direct UI file edits and surfaces findings back into the agent flow. Claude Code, GitHub Copilot, Codex, and Grok Build surface findings after the edit (and run a deeper pass on Stop where supported). Cursor blocks bad proposed writes before they land.\n\nInstalled hook surfaces:\n\n- Claude Code: `.claude\/settings.local.json` (gitignored, machine-local) runs `${CLAUDE_PROJECT_DIR}\/.claude\/skills\/impeccable\/scripts\/hook.mjs`. A hook moved into the shared `settings.json` is honored in place.\n- GitHub Copilot: `.github\/hooks\/impeccable.json` (committed, shared by the Copilot CLI and the cloud agent) runs `.github\/skills\/impeccable\/scripts\/hook.mjs`. The Copilot CLI activates it once the file is on the repository's default branch and the folder is trusted.\n- Cursor: `.cursor\/hooks.json` runs `.cursor\/skills\/impeccable\/scripts\/hook-before-edit.mjs`.\n- Codex: `.codex\/hooks.json` runs `.agents\/skills\/impeccable\/scripts\/hook.mjs`.\n\nThe installer preserves unrelated hook entries and settings. If a hook manifest is malformed, install\/update aborts by default; rerun with `--force` to back up the malformed file as `.bak` and replace it.\n\nOn an interactive `install`\/`update`, Impeccable explains the hook and offers to install it (default yes). Your choice is remembered per-developer in the gitignored `.impeccable\/config.local.json`, so you are not asked again; `--no-hooks` skips it for that run without recording anything. Hook lifecycle settings live under the `hook` key of `.impeccable\/config.json`; detector ignores live under `detector`, shared by `\/impeccable hooks` and `npx impeccable detect`.\n\nFor debugging, set `hook.auditLog` in `.impeccable\/config.json` to a path (or the legacy `IMPECCABLE_HOOK_LOG` env var) to write one NDJSON line per hook invocation. Leave it unset for normal use.\n\n## Build path: comp-first or code-first\n\nWhen a new surface gets designed, Impeccable either generates a full-fidelity comp first and builds to match it, or builds straight in code with the ambition written into the direction contract and checked at the finish. Comp-first composes bolder and takes longer; code-first is leaner and faster. `\/impeccable init` asks once and records the answer as `buildPath` in `.impeccable\/config.json`:\n\n```json\n{ \"buildPath\": \"comp\" }\n```\n\nThe values are `comp` and `code`, and nothing else is read. Set it in the gitignored `.impeccable\/config.local.json` to override the team's committed value on one machine, which is what you want when your harness has no image generation. In a monorepo, commit it once at the repo root and any workspace that wants something else sets its own. The choice appears at all only where image generation is available, since without it there is nothing to comp.\n\nYou do not have to re-run `init` to set it on a project that predates the setting, and you do not have to edit the file by hand either. Whatever is recorded is a default rather than a lock: every decision page carries a footer toggle, and flipping it binds that session only. Flip it on a project that has recorded nothing and Impeccable asks once, after the round, whether to keep it, then writes your answer. That is the whole migration path for an existing project: use the toggle when the default is wrong, and answer the question that follows.\n\nCodex requires one platform step that Impeccable cannot safely skip: open `\/hooks` after install or update and approve the project hook. There is no Codex marketplace\/plugin install flow for this hook.\n\nFull hook docs: [impeccable.style\/docs\/hooks](https:\/\/impeccable.style\/docs\/hooks).\n\nManual copy commands are fallback\/debug instructions. The normal path is:\n\n```bash\nnpx impeccable install\nnpx impeccable update\n```\n\n## CLI\n\nImpeccable includes a standalone CLI for detecting anti-patterns without an AI harness:\n\n```bash\nnpx impeccable detect src\/                   # scan a directory\nnpx impeccable detect index.html             # scan an HTML file\nnpx impeccable detect https:\/\/example.com    # scan a URL (Puppeteer)\nnpx impeccable detect --json .               # CI-friendly JSON output\nnpx impeccable detect --no-config src\/       # raw scan, ignoring project config\/context\nnpx impeccable ignores list                  # show detector ignores\nnpx impeccable ignores add-file \"src\/legacy\/**\"\nnpx impeccable ignores add-value overused-font Inter --reason \"Brand font\"\n```\n\nThe detector catches 59 deterministic issues across AI slop (side-tab borders, purple gradients, bounce easing, dark glows) and general design quality (line length, cramped padding, small touch targets, skipped headings, and more).\n\nBy default, `detect` respects the same `.impeccable\/config.json` and `.impeccable\/config.local.json` detector config as the design hook: `detector.ignoreRules`, `detector.ignoreFiles`, `detector.ignoreValues`, and `detector.designSystem.enabled`. Hook lifecycle settings such as `hook.enabled` only affect automatic hook execution.\n\nFor a waiver that should travel with one file instead of the repo config, add an inline comment in the file: `<!-- impeccable-disable overused-font: exported brand doc -->`. The marker works in any comment syntax, scopes to the whole file (or one line with `impeccable-disable-line` \/ `impeccable-disable-next-line`), and is bypassed by `--no-inline-ignores` or `--no-config`.\n\nFull detector docs: [impeccable.style\/docs\/detector](https:\/\/impeccable.style\/docs\/detector).\n\n## Supported Tools\n\n- [Cursor](https:\/\/cursor.com)\n- [Claude Code](https:\/\/claude.ai\/code)\n- [GitHub Copilot](https:\/\/github.com\/features\/copilot)\n- [Gemini CLI](https:\/\/github.com\/google-gemini\/gemini-cli)\n- [Codex CLI](https:\/\/github.com\/openai\/codex)\n- [Grok Build](https:\/\/x.ai\/cli)\n- [OpenCode](https:\/\/opencode.ai)\n- [Pi](https:\/\/pi.dev)\n- [Kiro](https:\/\/kiro.dev)\n- [Trae](https:\/\/trae.ai)\n- [Rovo Dev](https:\/\/www.atlassian.com\/software\/rovo)\n- [Qoder](https:\/\/qoder.com)\n- [Mistral Vibe](https:\/\/docs.mistral.ai\/vibe\/code\/overview)\n- [Google Antigravity](https:\/\/antigravity.google)\n\n## Community & Ecosystem\n\nJoin the community and ecosystem conversations:\n\n- GitHub Discussions: file bugs, request features, and help newcomers.\n- [Impeccable on npm](https:\/\/www.npmjs.com\/package\/impeccable): grab the CLI, follow releases, and star the package.\n- Follow @pbakaus on Twitter for release notes, sample lint reports, and video highlights of new rules.\n\n## Contributing\n\nSee [DEVELOP.md](docs\/DEVELOP.md) for contributor guidelines and build instructions.\n\n## License\n\nApache 2.0. See [LICENSE](LICENSE).\n\n---\n\nCreated by [Paul Bakaus](https:\/\/www.paulbakaus.com)"},"categories":[2462],"tags":[1983,1968,1971,1974,1977,1980],"ai_series":[],"ai_topic":[2666],"ai_creator":[717],"ai_collection":[409],"ai_resource_type":[105],"ai_tool_tag":[],"class_list":["post-4144","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-workflow_skill_pack","tag-1983","tag-ui","tag-1971","tag-1974","tag-1977","tag-1980","ai_topic-design-creative","ai_creator-pbakaus","ai_collection-409","ai_resource_type-workflow_skill_pack"],"source_url":"","preserve_modified":false,"lang":"en","translations":{"en":4144,"zh-cn":67},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/posts\/4144","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/comments?post=4144"}],"version-history":[{"count":1,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/posts\/4144\/revisions"}],"predecessor-version":[{"id":4145,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/posts\/4144\/revisions\/4145"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/media\/3870"}],"wp:attachment":[{"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/media?parent=4144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/categories?post=4144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/tags?post=4144"},{"taxonomy":"ai_series","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_series?post=4144"},{"taxonomy":"ai_topic","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_topic?post=4144"},{"taxonomy":"ai_creator","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_creator?post=4144"},{"taxonomy":"ai_collection","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_collection?post=4144"},{"taxonomy":"ai_resource_type","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_resource_type?post=4144"},{"taxonomy":"ai_tool_tag","embeddable":true,"href":"https:\/\/ai.wuaishare.cn\/hub\/wp-json\/wp\/v2\/ai_tool_tag?post=4144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}