Source: wiki synthesis: Anti-AI Slop Guide, Hallmark, unslop-ui
Three wiki articles independently solve the same problem — LLM-generated UI reading as obviously AI-made — with three different mechanisms, and none of them cite all three together. anti-ai-slop-guide.md is a hand-curated prescriptive reference. Hallmark is a generative refusal layer built into Claude Code and Cursor. unslop-ui is a data-mined detection scanner with an exit code CI can fail on. Read together, they aren’t redundant takes on the same list — they’re three layers of a defense-in-depth pipeline, and the fact that they converged independently on nearly the same “top offenders” is itself worth documenting.
Key Takeaways
- Same target, three different points in the pipeline. The guide operates at review/reference time — a checklist consulted before or after building. Hallmark operates at generation time — structural decisions get made differently from the start.
unslop-uioperates at verification time — a scanner with an exit code that can fail a CI build on high-severity findings. - Three unrelated methodologies named nearly the same offenders. The guide’s hand-curated table (drawn from 23 design skills), Hallmark’s five “refused AI tells,” and
unslop-ui’s Reddit-frequency-ranked top tells (mined from ~3.2 million posts across 47 subreddits) all separately flag: purple-to-blue gradients, default/Inter-style fonts, centered symmetry, and the three-equal-card / generic-feature-card layout as top offenders. One is opinion-curated, one is a single skill author’s refusal rules, one is mined from what people actually complain about — three independent processes landing on the same four patterns is real corroboration that this taxonomy is not one person’s taste. - None of the three substitute for the other two. A prescriptive guide doesn’t stop a generation from producing the pattern in the first place. A generative refusal layer (Hallmark) doesn’t catch drift introduced by a different tool, a human edit, or a dependency update after the fact. A scanner (
unslop-ui) tells you that something is wrong but not why it’s a bad choice for this project’s genre — that’s the guide’s job. - The natural stack order is prescribe → generate → detect. Internalize the taxonomy (guide), build with a tool that refuses the defaults by construction (Hallmark), gate the build with a scanner that catches what slipped through (
unslop-ui, wired into CI). - Their blind spots differ, which is exactly why stacking beats using either alone. Hallmark’s rules are author-curated judgment calls about what counts as “AI-shaped.”
unslop-ui’s weights are usage-frequency-curated and deliberately silent on patterns the data shows nobody minds — mesh/aurora backgrounds, bento grids, and glassmorphism are explicitly not flagged byunslop-ui“because the data does not show people minding them.” - This is a general software-quality shape applied to an aesthetic problem that doesn’t normally get one. Prescriptive-reference + generative-refusal + empirical-detection is the same three-layer pattern as style-guide docs + a linter’s default config + a CI gate — applied here to “does this look AI-generated” instead of “does this compile cleanly.”
The Convergence Table
| Pattern | Anti-AI Slop Guide (hand-curated, 23 skills) | Hallmark (5 refused tells) | unslop-ui (Reddit-ranked, ~3.2M posts) |
|---|---|---|---|
| Purple / purple-to-blue gradients | Banned — “the #1 AI aesthetic fingerprint” | Refused tell #1 | Top-weighted tell |
| Default sans font (Inter, Roboto, etc.) | Banned — “default of defaults” | Refused tell #2 (mandates display/body type pairing) | Top-weighted tell |
| Centered symmetry | Banned — “reads as timid, lacking confidence” | Refused tell #3 | Rolled into layout tells |
| Generic feature-card grid / 3 equal-width cards | Banned — “the single most common AI layout” | Refused tell #4 — “the universal template” | Top-weighted tell (shadcn/Tailwind default + centered-hero-plus-three-cards) |
| Default top-nav (wordmark-left, 4-link-center, CTA-right) | Not separately named | Refused tell #5 | Not separately named |
| Glassmorphism | Banned — “AI uses glass as a default surface” | Not addressed | Explicitly not flagged — data shows no complaints |
Where They Disagree
The one clean disagreement in the table above is worth naming rather than smoothing over: the guide bans glassmorphism outright (“reserve glass for one or two accent elements max”), while unslop-ui’s dataset says people don’t actually complain about it, so it stays unflagged. That’s a genuine empirical check on the guide’s priors — a hand-curated rule that a frequency-weighted dataset doesn’t corroborate. It doesn’t mean the guide is wrong (glassmorphism may still be poor practice for other reasons), but it’s a concrete case where the detection layer’s data and the prescriptive layer’s judgment point in different directions, and anyone stacking all three should know that going in. ^[inferred]
Try It
- Read the guide once, front to back. Internalize the “why” behind each banned pattern in the Do-This-Instead column, not just the pattern names — that’s what makes the other two layers useful instead of just restrictive.
- Install Hallmark (
npx skills add nutlope/hallmark) into whatever you build UI with day to day, so the defaults you generate are already refusing the top tells before you ever get to review. - Wire the scanner into CI:
python3 devibe_scan.py ./src --severity highas a merge gate. This is the layer that catches drift from sources the first two don’t cover — a different tool, a human contributor, a dependency-driven redesign. - When the scanner flags something, fix it with the guide’s logic, not just by deleting the flagged element. The guide’s “Do This Instead” column is what turns a scanner finding into an actual design decision.
- Re-check the glassmorphism disagreement periodically. If
unslop-ui’s dataset shifts (more recent Reddit sentiment) or the guide gets refreshed, see whether the two converge or stay split — it’s a live signal, not a settled one.