Use when building or reviewing any web UI so it does NOT look AI-generated. A bias-correction engine: bans the AI tells (Inter, neon purple, pure black, three identical cards, 'Elevate/Seamless', John Doe), sets VARIANCE/MOTION/DENSITY dials, forces required states (loading/empty/error) and performance guardrails, and requires one signature element. Generates a DESIGN.md source of truth per project. Stack-agnostic; no third-party services, no MCP.
Anti-Slop Web — so nothing you ship looks AI-generated
Single goal: remove the "AI tells" that give away a generated UI. The problem with
vibe-coded interfaces is not that they fail to work, it is that they look generic (Inter
font, neon purple, three identical cards, "Elevate your workflow", John Doe). This skill
forces deterministic, premium decisions BEFORE you generate, and verifies them at the end.
It is not magic from any vendor: five bias-correction levers, all native to whatever stack
you already use, zero MCP and zero external service.
When to use it
At the start of a design phase: generate the project DESIGN.md (Part A) before writing
components.
While building or refactoring any screen/section: apply the directives (Part B) as
generation rules.
In your quality/a11y gate before commit: run the pre-flight (Part C).
When NOT to use it
It does not replace the client's brand. The DESIGN.md it generates is re-tokenized to
the client's palette/typography. This skill gives the DISCIPLINE (what to ban, what to
force); the client gives the BRAND.
It does not replace your gates. It complements a11y checks, security/code review before
commit, and your dependency manifest.
Stack integration (how it runs)
This skill is stack-agnostic. Wherever it names a tool, treat it as an example and map it
to your stack:
Animation, lightest tier that achieves the effect: CSS-only (e.g. tw-animate-css,
0 JS) -> native scroll-reveal (animation-timeline: view()) -> a JS animation lib
(e.g. Framer Motion) -> a scroll library (e.g. GSAP ScrollTrigger) -> canvas/WebGL
(Three.js). Never add a library that duplicates a tier you already have.
Components: a customized component system (never the untouched default) plus animated
components only for punctuated motion (ingredient, not product).
Icons: a single consistent icon set (e.g. Phosphor, Radix). Never emojis. Never the
generic "egg" SVG or the default user-icon as an avatar.
Re-tokenization is mandatory: every output is carried to the client's brand. A client
should never be able to trace their site back to a template or a recognizable default.
PART A — DESIGN.md generator (per-project source of truth)
Generate a DESIGN.md at the project root. It is the single source of truth for visual
identity and bans. Every component is generated against this file.
A.1 Dials (translate "make it nice" into rules)
Set three values 1-10. Suggested baseline: VARIANCE 7, MOTION 5, DENSITY 4 (tuned for
conversion and a11y over showing off). Adjust to the brief, not the other way around.
MOTION (static 1 <-> cinematic choreography 10): >5 enables perpetual micro-interactions
and spring physics. Always under prefers-reduced-motion.
DENSITY (airy gallery 1 <-> data cockpit 10): >7 bans generic cards (use border-t/
divide-y/negative space) and forces monospace on numbers.
A.2 Palette (color bans)
Each color: descriptive name + hex + functional role.
One accent maximum. Saturation < 80%.
BAN "AI purple/blue neon": no purple glows, no neon gradients.
Absolute neutral bases (Zinc/Slate) + one singular high-contrast accent (Emerald, Electric
Blue, Deep Rose, etc.). One palette; do not drift warm/cool.
Never pure #000000: use off-black / Zinc-950 / charcoal.
A.3 Typography (font bans)
Display: tight tracking, controlled scale; hierarchy by weight and color, not giant size.
No screaming H1s.
Body: relaxed leading, max 65ch.
BAN Inter for premium/creative contexts. Force character: Geist, Outfit,
Cabinet Grotesk, Satoshi.
Serif: banned in dashboards/software UI. If editorial and needed, only distinctive modern
serifs (Fraunces, Instrument Serif, Editorial New).
Dashboards: only sans pairs (Geist + Geist Mono, or Satoshi + JetBrains Mono).
DENSITY > 7: all numbers in monospace.
A.4 Components (states and materiality)
Buttons: tactile feedback on :active (-translate-y-[1px] or scale-[0.98]). No outer
glow. No custom cursors.
Cards: only when elevation communicates hierarchy; tinted shadow toward the background. In
high density, replace with border-t dividers or negative space.
Inputs: label ABOVE, optional helper in markup, error BELOW. gap-2. Focus ring in the
accent. No floating labels.
Loaders: skeletons with the real layout dimensions. Never a generic circular spinner.
Empty states: a composition that shows how to populate the data, not "No data".
Error states: clear inline reporting.
A.5 Layout
No overlapping elements: each in its clean zone. No absolute stacking.
Pick the lightest tier that works. Spring physics by default when a JS lib applies
(type:"spring", stiffness:100, damping:20); no linear easing.
Animate ONLY transform and opacity. Never top/left/width/height. Grain/noise only in
fixed pointer-events-none pseudo-elements.
Cascade reveals (stagger), do not mount lists all at once. Everything wrapped in
prefers-reduced-motion: no-preference with content visible by default.
A.8 Anti-patterns (the AI tells — encode as "NEVER" in DESIGN.md)
No emojis. No Inter. No generic serif. No #000. No glows/neon. No oversaturated accents.
No text gradient in big headers. No custom cursors. No overlaps. No three identical cards. No
generic names ("John Doe", "Acme", "Nexus"). No fake round numbers (99.99%, 50%) ->
organic data (47.2%). No AI copy cliches ("Elevate", "Seamless", "Unleash", "Next-Gen") ->
concrete verbs. No broken Unsplash -> picsum.photos/seed/<str>/800/600 or SVG avatars. No
filler ("Scroll to explore", bouncing chevrons).
A.9 Signature element (the one AFFIRMATIVE rule — mandatory)
Everything above is prohibition: it stops the UI from looking generated. But a page can pass
EVERY ban and still be forgettable. Absence of tells is not the presence of character.
Each project declares ONE signature element: the thing the page is remembered for, the
thing a visitor describes without saying "a landing page". Just one. Two signatures = none.
Criteria (all three, or it is not a signature):
Memorable: a visitor can describe it from memory a week later.
Owned: it comes from the client's brand/business, not a catalog of effects. A
spotlight-border added because it was on a list is NOT a signature; it is decoration.
Sustained: it appears coherently (not one firework in the hero and nothing else).
It can live in any layer, it does not have to be motion:
Motion/scene: a scroll-scrub hero, kinetic type, a physical reveal.
Materiality: an owned photo treatment, grain/print, an anomalous border or radius.
Typography: a display face with character used structurally, not decoratively.
Data/content: one real piece of the business presented as nobody else in the sector
presents it (the best kind: it cannot be copied without the business).
Interaction: one unique gesture that does something useful, not a trick.
Guard: the signature is declared BEFORE building (it goes in DESIGN.md) and verified in the
pre-flight. If you cannot name it in one sentence, it does not exist. If it contradicts the
brief (a product that asks for restraint), the signature IS the restraint executed with rigor
-- say so explicitly.
A.10 Output template (DESIGN.md)
# Design System: [Project] — Client [X]
## 0. Dials
VARIANCE: n | MOTION: n | DENSITY: n (baseline 7/5/4)
## 1. Atmosphere
[Mood, density, variance and motion in evocative but precise language.]
## 1b. Signature element (mandatory, exactly one)
**[Name in one sentence]** — [what it is, which layer it lives in (motion/materiality/
typography/data/interaction), and WHY it comes from this business and not a catalog.]
Sustained in: [where it recurs across the site].
## 2. Palette and roles
- **[Name]** (#XXXXXX) — [role] (max 1 accent, sat < 80%, no neon, no #000)
## 3. Typography
- Display: [font] — tight tracking, hierarchy by weight
- Body: [font] — relaxed leading, 65ch
- Mono: [font] — numbers/metadata
- Banned: Inter (premium), serif in dashboards
## 4. Components
[Buttons / cards / inputs / loaders / empty / error — shape, shadow, states]
## 5. Layout
[Grid-first, asymmetric splits, collapse < 768px, max-width, min-h-[100dvh]]
## 6. Motion
[Chosen tier, spring, stagger, prefers-reduced-motion, transform/opacity only]
## 7. Anti-patterns (BANNED)
[Explicit list from A.8, adapted to the client]
PART B — Engineering directives (bias correction while generating code)
Rules for writing real components. See reference/design-vocabulary.md for the Tailwind
"how".
Verify dependencies [mandatory]: before importing any library (animation lib, icons,
etc.) check the manifest (package.json). If missing, emit the install command. Never
assume it exists. Respect the framework/tailwind version lock (no v4 syntax in a v3
project).
Server-first, isolated interactivity: static layout as server components. Every
animation/global state lives in a client leaf. Global state only to avoid deep prop
drilling, not arbitrarily.
Deterministic typography: display text-4xl md:text-6xl tracking-tighter leading-none;
body text-base leading-relaxed max-w-[65ch] in a secondary color.
Performance: animate only transform/opacity; will-change sparingly; z-index only
for systemic contexts (sticky navbars, modals, overlays), no z-50 spam. Perpetual
animations memoized and isolated in their own tiny client component; never re-render the
parent.
Credible data (anti "Jane Doe"): realistic contextual names, credible avatars (stable
placeholder photo or owned styling), organic numbers.
External resources: a customized component system ALWAYS (radii, colors, shadows);
picsum.photos or SVG instead of Unsplash; icons with one consistent global strokeWidth
(1.5 or 2.0).
Creative arsenal (avoid the generic default): when the brief asks for character, reach
for premium patterns -- asymmetric hero with image fade, bento 2.0, magnetic button,
split-screen scroll, kinetic type, spotlight-border card, sticky scroll stack. Hard rule:
never mix a scroll/canvas library and a UI animation library in the same component tree;
isolate the heavy one with strict cleanup in useEffect.
PART C — Pre-flight (hooks into your quality/a11y gate before commit)
Before calling a UI done, verify. Any failure = not shippable until fixed.
Zero A.8 AI tells (font, color, layout, copy, data, images).
Signature element (A.9) present, single, sustained. Name it in one sentence without
looking at the code. If it does not come out, or two come out, not shippable: the UI is
correct but forgettable.
Mobile collapse guaranteed (w-full px-4, max-w-7xl mx-auto); zero horizontal scroll.
Full-height with min-h-[100dvh], not h-screen.
Loading / empty / error states present.
Animations under prefers-reduced-motion, content visible by default, only
transform/opacity, in the lightest possible tier.
Animation useEffect has cleanup; perpetual ones isolated and memoized.
Everything re-tokenized to the CLIENT brand (no component-system default).
Source/license of any template or component recorded in the project.
Limitations
It gives design discipline, not guaranteed conversion: the brief and the client's content
rule. "Premium" wrongly applied to a product that asks for restraint is itself a tell.
The values (fonts, patterns) are 2026 defaults; check them against the brand and the
project's a11y before locking them in.
1---2name: antislop-web3description: Use when building or reviewing any web UI so it does NOT look AI-generated. A bias-correction engine: bans the AI tells (Inter, neon purple, pure black, three identical cards, 'Elevate/Seamless', John Doe), sets VARIANCE/MOTION/DENSITY dials, forces required states (loading/empty/error) and performance guardrails, and requires one signature element. Generates a DESIGN.md source of truth per project. Stack-agnostic; no third-party services, no MCP.4license: MIT5---67# Anti-Slop Web — so nothing you ship looks AI-generated89Single goal: **remove the "AI tells"** that give away a generated UI. The problem with10vibe-coded interfaces is not that they fail to work, it is that they look generic (Inter11font, neon purple, three identical cards, "Elevate your workflow", John Doe). This skill12forces deterministic, premium decisions BEFORE you generate, and verifies them at the end.1314It is not magic from any vendor: five bias-correction levers, all native to whatever stack15you already use, zero MCP and zero external service.1617## When to use it1819- At the start of a design phase: generate the project `DESIGN.md` (Part A) before writing20 components.21- While building or refactoring any screen/section: apply the directives (Part B) as22 generation rules.23- In your quality/a11y gate before commit: run the pre-flight (Part C).2425## When NOT to use it2627- It does not replace the client's brand. The `DESIGN.md` it generates is re-tokenized to28 the client's palette/typography. This skill gives the DISCIPLINE (what to ban, what to29 force); the client gives the BRAND.30- It does not replace your gates. It complements a11y checks, security/code review before31 commit, and your dependency manifest.3233## Stack integration (how it runs)3435This skill is stack-agnostic. Wherever it names a tool, treat it as an example and map it36to your stack:3738- **Animation, lightest tier that achieves the effect:** CSS-only (e.g. `tw-animate-css`,39 0 JS) -> native scroll-reveal (`animation-timeline: view()`) -> a JS animation lib40 (e.g. Framer Motion) -> a scroll library (e.g. GSAP ScrollTrigger) -> canvas/WebGL41 (Three.js). Never add a library that duplicates a tier you already have.42- **Components:** a customized component system (never the untouched default) plus animated43 components only for punctuated motion (ingredient, not product).44- **Icons:** a single consistent icon set (e.g. Phosphor, Radix). Never emojis. Never the45 generic "egg" SVG or the default user-icon as an avatar.46- **Re-tokenization is mandatory:** every output is carried to the client's brand. A client47 should never be able to trace their site back to a template or a recognizable default.4849---5051# PART A — DESIGN.md generator (per-project source of truth)5253Generate a `DESIGN.md` at the project root. It is the single source of truth for visual54identity and bans. Every component is generated against this file.5556## A.1 Dials (translate "make it nice" into rules)5758Set three values 1-10. Suggested baseline: **VARIANCE 7, MOTION 5, DENSITY 4** (tuned for59conversion and a11y over showing off). Adjust to the brief, not the other way around.6061- **VARIANCE** (symmetry 1 <-> artistic chaos 10): controls layout. >4 bans centered heroes62 (forces split/asymmetric).63- **MOTION** (static 1 <-> cinematic choreography 10): >5 enables perpetual micro-interactions64 and spring physics. Always under `prefers-reduced-motion`.65- **DENSITY** (airy gallery 1 <-> data cockpit 10): >7 bans generic cards (use `border-t`/66 `divide-y`/negative space) and forces monospace on numbers.6768## A.2 Palette (color bans)6970Each color: **descriptive name + hex + functional role**.7172- One accent maximum. Saturation < 80%.73- BAN "AI purple/blue neon": no purple glows, no neon gradients.74- Absolute neutral bases (Zinc/Slate) + one singular high-contrast accent (Emerald, Electric75 Blue, Deep Rose, etc.). One palette; do not drift warm/cool.76- Never pure `#000000`: use off-black / Zinc-950 / charcoal.7778## A.3 Typography (font bans)7980- Display: tight tracking, controlled scale; hierarchy by weight and color, not giant size.81 No screaming H1s.82- Body: relaxed leading, max 65ch.83- BAN `Inter` for premium/creative contexts. Force character: `Geist`, `Outfit`,84 `Cabinet Grotesk`, `Satoshi`.85- Serif: banned in dashboards/software UI. If editorial and needed, only distinctive modern86 serifs (`Fraunces`, `Instrument Serif`, `Editorial New`).87- Dashboards: only sans pairs (`Geist` + `Geist Mono`, or `Satoshi` + `JetBrains Mono`).88- DENSITY > 7: all numbers in monospace.8990## A.4 Components (states and materiality)9192- Buttons: tactile feedback on `:active` (`-translate-y-[1px]` or `scale-[0.98]`). No outer93 glow. No custom cursors.94- Cards: only when elevation communicates hierarchy; tinted shadow toward the background. In95 high density, replace with `border-t` dividers or negative space.96- Inputs: label ABOVE, optional helper in markup, error BELOW. `gap-2`. Focus ring in the97 accent. No floating labels.98- Loaders: skeletons with the real layout dimensions. Never a generic circular spinner.99- Empty states: a composition that shows how to populate the data, not "No data".100- Error states: clear inline reporting.101102## A.5 Layout103104- No overlapping elements: each in its clean zone. No absolute stacking.105- VARIANCE > 4: centered hero BANNED -> 50/50 split, left-aligned + asset, or asymmetric106 whitespace.107- BAN "three identical cards in a row": use a 2-column zig-zag, an asymmetric grid, or108 horizontal scroll.109- CSS Grid over flex-math (`w-[calc(33%-1rem)]` banned). Contain with `max-w-[1400px]110 mx-auto` or `max-w-7xl`.111- Full-height: `min-h-[100dvh]`, NEVER `h-screen` (catastrophic jump in iOS Safari).112113## A.6 Responsive (non-negotiable)114115- Mobile-first collapse < 768px: every multi-column collapses to one. Zero horizontal scroll116 (critical failure).117- Headlines with `clamp()`. Body min `1rem`. Tap targets min 44px.118- Section gaps proportional: `clamp(3rem, 8vw, 6rem)`.119120## A.7 Motion (under the right tier)121122- Pick the lightest tier that works. Spring physics by default when a JS lib applies123 (`type:"spring", stiffness:100, damping:20`); no linear easing.124- Animate ONLY `transform` and `opacity`. Never `top/left/width/height`. Grain/noise only in125 `fixed pointer-events-none` pseudo-elements.126- Cascade reveals (stagger), do not mount lists all at once. Everything wrapped in127 `prefers-reduced-motion: no-preference` with content visible by default.128129## A.8 Anti-patterns (the AI tells — encode as "NEVER" in DESIGN.md)130131No emojis. No `Inter`. No generic serif. No `#000`. No glows/neon. No oversaturated accents.132No text gradient in big headers. No custom cursors. No overlaps. No three identical cards. No133generic names ("John Doe", "Acme", "Nexus"). No fake round numbers (`99.99%`, `50%`) ->134organic data (`47.2%`). No AI copy cliches ("Elevate", "Seamless", "Unleash", "Next-Gen") ->135concrete verbs. No broken Unsplash -> `picsum.photos/seed/<str>/800/600` or SVG avatars. No136filler ("Scroll to explore", bouncing chevrons).137138## A.9 Signature element (the one AFFIRMATIVE rule — mandatory)139140Everything above is prohibition: it stops the UI from looking generated. But a page can pass141EVERY ban and still be forgettable. Absence of tells is not the presence of character.142143**Each project declares ONE signature element**: the thing the page is remembered for, the144thing a visitor describes without saying "a landing page". Just one. Two signatures = none.145146Criteria (all three, or it is not a signature):147- **Memorable:** a visitor can describe it from memory a week later.148- **Owned:** it comes from the client's brand/business, not a catalog of effects. A149 `spotlight-border` added because it was on a list is NOT a signature; it is decoration.150- **Sustained:** it appears coherently (not one firework in the hero and nothing else).151152It can live in any layer, it does not have to be motion:153- **Motion/scene:** a scroll-scrub hero, kinetic type, a physical reveal.154- **Materiality:** an owned photo treatment, grain/print, an anomalous border or radius.155- **Typography:** a display face with character used structurally, not decoratively.156- **Data/content:** one real piece of the business presented as nobody else in the sector157 presents it (the best kind: it cannot be copied without the business).158- **Interaction:** one unique gesture that does something useful, not a trick.159160Guard: the signature is declared BEFORE building (it goes in `DESIGN.md`) and verified in the161pre-flight. If you cannot name it in one sentence, it does not exist. If it contradicts the162brief (a product that asks for restraint), the signature IS the restraint executed with rigor163-- say so explicitly.164165## A.10 Output template (DESIGN.md)166167```markdown168# Design System: [Project] — Client [X]169170## 0. Dials171VARIANCE: n | MOTION: n | DENSITY: n (baseline 7/5/4)172173## 1. Atmosphere174[Mood, density, variance and motion in evocative but precise language.]175176## 1b. Signature element (mandatory, exactly one)177**[Name in one sentence]** — [what it is, which layer it lives in (motion/materiality/178typography/data/interaction), and WHY it comes from this business and not a catalog.]179Sustained in: [where it recurs across the site].180181## 2. Palette and roles182- **[Name]** (#XXXXXX) — [role] (max 1 accent, sat < 80%, no neon, no #000)183184## 3. Typography185- Display: [font] — tight tracking, hierarchy by weight186- Body: [font] — relaxed leading, 65ch187- Mono: [font] — numbers/metadata188- Banned: Inter (premium), serif in dashboards189190## 4. Components191[Buttons / cards / inputs / loaders / empty / error — shape, shadow, states]192193## 5. Layout194[Grid-first, asymmetric splits, collapse < 768px, max-width, min-h-[100dvh]]195196## 6. Motion197[Chosen tier, spring, stagger, prefers-reduced-motion, transform/opacity only]198199## 7. Anti-patterns (BANNED)200[Explicit list from A.8, adapted to the client]201```202203---204205# PART B — Engineering directives (bias correction while generating code)206207Rules for writing real components. See `reference/design-vocabulary.md` for the Tailwind208"how".2092101. **Verify dependencies [mandatory]:** before importing any library (animation lib, icons,211 etc.) check the manifest (`package.json`). If missing, emit the install command. Never212 assume it exists. Respect the framework/tailwind version lock (no v4 syntax in a v3213 project).2142. **Server-first, isolated interactivity:** static layout as server components. Every215 animation/global state lives in a client leaf. Global state only to avoid deep prop216 drilling, not arbitrarily.2173. **Deterministic typography:** display `text-4xl md:text-6xl tracking-tighter leading-none`;218 body `text-base leading-relaxed max-w-[65ch]` in a secondary color.2194. **Performance:** animate only `transform`/`opacity`; `will-change` sparingly; z-index only220 for systemic contexts (sticky navbars, modals, overlays), no `z-50` spam. Perpetual221 animations memoized and isolated in their own tiny client component; never re-render the222 parent.2235. **Credible data (anti "Jane Doe"):** realistic contextual names, credible avatars (stable224 placeholder photo or owned styling), organic numbers.2256. **External resources:** a customized component system ALWAYS (radii, colors, shadows);226 `picsum.photos` or SVG instead of Unsplash; icons with one consistent global `strokeWidth`227 (1.5 or 2.0).2287. **Creative arsenal (avoid the generic default):** when the brief asks for character, reach229 for premium patterns -- asymmetric hero with image fade, bento 2.0, magnetic button,230 split-screen scroll, kinetic type, spotlight-border card, sticky scroll stack. Hard rule:231 never mix a scroll/canvas library and a UI animation library in the same component tree;232 isolate the heavy one with strict cleanup in `useEffect`.233234---235236# PART C — Pre-flight (hooks into your quality/a11y gate before commit)237238Before calling a UI done, verify. Any failure = not shippable until fixed.239240- [ ] Zero A.8 AI tells (font, color, layout, copy, data, images).241- [ ] **Signature element (A.9) present, single, sustained.** Name it in one sentence without242 looking at the code. If it does not come out, or two come out, not shippable: the UI is243 correct but forgettable.244- [ ] Mobile collapse guaranteed (`w-full px-4`, `max-w-7xl mx-auto`); zero horizontal scroll.245- [ ] Full-height with `min-h-[100dvh]`, not `h-screen`.246- [ ] Loading / empty / error states present.247- [ ] Animations under `prefers-reduced-motion`, content visible by default, only248 `transform`/`opacity`, in the lightest possible tier.249- [ ] Animation `useEffect` has cleanup; perpetual ones isolated and memoized.250- [ ] Everything re-tokenized to the CLIENT brand (no component-system default).251- [ ] Source/license of any template or component recorded in the project.252253## Limitations254255- It gives design discipline, not guaranteed conversion: the brief and the client's content256 rule. "Premium" wrongly applied to a product that asks for restraint is itself a tell.257- The values (fonts, patterns) are 2026 defaults; check them against the brand and the258 project's a11y before locking them in.
Run npx skillmds@latest add jhuse25/antislop-web in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Use when building or reviewing any web UI so it does NOT look AI-generated. A bias-correction engine: bans the AI tells (Inter, neon purple, pure black, three identical cards, 'Elevate/Seamless', John Doe), sets VARIANCE/MOTION/DENSITY dials, forces required states (loading/empty/error) and performance guardrails, and requires one signature element. Generates a DESIGN.md source of truth per project. Stack-agnostic; no third-party services, no MCP. It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under MIT.
jhuse25 (@jhuse25) published this skill. Their other Agent Skills are listed on their SkillMD profile.