impeccable

CLI Tool

pbakaus/impeccable

Design language and command set for AI-assisted frontend design.

Overview

Impeccable provides a shared design vocabulary, domain references, and anti-pattern rules to enhance AI model outputs for frontend design. It includes 23 commands and works as a skill for multiple coding assistants.

README Preview

# Impeccable\n\nThe vocabulary you didn't know you needed. 1 skill, 23 commands, and curated anti-patterns for impeccable frontend design.\n\n> **Quick start:** Visit [impeccable.style](https://impeccable.style) to download ready-to-use bundles.\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- **7 domain reference files** ([view source](skill/)). Typography, color, motion, spatial, interaction, responsive, UX writing. Load on every command, alongside a brand-vs-product register that adjusts the defaults.\n- **23 commands.** A shared design vocabulary with your AI: `polish`, `audit`, `critique`, `distill`, `animate`, `bolder`, `quieter`, and more.\n- **27 deterministic anti-pattern rules** plus a 12-rule LLM critique pass. CLI and browser extension run the deterministic ones with no LLM and no API key. Each is tied to specific design guidance the skill teaches against.\n\n## What's Included\n\n### The Skill: impeccable\n\nA comprehensive design skill with 7 domain-specific references ([view skill](skill/SKILL.src.md)):\n\n| Reference | Covers |\n|-----------|--------|\n| [typography](skill/reference/typography.md) | Type systems, font pairing, modular scales, OpenType |\n| [color-and-contrast](skill/reference/color-and-contrast.md) | OKLCH, tinted neutrals, dark mode, accessibility |\n| [spatial-design](skill/reference/spatial-design.md) | Spacing systems, grids, visual hierarchy |\n| [motion-design](skill/reference/motion-design.md) | Easing curves, staggering, reduced motion |\n| [interaction-design](skill/refer

FAQ (5)

Troubleshooting
Why does 'bundled detector not found' error occur when running impeccable's detect.mjs?

This error happened because the npx skills installer only shipped the skill subtree, missing the detector engine. The issue is resolved in the latest release—update the skill. If updating isn't possible, use this workaround: mkdir -p .agents/skills/impeccable/scripts/detector && ln -sf "$(pwd)/node_modules/impeccable/cli/engine/detect-antipatterns.mjs" .agents/skills/impeccable/scripts/detector/detect-antipatterns.mjs. This symlinks the engine from the impeccable npm package into the expected location.

GitHub Issue #168
Troubleshooting
Why does the critique-storage.mjs script return no output on Windows?

The script's entry-point guard compared import.meta.url (which uses forward slashes on Windows) with file://${process.argv[1]} (backslashes), so the equality check failed and main() was never called. This bug was fixed in v3.1.1 by switching to pathToFileURL(process.argv[1]).href which normalizes separators. Update the skill with: npx skills add pbakaus/impeccable

GitHub Issue #155
Troubleshooting
Why does impeccable live-server --background report a timeout and 'stop' find no server inside a pnpm workspace?

Known root-resolution bug (skill 4.6.0 / engine 0.1.15): inside a pnpm workspace, the parent process and the detached background child resolve different project roots, so server.json is written to a sibling workspace app (e.g. apps/web/.impeccable/live/server.json) instead of the directory you ran the command from. The parent then polls the wrong path, prints Timed out waiting for live server to start. and exits 1, even though the server is healthy (curl http://127.0.0.1:8400/health returns ok). Passing --target . does not help — the flag is consumed before the child is spawned.

Workarounds:
1. Find where the state file actually landed: find . -path '*/.impeccable/live/server.json'
2. Stop the orphaned server by running stop from THAT directory (the sibling app): cd apps/web && impeccable live-server stop --keep-inject
3. Or kill it by port: lsof -nP -iTCP:8400 -sTCP:LISTEN to get the PID, then kill <PID>.
4. To avoid the issue entirely, start impeccable live-server from the workspace root, or move static mock files to a standalone directory outside the pnpm workspace — the bug does not occur there.

Note: a bare stop from the sibling app would also run live-inject --remove against the wrong project's entry file, so use --keep-inject when cleaning up.

GitHub Issue #1086
Troubleshooting
Why does impeccable detect report a cramped-padding false positive on a wrapper containing a padding-free inner wrapper?

In impeccable ≤4.1.0, the cramped-padding flush check only measures direct children. If a coloured wrapper's only child is a transparent, text-free inner div (e.g. a container-query sizing wrapper), that inner box touches all four edges, so the rule fires even though the text-bearing grandchildren have normal padding. Workaround: add a file-scoped ignore — ignore-value cramped-padding "*" --file <glob> — but note this also suppresses genuine cramped-padding findings in those files. Permanent fix: PR #1059 makes the rule see through one transparent, text-free wrapper whose children actually stack (block/flow-root or column flex; row-flex children can't be flush top/bottom) and measures the inset at those children instead. Upgrade impeccable once that PR is released.

GitHub Issue #963
How-to
How to persist Impeccable critique results across sessions to avoid re-raising resolved issues?

Create a manual CRITIQUE.md file to store previous critique output. Before running a new /impeccable critique, instruct the agent to read CRITIQUE.md for context and update it after review. This workaround mimics the proposed feature until built-in persistence lands.

GitHub Issue #128