Skip to content

Move fast and keep things coherent.

VibeDrift spots drift in real time and steers your AI agent back to your codebase's own patterns, while it keeps writing at full speed.

Open source, MIT. Scans run on your machine, no account needed.

claude · api-coresession live
add a retry helper for the checkout call
●Write(src/lib/retry.ts)Wrote 18 lines
PostToolUse hook · vibedrift[vibedrift] flagged src/lib/retry.ts (DF-1): your exponentialBackoff (src/lib/retry.ts:1) duplicates exponentialBackoff (src/lib/backoff.ts:1), 1.00 similar; prefer importing it. Fix it, or record your call with respond_to_flag (accept / park / decline) and one reason; if that tool is unavailable, say the reason in your reply.
●That helper already exists in src/lib/backoff.ts. I'll import it instead of keeping a second copy.
●vibedrift - respond_to_flag (MCP)(findingId: "DF-1", decision: "accept", reason: "duplicate of backoff.ts; importing it")Recorded accept on DF-1.
●Update(src/lib/retry.ts)Removed 17 lines, added 1
VIBEDRIFT [FLAGGED] DF-1AGENT [ACCEPT] DF-1VIBEDRIFT [RESOLVED] DF-1 src/lib/retry.ts

Your agent, steered by your own code.

It advises and asks. It never blocks the edit.

  1. It asks first.

    Your agent can ask what already exists.

    vibedrift · find_similar_function
    ●A near-identical formatDate already exists in three files.
  2. Checked as it writes.

    Judged against the directory being edited.

    ●Write(src/lib/retry.ts)
    async stylereturn shapedata accessduplicates
  3. Told in the same turn.

    One line, through Claude Code's own hooks.

    PostToolUse hook · vibedrift[vibedrift] flagged src/lib/retry.ts (DF-1): your exponentialBackoff (src/lib/retry.ts:1) duplicates exponentialBackoff (src/lib/backoff.ts:1), 1.00 similar; prefer importing it. …
  4. Decided on the record.

    A fix counts only when the re-check passes.

    acceptparkdecline
    ✓ cleared · re-checked 16:47

Drift Sessions

Drift, flagged while your agent is still writing, and live on your sessions dashboard.

Checks async style, return shape, data access and duplicates. Dashboard sync is off until you turn it on.

◂ all sessions~/vibedrift $ session showapi-core· retry webhook deliveryconcept · illustrative data● Live
claude-code · started 16:45
5Flagged
2Fixed · verified
2Accepted
1Parked
2Declined
47Edits watched
12Pre-write checks
16:45agent edited routes/webhooks.ts +38
VIBEDRIFT FLAGGEDDF-1routes/webhooks.tsAccepted

observed: .then() chains
dominant pattern: async/await

✓ cleared · re-checked 16:47
16:48agent checked with VibeDrift before writing
16:48VibeDrift answered ⟶ 1 similar found
16:49agent edited webhooks/retry.ts +34
VIBEDRIFT FLAGGEDDF-2webhooks/retry.tsDeclined

Duplicates an existing function elsewhere (84% similar); prefer importing it.

kept as written · the agent's call, on the record
VIBEDRIFT FLAGGEDDF-3webhooks/queue.tsParked

observed: null/undefined sentinels
dominant pattern: throws on error

◷ parked for a developer to review

These paths are shared because you opted in. Turn off with vibedrift watch-session --names off.

  1. Each flag asks for a decision
  2. Fixed means the code is gone
  3. It never blocks the edit
vibedrift watch-sessionlive
$ vibedrift watch-session◆ EVENT TAPE · agent ↔ vibedrift · watching for your next session10:49:27  SESSION    capture started10:49:27  USER       add a reports endpoint that lists monthly totals10:49:27  INTENT     contract locked · add a reports endpoint that lists monthly totals10:49:43  AGENT      edits src/api/reports.ts +510:49:43  VIBEDRIFT  [FLAGGED] DF-1 [PASSIVE] async_patterns: repo uses async/await, this uses .then() chains10:49:50  AGENT      [ACCEPT] DF-1 agreed — rewriting to async/await to match the repo10:49:57  AGENT      edits src/api/reports.ts +510:49:57  VIBEDRIFT  [RESOLVED] DF-1 src/api/reports.ts10:49:57  VIBEDRIFT  [FLAGGED] DF-2 [PASSIVE] duplicates src/api/billing.ts:1 (0.96 similar)10:50:22  AGENT      [DECLINE] DF-2 structural near-duplicate only — getBilling fetches /api/bil10:50:32  SESSION    session endsession summary  2 edits · 2 flagged · 1 resolved · 1 open · agent said: 1 accepted, 1 declined⟳ watching · 11 events · 2 flagged · 1 open · ● drift 0.34 · Ctrl-C to stop
  1. A live tape of the session
After npm i -g @vibedrift/cliScan the repo once first, then run it in the repo. Typing it is the consent. With the Claude Code plugin, /vibedrift:setup asks for you. Needs Node.js 20 or newer.
Pro, first 5 sessions free

See whether the agent listened.

With sync on. Free for your 5 trial sessions; Pro adds weekly insights and full scan history.

~/vibedrift $ sessionsMy workspaceconcept · illustrative data
Last 30 days5 projectsServer rollup
Flagged in-session
18
166 edits · 6 sessions · 1 live of 4 projects
Fixed & re-verified
12of 18
Median 4 min to fix, across 9 pairs
Waiting on me
3
Parked by the agent for a person
Declined with reason
4
The agent's call, reason on record
ProjectsAll 5, including 1 with no watched sessions
ProjectSessionsEditsFlaggedFixedWaitingDeclinedDensityTime to fix
api-core311011812124 min
swiftcart12643014 in 21—
payments-service11831213 in 14—
web1120000——
docs-siteScans only0———————
Time to fix is withheld for swiftcart and payments-service. They have 2 and 1 resolved pairs; a median needs 5 before it means anything.
Sessions 6 syncedallliveneeds reviewopendone
api-core · retry webhook deliveryclaude-code · 47 edits · 12 consults● Live5 flagged · 2 fixedOpen
api-core · webhook retry scaffoldingclaude-code · 41 edits · 9 consults1d ago3 flagged · 3 fixedOpen
payments-service · idempotency keys on chargesclaude-code · 18 edits · 4 consults40m ago3 flagged · 1 fixedOpen
swiftcart · migrate reports route to async/awaitclaude-code · 26 edits · 7 consults14m ago4 flagged · 3 fixedOpen
web claude-code · 12 edits · 3 consults1h agono flagsOpen
Flags by outcomeweekly
Wk 37
Wk 38
FixedParkedDeclined
Files I keep drifting on2+ sessions
file 77aa11bbFlagged in 3 of the 3 sessions that touched it3 of 3
routes/webhooks.tsFlagged in 2 of the 3 sessions that touched it2 of 3
These paths are shared because you opted in. Turn off with vibedrift watch-session --names off.
Weekly receiptCopy
This week: 15 flagged · 8 accepted · 3 parked for you · 4 declined (9 fixes re-verified)
The agent asked firstbefore writing
40in-loop consults across 6 sessions.
Verdicts returned
Matches convention24
Near-duplicate exists6
Drift warned5
No match3
Consults are not linked to flags, so none of this is counted as drift prevented.

Only a derived projection (findings, outcomes, metadata) leaves your machine; never your code or prompts. File paths are also shared for each repo where you turned that on. VibeDrift records what it flagged and what the agent chose; it never blocks a change. Observed, not assumed.

  1. Fixed and re-verified
  2. What is waiting on you

MCP tools

Your agent asks your repo before it writes.

agent · before it writes
●I need a date formatter for the new dashboard widget. Checking the repo before I write one.
vibedrift · find_similar_functionruns locally · no login
body: "function formatDate(iso: string) { const d = new Date(iso); return d.toLocaleDateString("en-US", { … }) }"
formatDate()src/app/blog/page.tsx:1600.97
formatDate()src/app/releases/page.tsx:360.97
formatDate()src/components/blog/kit.tsx:3650.97
+ 8 weaker matches, 0.66 to 0.93
●A near-identical formatDate already exists in three files. I'll reuse it rather than add a fourth.
vibedrift · get_dominant_patternper directory
dimension: "exports", path: "src/components/dashboard/NewWidget.tsx"
dominantPattern
default exports
consistency
23 of 25 files in src/components/dashboard/ (92%)
examples
BottomNav.tsxBuyCreditsButtons.tsx · CategoryScores.tsx
  1. The majority pattern, per directory
The agent asked firstbefore writing
40in-loop consults across 6 sessions.
Verdicts returned
Matches convention24
Near-duplicate exists6
Drift warned5
No match3
Consults are not linked to flags, so none of this is counted as drift prevented.
Files I keep drifting on2+ sessions
file 77aa11bbFlagged in 3 of the 3 sessions that touched it3 of 3
routes/webhooks.tsFlagged in 2 of the 3 sessions that touched it2 of 3
These paths are shared because you opted in. Turn off with vibedrift watch-session --names off.
Concept · illustrative data
  1. With Drift Sessions and sync onThe files card is Pro.

Scan

One command. See where your codebase disagrees with itself.

zsh
$ npx @vibedrift/cli .╭─────────────────────╮│  VibeDrift v0.20.3  │╰─────────────────────╯Files: 289 (JS: 4, TS: 285) | Lines: 48,090 | Time: 1.8s── Vibe Drift Score ────────────────────────────────  Architectural Consistency    16.3/20  ████████████████░░░░  Redundancy                   17.9/20  ██████████████████░░  Security Consistency           N/A — nothing to measure in this repoconsistent ≠ safe: measures how uniformly this repo applies its own auth, validation, and rate-limit patterns, not the absence of vulnerabilities  Intent Clarity               19.5/20  ████████████████████  ──────────────────────────────────  Vibe Drift Score:            85.4/100  (over 3 of 4 categories)  Hygiene Score:               96.1/100── Fix Plan ──────────────────────────────────────  Highest-impact drifts to re-align first.  1. 9 file(s) in src/components/dashboard/ have burst-authorship shape     src/components/dashboard/DangerZone.tsx:1  +1.4pts consistency     → New code in this directory will copy the wrong pattern  2. Exact semantic duplicate: formatDate(), formatDate(), formatDate()     src/app/blog/page.tsx:160  +0.7pts consistency     → Duplicate logic will diverge silently over time  3. 1 file(s) in src/lib/dashboard/ use error-object returns while 6 use null     src/lib/dashboard/actions.ts:51  +0.6pts consistency     → Callers can't trust a consistent return shape across handlers  Fix these 3 → projected ~92.2/100 (B → A)
  1. Not a grade of quality
VIBEDRIFT

vibedrift-landing-page

Sep 18, 2026289 files48,090 linesTypescript 99%Javascript 1%scanned in 1.8s
85.4/100B
on track for a A after the fixes below
050100

Consistent overall. A few files drift from the patterns your codebase already follows; the fixes below close the gap.

Vibe Drift Score: how consistently your codebase follows the patterns it already uses. Higher means more consistent.

Composite over 3 of 4 categories — the remaining categories had no signals in this repo.

A 90+B 75–89C 50–74D 25–49F under 25
Fix the top driftsOpen detailed report
Category breakdowneach scored out of 20
Architectural
16.3/20
Redundancy
17.9/20
Security Consistency
N/A

Nothing to measure in this repo

Consistency of this repo's own auth, validation, and rate-limit patterns, not the absence of vulnerabilities.

Intent Clarity
19.5/20
Fix firstCopy all as AI context
+1.35 to score

9 file(s) in src/components/dashboard/ have burst-authorship shape (single-author, one sitting) while 13 sibling(s) were cultivated over time

src/components/dashboard/DangerZone.tsx:1Copy AI prompt
+0.66 to score

Exact semantic duplicate: formatDate(), formatDate(), formatDate() have identical normalized bodies across 3 files

src/app/blog/page.tsx:160Copy AI prompt
+0.58 to score

1 file(s) in src/lib/dashboard/ use error-object returns while 6 use null/undefined sentinels

src/lib/dashboard/actions.ts:51Copy AI prompt
  1. A real scan of this website's code

Free to start.

Free

$0
  • Unlimited local scans
  • The 8 local MCP tools
  • 1 deep scan a month
  • Your first 5 Drift Sessions, one time, with a free account
Get started for free

Pro

$15/ month
  • Drift Sessions in Claude Code, unlimited
  • The sessions page after the trial, with weekly insights (sync is off until you turn it on)
  • Watch mode and the git pre-push gate

Enterprise

Let's talk
  • For teams that need something the plans above don't cover.
Talk to us

Out of deep scans? Top up 5 for $10 on any plan. Credits never expire.

Set up once.

  1. In Claude Code

    /plugin marketplace add VibeDrift/VibeDrift
    /plugin install vibedrift@vibedrift
  2. Once per repo

    /vibedrift:setup
  3. Just scan

From the blog