Communitygithub.com

molveau/anti-slop

Removes the AI-generated look from a UI and gives it a direction of its own. Use when a screen, landing page or dashboard looks vibe-coded or generic (purple gradients, gradient text, emoji labels, glow, eyebrow pills, Inter everywhere, buzzword copy, uneven spacing), when the user asks to unslop, de-AI or make a page stop looking generated, and before shipping any UI to check the 20 tells. Includes a zero-dependency detector script and a ratchet-test recipe.

What is anti-slop?

anti-slop is a Claude Code agent skill that removes the AI-generated look from a UI and gives it a direction of its own. Use when a screen, landing page or dashboard looks vibe-coded or generic (purple gradients, gradient text, emoji labels, glow, eyebrow pills, Inter everywhere, buzzword copy, uneven spacing), when the user asks to unslop, de-AI or make a page stop looking generated, and before shipping any UI to check the 20 tells. Includes a zero-dependency detector script and a ratchet-test recipe.

Works with✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/molveau/skills/tree/main/skills/anti-slop

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

What does anti-slop do?

Vibe-coded UI fails in the same predictable ways. This skill merges three things into one workflow: the pass-by-pass method from unslop, the art-direction machinery from taste-skill, and a list of 20 dated tells with a script that catches the mechanical ones.

Credits and licenses

  • The method is adapted from unslop by Damir Sokolovsky (https://github.com/heydamir/unslop), licensed CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Adapted: condensed and merged with taste-skill by Leonxlnx and Molveau's tells in references/playbook.md. Keep this credit in any copy or adaptation. The original is vendored unmodified in references/vendor/unslop/.
  • The art-direction run, house rules and inspector come from taste-skill by Leonxlnx (https://github.com/Leonxlnx/taste-skill), MIT, vendored unmodified in references/vendor/taste/.
  • The 20-tells list and scripts/detect-tells.mjs are Molveau's own (MIT).
  • scripts/story.mjs is adapted from unslop's renderer (CC BY 4.0, changes listed in its header); it stays CC BY 4.0, as does scripts/story-server.mjs, its local server. scripts/story-contrast.mjs is Molveau's own (MIT).

Start here

Read references/playbook.md first, starting with its "Do this first" block; open vendor files only for depth or worked examples. The playbook is the merged doctrine (direction, passes, copy, spacing, colour, type, icons, details, data, app screens, imagery, motion, checks) with source tags and the calls made where the sources disagree. The "When to read what" table below is the depth index.

Overlap: this is the AI-look pass. The ui skill's critique rows are the lighter general design review, and design-grill is the deep multi-lens audit; use them for design quality beyond the tells.

Direction gate

Do this before any code for a new page or screen and as step 3 of every heavy-slop run, even when the request is one line or says to just do it. The rest of this skill removes mistakes; it does not give a screen character. Skipped, the result is the median page every model makes: right in the details, owned by nobody.

  1. Five lines. Product: what it does, for whom. Character: two or three concrete words (calm, exact, a little warm), never clean, modern, sleek, minimal or premium. World: the place or material the product belongs to; it tints the neutrals and sets the accent. Moments: the one or two places that get rich colour and detail. Signature: one small detail only this product has, used consistently. A moment is drawn with care, not just cleaned: a chart redrawn for what it must say (smooth lines, a mirrored comparison, a real scale), or the product's own object rendered with weight and light.
  2. Inventory, then the idea. List 8 to 12 things no competitor shares (name, street, numbers in the brief, materials, tools, rituals, documents the trade prints). Write: "On this screen, [one item] becomes [the device]". That device is the moment.
  3. Refuse the second-order defaults unless the brand already owns them. They are what a model reaches for once the obvious tells are banned:
    • a cream, stone or warm off-white page with a burnt orange, terracotta, sage or forest accent, with or without a serif headline (the "paper and ink" look is the new default, not a direction);
    • Fraunces, Instrument Serif, Playfair or Georgia as the headline face by reflex; system-ui as the only face;
    • Inter or Geist on white with one indigo or blue accent;
    • hero, three features, testimonials, call to action, in that order, with no argument for it; on an app screen, four equal stat cards over a bar chart;
    • a centred eyebrow, headline and two buttons as the whole first screen.
  4. Swap test. Replace the name and the trade with a competitor's. If the screen still fits, change the claim, the moment and the signature, and test again.
  5. Show and wait. Show the five lines and the idea, and wait for the owner. If you cannot ask (the user said to just build it, or you run without a person), write them as a comment at the top of the main file and build exactly that.

Depth: anti-slop playbook §2 (direction) and §12 (app screens); the design-inspiration-index skill for real references.

The core idea

Slop spreads color and effects over the chrome: backgrounds, buttons, borders, labels. Craft keeps the chrome quiet and puts the richness into one or two moments of content that people remember. Removing slop is half the job; a clean screen that could belong to any product is the next template. Every run ends with a screen only this product could have.

Order of work

  1. Page from scratch or deep redesign? Follow taste-skill's run (references/vendor/taste/taste-skill.md) with the playbook's overrides. App screens: playbook §12.
  2. Look at the screen, rendered if you can, not only the code.
  3. Audit against the signs list (references/vendor/unslop/unslop/references/signs.md) and the 20 tells (references/tells.md). One line per sign, with where it lives.
  4. Size the job (heavy, light, no slop) and write the direction, then wait for the owner (playbook §1 and §2).
  5. Fix in nine passes, each across the whole screen: spacing, color, icons, copy, type, layout, details, visuals, motion (playbook §3 to §14).
  6. Check with the playbook checklist, run the detector, compare with the audit (playbook §15).
  7. Report the direction, a few lines per pass, and every claim you removed or could not verify.

The 20 tells

Full table with replacements: references/tells.md. Summary, with what the script catches:

#TellScript
1Violet/fuchsia/indigo gradientyes
2Gradient textyes
3Emoji in copyyes
4Inter or Space Grotesk everywhereno
5Colored side-stripe borderyes
6Decorative glassmorphismyes
7Low-contrast dark modeno
8Three icon boxes in a rowno
9Eyebrow pill above the headlineno
10Lucide by defaultyes
11Untouched shadcn/uino
12Fade-in on scrollyes
13Cursor-following glowno
14Hover fade on buttonsyes
15Inconsistent spacingno
16Em dashes in copyyes
17Buzzword copyyes
18Serif italic accent wordsno
19Space Grotesk with its usual display-serif partner (pair in references/tells.md)yes
20Grain over a gradientno

The detector

node <skill folder>/scripts/detect-tells.mjs [--json] [--include-tests] <paths...>

Zero dependencies, Node 20 or newer, no imports outside this skill folder, so it works when the skill is installed alone. Exit 0 clean, 1 findings, 2 usage. It skips node_modules .git .next dist build .open-next coverage and test files. It reports path:line #tell label match. Limits are listed at the end of references/tells.md; treat a hit as "look here".

Ratchet test in a project

A ratchet pins today's count and fails when it goes up, so the tells can only shrink. Sketch for node:test (adapt the paths and the baseline):

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { readFileSync, globSync } from 'node:fs'; // globSync needs Node 22; on 20 walk the folders yourself
import { detectTells } from './.agents/skills/anti-slop/scripts/detect-tells.mjs';

const BASELINE = { 10: 8, 5: 1 }; // tell number -> allowed findings today
test('no new vibe-coded tells', () => {
  const files = globSync('{app,components}/**/*.{ts,tsx,css}').map((path) => ({ path, text: readFileSync(path, 'utf8') }));
  const now = {};
  for (const f of detectTells(files)) now[f.tell] = (now[f.tell] ?? 0) + 1;
  for (const [tell, n] of Object.entries(now)) assert.ok(n <= (BASELINE[tell] ?? 0), `tell ${tell}: ${n} findings, baseline ${BASELINE[tell] ?? 0}`);
});

Lower the baseline whenever you fix one; never raise it.

Story video

A square clip, about 10 seconds, where the screen unslops itself step by step with redlines. Make it only when asked. Build the story file exactly as unslop's "Story video" section says (references/vendor/unslop/unslop.md: one story.html, .s1 to .s5 CSS on top, data-gap, data-radius, data-slop, swaps), then render it with this skill's adapted renderer:

node <skill folder>/scripts/story.mjs unslop-story/story.html unslop-story.mp4   # --wide for 16:9, --play to watch

What it adds to unslop's renderer:

  • An Accessibility step. A step whose name contains Accessibility shows live measurements. Put data-contrast on two to four text elements whose contrast changes; each shows its WCAG ratio, red under 4.5:1 (3:1 for large text), white with AA once it passes, grey ? when a colour cannot be read (such as lab() or color(display-p3 ...)): use sRGB, hex or oklch() colours on those elements. Put data-target on one or two controls; each shows its size, red under 24 by 24 px. Choose elements that fail in the before; never mark an element that still fails in the after.
  • A caption, <meta name="story-caption" content="...">, bottom left. State only what is true of the run, such as the model and that the screen was not edited by hand.
  • The credit molveau/skills · unslop method by @heydamir is drawn on every frame, as the CC BY 4.0 licence of unslop asks. Do not remove it.

The story is a presentation of real files: step 0 is the before as it was, and the last step equals the clean file you ship. Do not polish the story beyond the shipped screen.

When to read what

NeedRead
The merged rules, values and conflict callsreferences/playbook.md
The 20 tells with replacements and the detector's limitsreferences/tells.md
unslop's full method, direction, nine passes, checklist, story videoreferences/vendor/unslop/unslop.md
Exact values (spacing, type scale, ramps, motion curves)references/vendor/unslop/unslop/references/tokens.md (its motion values are superseded: ui playbook §10 and motion §5 win, playbook conflict 19)
The audit list of signsreferences/vendor/unslop/unslop/references/signs.md
Hero visuals, image prompts, which styles workreferences/vendor/unslop/unslop/references/visuals.md
Glyph, halftone, dither and duotone codereferences/vendor/unslop/unslop/references/effects.md
Finished reference screens (images)references/vendor/unslop/unslop/references/refs.md
Snapshot a live URL to work on a copyreferences/vendor/unslop/unslop/scripts/snapshot.mjs
A page from scratch or a deep redesign: inventory, dealt direction, idea, house rules, gatereferences/vendor/taste/taste-skill.md
Dashboards, admin and settings screens in depthreferences/vendor/taste/taste-skill/references/app-screens.md
Copy deck, two-line arithmetic, proof without inventing itreferences/vendor/taste/taste-skill/references/copy.md
Type scale, display setting, font loadingreferences/vendor/taste/taste-skill/references/type.md
Palette roles, fields, dark pages, contrastreferences/vendor/taste/taste-skill/references/colour.md
Margins, empty space, the frame, sections, the phonereferences/vendor/taste/taste-skill/references/layout.md
Finding, crediting, placing and treating pictures and videoreferences/vendor/taste/taste-skill/references/imagery.md
Motion recipes (opt-in: motion playbook §9) and scroll scenesreferences/vendor/taste/taste-skill/references/motion.md, references/vendor/taste/taste-skill/references/scenes.md
Judging a result with a rubricreferences/vendor/taste/taste-skill/references/critique.md
The dated tells registry by wavereferences/vendor/taste/taste-skill/references/tells.md
The study behind taste's numbersreferences/vendor/taste/taste-skill/references/research.md

The vendored files keep their upstream layout, so a few relative links inside them may not resolve here. taste-skill's scripts read its library/ folder (do not read it whole; run draw.mjs); some scripts need Node 22, a browser, Playwright, ffmpeg or network access. Which visual checks to run is decided in the ui playbook, conflict 14 (this playbook's conflict 14 points there).

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

molveau/design-inspiration-index

Routing index for design inspiration. Use when you need visual references or ideas for a UI (a hero, landing page, SaaS page, navbar, CTA, motion or micro-interaction, brand or rebrand, component, icon) and want to know which curated gallery to pull from. Maps a need to the best source among galleries, component registries and optional MCP servers. Use it before hunting blindly for inspiration.

molveau/ui

Builds, restyles, polishes and reviews user interfaces with taste. Use when building, restyling or improving a UI, page, screen or component, including a hero, navbar, header, cards, a form or a section ("make it better", "make it pop", "add polish"); working on layout, spacing, typography, color, dark mode or design tokens; polishing hover and focus states or details when something "feels off"; responsive or mobile layout; critiquing, auditing or redesigning an interface; doing a design review or UI roast; simplifying or making a design bolder; or writing prompts that get production-grade UI out of an AI tool.

molveau/vitrine

Playbook for a vitrine, a business showcase / brochure site for a local business. Use at the start of a small business website, brochure site, landing page for a local business, service-business site, or when adding pricing, booking, city pages, local SEO, bilingual FR/EN or a Québec privacy setup to one. Says what such a site needs, in which order to apply the ui, ux, anti-slop, motion, french-typography and loi-25-website skills, and gives a done checklist.

Related Skills