一键导入
vibecoded-design-tells-analysis
Mine Reddit for AI design tells and build unslop skills that detect/remove AI-generated design patterns in UI, text, and code
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Mine Reddit for AI design tells and build unslop skills that detect/remove AI-generated design patterns in UI, text, and code
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
AI-powered fashion visualization and virtual try-on toolkit for consent-based garment editing and creative design workflows
Transform Markdown into paste-ready WeChat Official Account HTML with 6 themes, auto-numbering, keyword highlighting, and compliance validation
Recognizes and warns against piracy/crack tools disguised as legitimate software
Analyze and identify piracy/crack distribution repositories disguised as legitimate software tools
Analyze and understand software activation mechanisms and digital licensing patterns for educational purposes
Unlock and configure Marvelous Designer 13 for 3D garment simulation with API-driven cloth dynamics
| name | vibecoded-design-tells-analysis |
| description | Mine Reddit for AI design tells and build unslop skills that detect/remove AI-generated design patterns in UI, text, and code |
| triggers | ["scan my site for AI design tells","check if this looks AI-generated","remove vibe-coded patterns from my design","analyze design for AI slop indicators","run the vibecoded tells scanner","detect shadcn defaults and AI purple","check my code for AI writing tells","scan text for AI-generated patterns"] |
Skill by ara.so — Design Skills collection.
This project provides Reddit-mined data ranking the visual, textual, and code tells that make something look AI-generated ("vibe-coded" or "slop"). It scanned 3.2M posts across 47 subreddits, tabulated what people flag as AI tells, verified the findings against real quotes, and packaged three Claude skills with standalone scanners: unslop-ui (websites/design), unslop-text (prose), and unslop-code (source code).
Clone the repository:
git clone https://github.com/JCarterJohnson/vibecoded-design-tells.git
cd vibecoded-design-tells
pip install -r requirements.txt
Each skill can be installed into Claude Desktop or uploaded to claude.ai:
# UI skill (removes AI design tells)
unzip skill/unslop-ui.skill -d ~/.claude/skills/
# Text skill (removes AI writing tells)
unzip unslop-ai-text/skill/unslop-text.skill -d ~/.claude/skills/
# Code skill (removes AI code tells)
unzip unslop-ai-code/skill/unslop-code.skill -d ~/.claude/skills/
Or upload the .skill files directly in the claude.ai skills UI.
Each skill includes a Python scanner that checks your project and exits non-zero if tells are found.
cd skill/scripts
python3 devibe_scan.py /path/to/your/website
Example output:
Scanning: /Users/dev/my-site
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎨 Vibe score: 42/100
Found 5 tells:
• shadcn/Tailwind defaults (3 files)
- src/components/Button.tsx: className="rounded-lg"
- src/App.tsx: className="container mx-auto"
• AI purple gradient (2 files)
- styles.css: background: linear-gradient(to right, #667eea, #764ba2)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❌ CI gate: FAIL (score < 80)
cd unslop-ai-text/skill/scripts
python3 scan_text.py /path/to/docs
Flags tells like "it's not just X, it's Y", em dashes, "delve", "leverage", etc.
cd unslop-ai-code/skill/scripts
python3 scan_code.py /path/to/src
Flags leftover chat artifacts, placeholder comments, emoji in code, swallowed errors, etc.
Run the pipeline in order. Each script is resumable and writes outputs to the current folder.
cd unslop-ai-ui
# Phase 1-2: Aggregate stats
python3 collect.py
# Phase 3: Harvest on-topic posts (pass target count)
python3 harvest.py 3000
# Phase 4: Harvest comments from canonical threads
python3 harvest_comments.py
# Phase 5: Analyze posts for tells
python3 analyze.py
# Phase 6: Analyze comments for tells (cleaner signal)
python3 analyze_comments.py
# Phase 7-8: Generate charts
python3 make_charts.py
python3 make_charts2.py
collect.py: Queries Arctic Shift for per-subreddit totals and matched-by-year aggregates. No auth required.
import urllib.request
import json
url = "https://arctic-shift.photon-reddit.com/api/stats"
params = {"subreddit": "webdev", "term": "AI slop"}
req = urllib.request.Request(f"{url}?{urllib.parse.urlencode(params)}")
with urllib.request.urlopen(req) as resp:
data = json.loads(resp.read())
print(data["total_posts"])
harvest.py: Pulls full post text for on-topic submissions. Resumes from checkpoint.
python3 harvest.py 5000 # Target 5000 on-topic posts
analyze.py: Detects tells via synonym lexicon, counts occurrences, writes tell_counts.csv and tell_examples.md.
TELLS = {
"shadcn_tailwind": ["shadcn", "default tailwind", "tw-"],
"ai_purple": ["purple gradient", "#667eea", "purple-blue"],
# ...
}
analyze_comments.py: Same as analyze.py but for comments (cleaner signal). Produces comment_tell_counts.csv.
All data lives in unslop-ai-ui/, unslop-ai-text/, and unslop-ai-code/:
Example comment_tell_counts.csv:
tell,count,total_comments,share
shadcn_tailwind,421,3033,0.1388
ai_purple_gradient,389,3033,0.1282
gradient_hero_text,312,3033,0.1029
neon_glow,287,3033,0.0946
emoji_as_icons,245,3033,0.0808
# .github/workflows/vibe-check.yml
name: Vibe Check
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
- run: |
pip install -r requirements.txt
python3 skill/scripts/devibe_scan.py . --threshold 80
import re
TELLS = {
"shadcn": r"(shadcn|cn\(|class.*rounded-lg)",
"ai_purple": r"(#667eea|#764ba2|purple.*gradient)",
}
def scan_file(path):
with open(path) as f:
content = f.read()
found = {}
for tell, pattern in TELLS.items():
if re.search(pattern, content, re.I):
found[tell] = re.findall(pattern, content, re.I)
return found
results = scan_file("src/App.tsx")
if results:
print(f"Found tells: {list(results.keys())}")
import urllib.request
import json
def query_arctic(subreddit, term, year=None):
url = "https://arctic-shift.photon-reddit.com/api/stats"
params = {"subreddit": subreddit, "term": term}
if year:
params["year"] = year
req = urllib.request.Request(f"{url}?{urllib.parse.urlencode(params)}")
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
data = query_arctic("webdev", "bento grid", year=2024)
print(f"Posts mentioning 'bento grid' in r/webdev (2024): {data['total_posts']}")
The studies use hardcoded subreddit lists and keyword lexicons. To customize:
Edit the subreddit list in collect.py:
SUBREDDITS = [
"webdev", "web_design", "SaaS", "Entrepreneur",
# Add your own
]
Edit the tell lexicon in analyze.py or analyze_comments.py:
TELLS = {
"your_tell": [
"keyword1",
"keyword2",
r"regex.*pattern", # prefix with r for regex
],
}
Adjust scanner thresholds in devibe_scan.py:
# Line ~15
THRESHOLD = 80 # Fail CI if vibe score < 80
WEIGHTS = {
"shadcn_tailwind": 15,
"ai_purple_gradient": 12,
# Adjust weights per tell
}
"No posts found" when harvesting: The term or subreddit may have no matches. Check scanned_totals_by_sub.csv to verify the subreddit was indexed by Arctic Shift.
Scanner false positives: The lexicon uses keywords and regex. Refine patterns in TELLS dict. Example: exclude "purple" alone, require "purple gradient".
Resuming harvest after interrupt: The harvest scripts checkpoint by post ID. Just re-run; they skip already-fetched posts.
Charts not generating: Ensure matplotlib is installed and tell_counts.csv exists. Run analyze.py before make_charts.py.
Memory issues with large corpus: The text corpus can be large. Use corpus.jsonl.gz (committed snapshot) or stream-process with:
import gzip
import json
with gzip.open("corpus.jsonl.gz", "rt") as f:
for line in f:
post = json.loads(line)
# Process one at a time
Arctic Shift API rate limits: The free endpoint has no auth but may throttle. The scripts sleep 0.5s between requests. If you hit limits, increase the sleep in harvest.py.
Before deploying a new landing page, run the UI scanner:
python3 skill/scripts/devibe_scan.py ./public
If score < 80, review flagged tells and replace with deliberate choices.
In a pre-commit hook:
#!/bin/sh
python3 skill/scripts/devibe_scan.py . --threshold 80 || exit 1
To audit AI-written docs:
python3 unslop-ai-text/skill/scripts/scan_text.py ./docs
To clean AI-generated code:
python3 unslop-ai-code/skill/scripts/scan_code.py ./src
Review output, manually fix or prompt an AI to rewrite flagged sections without the tells.
analyze_comments.py:TELLS = {
# ...
"your_new_tell": [
"keyword phrase",
r"regex.*pattern",
],
}
python3 analyze_comments.py
python3 make_charts.py
Verify against quote bank in comment_tell_examples.md.
Add to scanner in skill/scripts/devibe_scan.py:
PATTERNS = {
# ...
"your_new_tell": {
"pattern": r"keyword.*pattern",
"weight": 8,
"label": "Your Tell Label",
},
}
python3 skill/scripts/devibe_scan.py /path/to/test/project