Skip to main content
Private Alpha · CLI live on npm

Real-time frontend feedback while you code with AI.

Vipr is an at-rest, multi-surface analyzer for front end development. It watches your repo while you (or your agent) code, and it flags anti-patterns and complexity the moment they show up. The CLI is live on npm today. The desktop app and VSCode extension are in private alpha with a small founding cohort.

npx @vipr/cli analyze src/

Why Vipr

Built for

TypeScriptJavaScriptReactNext.js

TypeScript-native depth

25+ analyses tuned for React hooks, Next.js boundaries, and TS-specific patterns. Not Java rules retrofitted for JS.

Your code stays yours

Analysis runs locally. No cloud upload, no telemetry on source, no account required to run a scan.

Speaks to your AI stack

An embedded MCP server lets Claude, Cursor, Antigravity, Kilo Code, and Windsurf query your repo metrics while they edit.

File detail, in context

Open a file. See why it scored that way.

Health score, the metrics behind it, threshold context, and AI guidance. One screen. Read the number, see what moved it, decide what to fix.

ccorydora/src/MetricBreakdown.tsx
MetricBreakdown.tsx
src/components/MetricBreakdown.tsx
File-level Analysis
File health
Composite Health Score
59/ 100
React42/100
TypeScript92/100
Issues17/100
Anti-PatternsReactTypeScriptIssues (17)
MetricValueDescription
Stale closure in useEffectConcern
1 (critical)`filters` captured but missing from dep array
Premature memoization
3Cheap ops with no memoized children
Unstable Context value
2Provider re-renders every consumer
Array index as key
0No dynamic lists detected
Re-renders on mount
12Aim for ≤ 2 with stable deps
Anti-pattern documentation
Stale closure in useEffect

A value referenced inside useEffect is not listed in its dependency array, so the effect closes over the value from a previous render and silently uses stale data until the component re-mounts.

// missing `filters` in deps
useEffect(() => fetch(url, { filters }), [url]);
SeverityWhat happens
CriticalStale data shown to users until next remount
WarningEffect re-runs only when listed deps change
HealthyAll referenced values appear in dep array
AI analysis
Stale Closure in useEffect

The effect captures `filters` from the first render but never lists it in the dep array, so users see filtered results from the previous query until the next prop change forces a re-mount.

Stale closure: `filters` missing from dep array
Derived state set inside `useEffect` — should be `useMemo`
Fetch has no abort signal — race condition on fast nav

Overview

Build the dashboard you actually open every morning

Drag, drop, and pin the widgets that match how your team works. Score, hotspots, anti-patterns, budgets. Arrange them once and they stay put.

Overview
Health
72/100
Hotspots
38files
Drop to reorder
Coverage
84%
Health Trend
Apr 1Apr 8Apr 15Apr 22Today
Top Issues
Implicit any in callback
Prop drilling depth >3
Unused import chain
Hotspot Files
FileScoreTrendRisk
src/components/Dashboard.tsx87High
src/utils/parser.ts74Med
src/services/api.ts63Low
src/hooks/useAuth.ts59Med

Per-file metrics

Every file scored, every metric tracked

Composite health for each file, broken down by complexity, churn, and maintainability. Trend pills show what moved since the last commit.

File Health

Composite Health Score

72/100
+3.2
ExcellentGoodFairPoor
Complexity68/100
TypeScript82/100
React54/100
Next.js38/100

Churn × complexity

Four quadrants, one refactor queue

Concerning, Risky, Active, Stable. Files plot themselves by churn and complexity, so the work order is obvious before the meeting starts.

Churn × Complexity: 24 files
ConcerningRiskyActiveStable
0%25%50%75%100%0%25%50%75%100%CONCERNINGRISKYACTIVESTABLEChurn Rate (percentile)Complexity (percentile)Dashboard.tsxCONCERNINGChurn Percentile84%Complexity Percentile76%Risk Score82.3Commits41Age412d

What it tracks

One engine, twenty-five analyses, zero cloud.

Analyses
25+ Cyclomatic, cognitive, Halstead, churn, anti-patterns, dead code, and the rest.
First analysis
~2 min 300 files, scored end-to-end, before your coffee finishes brewing.
Bytes uploaded
0 Local engine, local DB, local MCP. Your code never leaves the machine.

Hotspots

The files that change most are the files that hurt most

A treemap sized by impact and colored by risk. The dense, dark squares are where churn meets complexity. Those are the refactors that pay back fastest.

Hotspots: top 24 files
Risk:LowMediumHighCritical
Dashboard.tsx412 LOC
api.ts286 LOC
parser.ts224 LOC
router.ts198 LOC
state.ts176 LOC
UserList.tsx234 LOC
auth.ts162 LOC
cache.ts158 LOC
utils.ts142 LOC
reducer.ts196 LOC
forms.tsx184 LOC
schema.ts168 LOC
hooks.ts144 LOC
theme.ts122 LOC
icons.ts98 LOC
ChartCard.tsx156 LOC
Table.tsx138 LOC
Avatar.tsx92 LOC
format.ts86 LOC
router.tsx132 LOC
env.ts64 LOC
Dashboard.tsxCritical
src/components/Dashboard.tsx
Risk Score
87.4
Risk Level
High
Complexity
64
Dependency Impact
28
Hotspot Issues
6
Lines of Code
412
Click to open file analysis

Dependencies

Trace the blast radius of any file

Walk upstream to see what pulls a module in. Walk downstream to see what breaks if it changes. Cycles get flagged the moment they form.

Dependencies: clients/desktop/src/renderer/UserList.tsx
Circular DependencyuseUserStore.tssrc/stores12 importsStrongapiClient.tssrc/services8 importsModerateUser.types.tssrc/types4 importsType-onlyUserList.tsxclients/desktop/.../renderer7 importsModerateUserListItem.tsxsrc/components6 importsStrongPagination.tsxsrc/components3 importsModerateformatName.tssrc/utils2 importsWeak

Day zero

Open a repo, get a verdict in minutes

A first-pass readout of overall health, top hotspots, and architectural shape. Useful on legacy code you inherited and on greenfield work that just shipped.

Initial Assessment

Architecture Review

Identify architectural anti-patterns, circular dependencies, and high coupling that may impact maintainability.

Anti-Patterns
51
Circular Deps.
0
High Coupling
0
Top Architectural Concerns (4)
Anti-Pattern Type
Files Affected
Severity
Duplicate Code
3
High
Dead Code
27
Medium
Safety Erosion
3
Low
Type Gymnastics
1
Low

Differentiation

Not a linter. Not a formatter. Your sidekick.

Linters catch style and syntax. AI review guesses at intent. Vipr sees the whole picture.

Capability Vipr ESLint / Biome AI code review
Understands React (hooks, boundaries, props) ~
Tracks quality as you code
Can run 100% offline
Works with AI agents via MCP
Flags framework anti-patterns, not style ~ ~
One-time license, not per-seat or subscription-based

Pricing

Free CLI forever. One-time payment for the rest.

No subscription. No per-seat fees. One purchase covers three devices and every update inside that major version. Powered by Polar.sh.

CLI

Free forever

Analyze any JS/TS repo from your terminal. No account, no ceiling.

Check out the CLI

VSCode Extension Pro

$49 once

Inline scores, hover cards, CodeLens, dashboard webview.

Apply to the alpha
Bundle with VSCode Extension Pro for $129

Desktop Pro

$99 once

The full local dashboard. History, hotspots, MCP server.

Apply to the alpha
See full pricing →

Want lifetime upgrades? Believer at $249.99 one-time, every future major version included.

(Lifetime means all future major-version releases tied to your license key.)

Founding Testers · 100 seats

We're picking 100 people to break this with us.

The deal is simple. Install Vipr, run it on a real repo each week, and tell us what's wrong. In exchange, you lock in 50% off the Bundle when v1 ships — the desktop app and VSCode extension together. We read every issue.

Cohort closes when we hit 100 testers or when the build is ready — whichever comes first.