Find drift. Catch it at the PR. Measure improvement.

Not just another linter. Buoy finds design drift, blocks it in CI, and shows you the measurable improvement in your design system adoption.

Get started free
🔒 100% Deterministic
| No AI. No API keys. No data sent externally.

All Drift Types

Comprehensive drift detection for modern frontend codebases

🎨

Hardcoded Values

Find colors, spacing, and fonts that bypass your design tokens.

#ff0000
16px
Arial
📦

Duplicate Components

Detect similar components that should be consolidated.

Button
ButtonNew
MyButton
🏷️

Naming Drift

Catch inconsistent naming conventions across your codebase.

btn vs Button
color vs colour
🔧

Prop Mismatches

Find when the same prop has different types across components.

onClick vs onPress
size: string | number
⚠️

Deprecated Patterns

Track components marked as deprecated still in use.

deprecated annotation
legacy components
🌐

Framework Sprawl

Detect multiple UI frameworks competing in your codebase.

React + Vue + ...

Accessibility Issues

Find missing ARIA labels, focus traps, and contrast issues.

Missing aria-label
Low contrast
👻

Orphaned Components

Components in code but missing from Figma or Storybook.

In code, not in design
🗑️

Unused Tokens

Design tokens defined but never referenced in code.

--color-unused
--space-deprecated

How Drift Detection Works

1

Scan

Buoy parses your codebase to build a map of all components, props, and style values.

2

Analyze

Compares against your design system config to identify patterns that don't match.

3

Report

Outputs drift signals with severity, location, and suggested fixes.

Step 1: Find Drift

Every issue includes the exact file, line, and what to change.

buoy-cli
$
Scanning for design drift...
Found 31 issues across 89 files
CRITICAL (3)
├─ Button.tsx:12 Missing aria-label
→ Fix: Add aria-label={buttonText}
└─ Modal.tsx:45 Focus trap conflict
→ Fix: Use FocusTrap from design system
WARNING (12)
├─ Card.tsx:8 Hardcoded #ffffff → var(--color-bg)
├─ Header.tsx:3 NavHeader deprecated → Navigation
└─ ... and 10 more
Add to CI to catch at the PR →

Step 2: Catch at the PR

Add Buoy to CI. Design drift never reaches main.

Buoy Design Check — 3 critical issues found
src/components/Button.tsx line 12

Missing aria-label Critical → Add aria-label={buttonText}

src/components/Card.tsx line 8

Hardcoded color #ffffff → Use var(--color-bg)

src/components/Header.tsx line 3

Deprecated component NavHeader → Use Navigation

What You Get

Clarity, not just data. Every scan ends with concrete next steps.

🛡️

PR Checks

Catch drift at the PR. Every issue shows the exact token to use instead.

buoy drift check --ci
📋

Clear Explanations

Every issue includes the file, line, and exactly what needs to change.

buoy drift check --format detailed
📈

Coverage Score

Track design system adoption over time. Show leadership real numbers.

buoy show health

Visible Outcomes

👩‍💻 For Developers

  • No guessing — exact file, line, and fix
  • CI catches issues before they merge
  • PR checks catch issues before review
  • Less time debating, more time building

📊 For Leaders

  • Real adoption numbers, not estimates
  • Track improvement week over week
  • Prove design system ROI with data
  • Identify which teams need help
Free PDF

Not ready to install? Start with a manual audit.

20 warning signs to look for in your next code review. Spot drift before it spreads.

No spam. Unsubscribe anytime.

Why Design Drift Matters

Without Drift Detection

  • Inconsistent UI across the app
  • Design system becomes optional
  • Harder to maintain and update
  • No way to measure adoption

With Buoy

  • Consistent, cohesive UI
  • Design system enforcement
  • Easy global updates via tokens
  • Real adoption metrics

Ready to catch design drift?

Free. Open source. No signup required.

Related Features

Coverage Metrics

Measure design system adoption with real data

GitHub App

Catch drift in every PR automatically

CI Integration

Add drift checks to your CI pipeline