Danielle Hoopes8 pieces · 8 min
Vibe Check: The Linter That Catches AI Slop Before It Ships
Tags: ai, developer-tools, typescript, linting, code-quality, cli, open-source
If you've been using AI coding assistants like Claude, GitHub Copilot, or ChatGPT to write code, you've probably noticed a pattern: the code works, but something feels off.
Maybe it's the any types sprinkled everywhere. Or the comments that just repeat what the code does. Or variable names like data, result, and temp that tell you nothing.
This is AI slop—code that technically functions but violates the craftsmanship that makes codebases maintainable.
I built vibe-check to catch it before it ships.
01 / 08 · 1 min
What is AI Slop?
AI slop is the coding equivalent of fast food—it fills the gap, but it's not good for you long-term.
When AI generates code, it optimizes for:
- Getting something that works (not something maintainable)
- Completing the request quickly (not thinking through edge cases)
- Using common patterns (even when they're lazy patterns)
The result? Code that passes your tests but makes your tech debt compound.
Real Examples of AI Slop
// AI loves this (bad)
function processData(data: any): any {
const result = data.map((item: any) => item.value);
return result;
}
// What you actually want (good)
function extractValues(users: User[]): string[] {
return users.map(user => user.email);
}// AI-generated comment (useless)
// This function processes the data
function processData() { ... }
// Useful comment
// Filters inactive users and sorts by last login for the admin dashboard
function getRecentActiveUsers() { ... }02 / 08 · 1 min
What vibe-check Catches
vibe-check scans your TypeScript/JavaScript codebase for the most common AI slop patterns:
1. any Types
The laziest type annotation. AI loves it because it makes everything "work."
// Caught by vibe-check
function handleResponse(data: any) { ... }
const result: any = fetchData();2. Lazy Comments
Comments that just describe what the code does (which you can already see).
// Caught by vibe-check
// Loop through the array
for (const item of items) { ... }
// Increment counter
counter++;3. Generic Variable Names
Names like data, result, temp, value, item that convey no meaning.
// Caught by vibe-check
const data = fetchUsers();
const result = data.filter(d => d.active);
const temp = result.map(r => r.name);4. Console Spam
console.log statements left in production code.
// Caught by vibe-check
console.log('here');
console.log(data);
console.log('debugging');5. Empty Catch Blocks
Silently swallowing errors—a classic AI move.
// Caught by vibe-check
try {
await riskyOperation();
} catch (e) {
// AI: "I'll just leave this empty"
}03 / 08 · 1 min
Installation & Usage
Option 1: VS Code Extension (Recommended)
The easiest way to use vibe-check is with the VS Code extension:
- Download vibe-check.vsix
- In VS Code:
Cmd+Shift+P→ "Extensions: Install from VSIX" - Select the downloaded file
Features:
- Inline squiggles on violations (like ESLint)
- Vibe score in status bar (🔥 90+ / ✨ 70+ / 😐 50+ / 💀 <50)
- Runs automatically on save
- No terminal required
Option 2: CLI
Install globally via npm:
npm install -g vibe-checkRun on your project
# Check current directory
vibe-check
# Check specific directory
vibe-check ./src
# Check specific file
vibe-check ./src/utils/helpers.tsOutput
vibe-check gives you a clear report:
vibe-check v1.0.0
Scanning ./src...
src/api/handlers.ts:15 - any type detected
src/api/handlers.ts:23 - generic variable name: data
src/utils/helpers.ts:8 - lazy comment: "// Loop through items"
src/utils/helpers.ts:42 - empty catch block
src/components/Dashboard.tsx:156 - console.log detected
Found 5 issues in 3 files
04 / 08 · 1 min
Configuration
Create a .vibecheck.json in your project root to customize:
{
"rules": {
"any-types": true,
"lazy-comments": true,
"generic-names": true,
"console-logs": true,
"empty-catches": true
},
"ignore": [
"node_modules",
"dist",
"**/*.test.ts",
"**/*.spec.ts"
],
"allowedGenerics": ["item", "index"]
}Rule-by-rule control
Disable specific rules if they don't fit your codebase:
{
"rules": {
"console-logs": false
}
}05 / 08 · 1 min
CI/CD Integration
Add vibe-check to your pipeline to prevent AI slop from getting merged.
GitHub Actions
name: Code Quality
on: [push, pull_request]
jobs:
vibe-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm install -g vibe-check
- run: vibe-check ./src --ciThe --ci flag returns exit code 1 if any issues are found, failing the build.
Self-Hosted CI Runners
For faster builds and more control, consider running your CI on DigitalOcean droplets. A $6/month droplet can handle most vibe-check workloads, and you get consistent performance without GitHub Actions queue times.
Pre-commit Hook
# .husky/pre-commit
npx vibe-check --staged06 / 08 · 1 min
Why I Built This
I use AI coding assistants every day. They're incredible productivity boosters.
But I noticed a pattern: I'd accept AI suggestions, then spend time cleaning them up. The same cleanup, over and over:
- Adding proper types
- Renaming vague variables
- Removing debug statements
- Writing meaningful comments
vibe-check automates that code review. It's not replacing ESLint or TypeScript's compiler—it's catching the patterns that slip through those tools but still hurt code quality.
Think of it as Grammarly for AI-generated code.
07 / 08 · 1 min
Try It Out
npm install -g vibe-check
cd your-project
vibe-checkOr check out the live demo to paste code directly and see what it catches.
08 / 08 · 1 min
Support the Project
If vibe-check saves you time cleaning up AI-generated code, consider buying me a coffee. It helps fund more open-source developer tools. vibe-check is open source under MIT. PRs welcome—especially for new slop patterns to catch. Source: hereshecodes.app by Danielle Hoopes