Skip to main content

Desktop Pro

The full picture,
on your machine.

Overview, file drill-in, metric documentation, historical analysis, budgets, and action items in one app. Local-first, offline-capable, and built for the codebase you actually maintain.

Private alpha · macOS, Windows, Linux · $99 one-time at launch

Runs on

macOS 13 Ventura+ · Universal binary

Windows 10+ · x64 & ARM64

Linux AppImage & .deb · x86_64 & ARM64

Inside the app

Ten glimpses into the quality loop.

Tap any tab to flip the screenshot. Every surface ships in the alpha. These are real captures of the desktop app, not illustrations.

Vipr Desktop. Customizable Dashboard.

Offline by design

Your source code is never stored in the cloud.

Vipr talks to our servers only for license activation and authentication. Static analysis, storages, and the MCP server all run locally.

Source stays local

No upload. No telemetry on code.

Your repository never leaves the machine. No account required to analyze a project.

Local LLMs for Targeted AI Questions

Offline models. No internet needed.

Vipr works with downloadable models (Qwen 2.5 Coder, 7B and 14B). Chat and AI guidance keep working offline.

Bring your own key (BYOK)

Claude, Gemini, or Codex.

Prefer a frontier model? Drop in your own API key for Anthropic, Google, or OpenAI. Your key, your provider.

Source inspector

From a finding to the offending line in one click

Open the drawer and the file opens with severity markers in the gutter. The metric, the rule, and the code stay visible together.

clients/desktop/src/renderer/UserList.tsx
1import React, { useEffect, useState } from 'react';
2import { UserRecord } from '../types';
3
4interface Props {
5 users: UserRecord[];
6 onSelect: (id: any) => void;
7}
8
9export function renderUserCard({ users, onSelect }: Props) {
10 const [active, setActive] = useState(null);
11
12 // @todo refactor: extract into hook
13 useEffect(() => {
14 if (users.length > 0) {
15 setActive(users[0].id);
16 }
17 }, [users, active, onSelect]);
18
19 return (
20 <ul className="user-list">
21 {users.map(u => (
22 <li key={u.id} onClick={() => onSelect(u.id)}>
23 <span className="name">{u.firstName} {u.lastName}</span>
24 {u.id === active && <span className="badge">active</span>}
25 </li>
26 ))}
27 </ul>
28 );
29}
30
31// @todo: memoize sorted output once api stabilizes
32function sortByActivity(list: UserRecord[]) {
33 return [...list].sort((a, b) => {
34 const delta = b.lastSeen - a.lastSeen;
35 return delta !== 0 ? delta : a.firstName.localeCompare(b.firstName);
36 });
37}
38
39export const UserList = React.memo(renderUserCard);

Budgets

Set a ceiling for any metric and hold the line

Define budgets per file, directory, or metric. Vipr enforces them across every commit and shows exactly which files crossed, by how much, and when.

Create Budget

Choose which metric to enforce.

Commit compare

Diff two snapshots and see what really changed

Side-by-side metrics for any two commits or saved snapshots. Spot the regression that slipped past review and the refactor that quietly paid off.

8a3f9c2
Apr 18
feat/auth-refactor
74
score
improved
d19ec40
Apr 24
main
81
score
Score Δ
+7.0
Improved
9
Degraded
3
MetricBeforeAfterΔ% Chg
Cyclomatic8.46.9-1.5-17.9%
Halstead42.138.7-3.4-8.1%
Maintainability6873+5.0+7.4%
Cognitive12.213+0.8+6.6%
Lines of code1840184000%

Ready?

One price. Yours forever.

$99 once. Three devices. All updates inside this major version included. Or bundle with VSCode Extension Pro for $129.