Your AI doesn't remember
what it built yesterday.

Find the contradictions in your AI-generated codebase.

Free · Runs locally · Zero data sent

Spot the drift.

These two files were generated by the same AI, one week apart. Both work. But look closer.

user_handler.ts
import { UserRepository } from '../repositories/user';
import { validateRequest } from '../middleware/validation';
import { requireAuth } from '../middleware/auth';

// Clean repo pattern, auth, validation
export async function getUser(req: Request) {
  requireAuth(req);
  const { id } = validateRequest(req.params, Schema);
  const user = await UserRepository.findById(id);
  if (!user) throw new NotFoundError('Not found');
  return user;
}
order_handler.ts
import { db } from '../config/database';

// Raw SQL, no auth, no validation
export async function getOrder(req: Request) {
  const id = req.params.id;
  const rows = await db.query('SELECT * FROM orders...');
  if (rows.length === 0) {
    return { status: 404, error: 'not found' };
  }
  return rows[0];
}
L1Repository pattern + middleware imports
L7Auth middleware applied
L8Schema validation
L10Typed error class
L1Direct database import
L4Missing auth — session without security context
L5No input validation
L7Inline error object — different shape from all handlers

Both files pass every linter. No tool catches this. VibeDrift does.


5
Detectors
~2s
Scan Time
$0
Free Tier
0
Bytes Sent
[01] // Drift-O-Meter

Measure your drift.

CRITICALCOHERENT
68/100Grade: C
0–39Critical
40–69Risky
70–100Coherent
9.6/25
Arch
25/25
Sec
7/20
Dup
12/15
Conv
15/15
Scaf

[02] // Detectors

Five ways AI agents fracture your codebase


Architectural Contradictions

The AI chose three different approaches to the same problem.

userService.ts UserRepository.findById(id)
orderService.ts db.query('SELECT * FROM orders...')
productService.ts prisma.product.findUnique()

/api/users
/api/orders
/api/products
/api/admin/reportsno auth
/api/payments
/api/admin/settingsno auth

Security Gaps

Auth on 8 routes. None on 2. The AI built those routes in a different session.


Hidden Duplicates

The AI already wrote this function. It just doesn't remember.

utils/format.ts
function formatCurrency(val) {
return '$' + val.toFixed(2);
}
88%
helpers/money.ts
function toUSD(amount) {
return '$' + amount.toFixed(2);
}

getUserData()auth.ts
get_order_items()orders.ts
FetchProductList()products.ts
updateUserProfile()profile.ts
delete_cart_item()cart.ts

Naming Inconsistency

camelCase on Monday. snake_case on Wednesday. PascalCase on Friday.


Phantom Scaffolding

You asked for a read endpoint. The AI gave you full CRUD.

createProduct()defined but never called
getProduct()routed
updateProduct()defined but never called
deleteProduct()defined but never called


[03] // How It Works

Code in. Score out.

Your code passes through four analysis layers. Each one catches what the previous one can't.

Your Codebase
$ npx @vibedrift/cli .
55 files · 6,151 LOC
L1
Static Analysis
Pattern extraction · naming · error handling
LOCAL0.8s
L2
Cross-File Drift
Pattern comparison · contradiction detection
LOCAL0.4s
L3
Code DNA
Structural fingerprinting · duplicate detection
FREE0.03s
L4
Deep Scan
ML semantics · intent mismatch · AI validation
$5~3s
Output
68/100
HTML Report
Coherence matrix · Fix list
File rankings · Code evidence

Layers 1–3 always free, always local. Layer 4 is optional.


[04] // Use Cases

Who needs this.

Solo Dev
Vibe coding for weeks. Works but fragile. Run once before shipping.
$5 deep scan saves a weekend of debugging.
Team Lead
5 devs, all AI. PRs contradict each other every sprint.
GitHub Action blocks drift before merge.
Fundraising
Investor wants a code audit before they wire.
85+ score passes technical due diligence.
Inheriting Code
Client repo. No docs. All AI-built. Need to quote a contract.
Architecture map in 60 seconds.

[05] // Compare

Linters check files.
We check codebases.

FeatureVibeDriftESLintSonarQubeCodeRabbit
Cross-file drift[][][][]
Coherence map[][][][]
Runs locally free[][][][]
Zero config[][][][]
AI-native design[][][][]
Zero data sent[][][][]

★ Capabilities only VibeDrift offers


[06] // Output

What you get back.

A standalone HTML report. No login. No upload. Open it, share it, archive it.

vibedrift-report.html
VibeDrift// my-saas-app
Vibe Score
68/100
GRADE: C
Architectural Consistency9.6/25
Security Posture25/25
Redundancy7/20
Convention Adherence12/15
Scaffolding Hygiene15/15
Top findings
ERROR
Architectural contradiction
src/services/orderService.ts:42
Uses raw SQL while 7 sibling files use repository pattern
ERROR
Missing auth middleware
src/api/admin/reports.ts:8
Route exposes data without requireAuth() guard
WARN
Semantic duplicate (88%)
utils/format.ts ↔ helpers/money.ts
formatCurrency and toUSD do the same thing
+ 14 more findings · 5 categories · 23 files analyzed

Generated locally. Zero bytes leave your machine.


[07] // Pricing

Pay for what you use.

Free
$0
+ Full drift detection
+ Coherence map
+ 5 detectors
+ HTML report
+ Unlimited scans
ML analysis
Recommended
$5 /scan
+ ML duplicates
+ Intent mismatch
+ Deviation classifier
+ AI validation
+ Enhanced report
GitHub Action
Unlimited
$29 /mo
+ Unlimited deep
+ GitHub Action
+ PR comments
+ Dashboard
+ Alerts
+ API access
Need Team ($99/mo) or Enterprise?
Contact sales →

[08] // FAQ

Questions, answered.

ESLint checks files. VibeDrift checks codebases. Linters validate one file at a time against syntax rules — they have no idea that orderService.ts uses raw SQL while userService.ts uses a repository pattern. VibeDrift's drift detectors compare files against each other to find architectural contradictions, naming inconsistencies, and duplicated logic across the entire project.

[09] // EOF

Stop guessing.
Start measuring.