design-audit · athevon — Claude Code skill: what it does, how to install
Scans frontend codebases for accessibility flaws, motion bugs, and AI design tells. Runs static checks and stacks checklists before shipping.
npx skills add AThevon/genjutsu --skill design-audit -a claude-codeWhat design-audit does
The audit runs via python3 "$SKILL_BASE/design-audit/scripts/audit.py" . with flags like --json, --only <check-id>, or --group. It scans JSX, CSS, .vue, .svelte, and .astro files while ignoring node_modules and build directories. Results are split into three states: detected findings with exact file:line matches, clean files, and inapplicable checks for file types absent from the project.
An eighteen-check tells group flags standard visual habits that models output without prompt requests, including weather strips, three equal cards, glassmorphism, and perpetual motion. The script does not calculate color contrast automatically, which requires manual calculation against token values like 4.5:1 for body copy and 3:1 for large text.
When python3 is missing, the skill switches to inspecting touched files manually. This fallback checks reduced-motion queries, exit transitions, layout animations, focus rings, and click handlers on non-interactive elements.
What it helps with
- detect clickable divs lacking keyboard navigation
- catch expensive layout animations on width, height, or top
- flag typical AI generation tells like glassmorphism and glow effects
- verify prefers-reduced-motion handling across components
Example prompts for the agent
- Run design-audit on this repository and output findings in json.
- Check the project for motion gaps and AI design tells.
How to install design-audit
1Skills CLI (Vercel)
npx skills add AThevon/genjutsu --skill design-audit -a claude-code2Manually: put the files in place
~/.claude/skills/design-audit/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/design-audit/
1Skills CLI (Vercel)
npx skills add AThevon/genjutsu --skill design-audit -a codex2Manually: put the files in place
.agents/skills/design-audit/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add AThevon/genjutsu --skill design-audit -a cursor2Manually: put the files in place
.cursor/skills/design-audit/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install AThevon/genjutsu design-audit2Manually: put the files in place
.github/skills/design-audit/SKILL.md1Skills CLI (Vercel)
npx skills add AThevon/genjutsu --skill design-audit -a gemini-cli2Platform CLI
gemini skills install https://github.com/AThevon/genjutsu --path skills/_jutsu/design-auditManually: put the files in place
.devin/skills/design-audit/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add AThevon/genjutsu --skill design-audit -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about design-audit
How to install design-audit in Claude Code?
Run npx skills add AThevon/genjutsu --skill design-audit -a claude-code. The command configures the skill directly for the Claude Code agent.
What does design-audit inspect?
It checks frontends for accessibility violations, layout animation bottlenecks, and AI design clichés like glassmorphism or glow. Findings include exact file:line locations.
How does it work if Python 3 is not available?
The skill flags that python3 is missing and performs a manual fallback audit on touched files. It reviews focus indicators, motion preferences, and non-interactive click handlers.
Source text
SKILL.md · MIT
--- name: design-audit description: "Design audit checklist - motion gaps, accessibility, color consistency, responsive, performance." metadata: internal: true --- > **Version-sensitive.** Every API name, SDK gate and browser-support claim below was > verified on **2026-09-08** against primary sources. What against, and when, is in > `_jutsu/VERSIONS.md`. If that date is old, re-verify before acting on a version number. # Design Audit > The final checkpoint. Loaded by `/genjutsu:paint` at the end of the pipeline. > Scans the codebase for motion gaps, a11y violations, perf issues, and inconsistencies. --- ## The static pass **Run the script. Do not hand-write the greps.** ```bash python3 "$SKILL_BASE/design-audit/scripts/audit.py" . ``` Add `--json` if you want to post-process it. `--only <check-id>` runs one check, `--group tells` or `--group hygiene` runs one group. It reports three things, and the distinction between the last two is the whole reason it exists: - **findings** - the check ran and found something. Every finding carries `file:line` and the matched text, so you report the evidence rather than a verdict. - **clean** - the check ran against real files and found nothing. - **not applicable** - there were no files of that type, so the check did not run. **Report these as not checked. Never as passing.** These greps used to live in this file, anchored on `src/`. A default Next.js app-router or Nuxt 3 project has no `src/`, so they matched nothing, and the pipeline read the empty output as a clean bill of health and said so to the user right before delivery. The script detects its roots, skips `node_modules` and build output, covers `.vue` / `.svelte` / `.astro` alongside JSX and CSS, and has a test per check asserting that the check can still fire. **Tells are reported apart.** The script also runs the `tells` group: eighteen checks for defaults a model reaches for when nothing asked for them, such as a numbered eyebrow, a weather strip, three equal cards or a U+2014 (em dash) in the copy. Most read the displayed text of the markup (text between tags, `alt`, `title`, `aria-label`, `placeholder`), never class names or style objects, so `width: "100%"` is never taken for a claim of perfection. Five read the source instead, because their tell is a class or a CSS rule: gradient text, glass, glow, blobs and perpetual motion. Copy held in JavaScript data (an array of features, a content file) is not displayed text to the script: read it by hand. They land in their own section, "Tells - confront each with the thesis before counting it", always at `nice-to-have`, and the script never counts one as a problem, because it cannot read the thesis. You confront each one: - the validated thesis names the pattern (it says the studio works across Paris and Tokyo, and the header shows both clocks): list it as **allowed by the thesis**, with the sentence quoted; - it does not: the tell is a problem, and it counts with the other problems. A mood word names nothing. "Editorial" or "agency" does not allow a numbered eyebrow; most tells are exactly the clichés those words summon. When the `tells` module was loaded, its rules decide. The inventory also lists colours, radii and font families next to durations and easings, each value with up to five `file:line` locations. No verdict there: compare them with the tokens and the thesis. **Contrast is not in the script.** Compute it yourself from the token values you emitted, and report the pair with the ratio: `#831843 on #FDF2F8 = 9.4:1`. 4.5:1 for body text, 3:1 for large text and UI boundaries. A swatch you looked at is not a measurement. **If `python3` is unavailable**, say so in one line and fall back to reading the components you touched, in this order: reduced-motion guard, exit animations, layout-property animations, focus visibility, click handlers on non-interactive elements. Report it as a partial audit, and say which checks you could not run. --- ## Stack-specific audit Pick the subsection matching the project stack. ### Compose (Android / Multiplatform) - [ ] Run **Layout Inspector** (Android Studio): inspect recompositions, identify components recomposing on every state change. - [ ] Run **Macrobenchmark** (`androidx.benchmark.macro`): measure frame timing on a real device under representative scrolling / animation load. Target: <16.67ms per frame at 60fps, <8.33ms at 120fps. - [ ] Inspect **recomposition counts**: Layout Inspector > Component Tree > View Options > **Show Recomposition Counts** (API 29+, Compose 1.2+). Reset the counters before each interaction so the numbers mean something. There is no `Modifier.recomposeHighlighter` in androidx - it is a sample you vendor into a debug source set. - [ ] Generate **Baseline Profiles** (`BaselineProfileGenerator`) for production builds. - [ ] Verify `Modifier.semantics` is set on custom components (TalkBack support). ### SwiftUI (iOS / macOS) - [ ] Run **Instruments Time Profiler**: identify hot paths during animation (target: zero frames over 16.67ms). - [ ] Run **Instruments Hitches Instrument** (iOS 14+): detects dropped frames and stalls. - [ ] Run **Instruments GPU Frame Capture** for Metal shaders: verify shader compile time, GPU vs CPU bottleneck. - [ ] Verify `.accessibilityLabel` / `.accessibilityHint` on every interactive view. - [ ] Test with Dynamic Type at 200% size (`Environment Overrides` in Xcode). - [ ] Test with Reduce Motion ON. ### Web - [ ] Existing checklist above (Lighthouse, Chrome DevTools Performance, etc.). --- ## Output Format Structure findings by severity: ### Critical (must fix before ship) - Missing `prefers-reduced-motion` handling - Clickable divs without keyboard support - `outline: none` without `:focus-visible` replacement - Animating layout properties (width/height/top/left) ### Important (fix in current sprint) - Conditional renders without `AnimatePresence` - Hover states without transition - Missing `aria-hidden` on decorative animations - `setTimeout` used for animation loops - Inconsistent durations (>8 unique values) ### Nice-to-have (backlog) - Lists without stagger animation - Inline styles without transition - Excessive `will-change` usage - Asymmetric enter/exit (wrong direction) - Animation library oversized for actual usage
© AThevon · MIT · AThevon/genjutsu
Similar skills
Everything for Frontend and UI →design-audit by other authors comes first.