“We're building the Linear of X” is the most common pitch in indie SaaS right now. It's also the most commonly failed execution.
The UI that ships looks nothing like Linear. It's rounded where Linear is sharp. It's noisy where Linear is quiet. The borders are visible. The type is loose. The accent color is everywhere. The developer knows something is wrong and can't name what.
What's wrong is that Linear's aesthetic is not a vibe. It's a precise set of token decisions, and getting any one of them wrong degrades the whole system. You can't eyeball your way to it.
What Linear Is Actually Doing
Linear's background is approximately #0F0F11 — a near-black with a slight cool-violet undertone, not a neutral gray. The surface color, used for cards and panels, is #17171A. The delta between them is roughly 5 luminance points. At a glance, they look identical. That's intentional: Linear doesn't want you to see the structure. It wants you to see the content.
Borders are rgba(255,255,255,0.06) — present but barely. Enough to delineate regions without creating visual weight. Most UI frameworks ship with borders at 10–15% opacity. Linear runs them at 6%. The difference is whether your UI reads as segmented or unified.
:root {
/* Linear-approximate token system */
--background: #0F0F11;
--surface: #17171A;
--surface-hover: #1E1E22;
--surface-active: #25252A;
--border: rgba(255, 255, 255, 0.06);
--border-strong: rgba(255, 255, 255, 0.1);
--text-primary: rgba(255, 255, 255, 0.92);
--text-secondary: rgba(255, 255, 255, 0.5);
--text-tertiary: rgba(255, 255, 255, 0.28);
--accent: #5E6AD2; /* Linear purple */
--accent-hover: #6B77E0;
--accent-muted: rgba(94, 106, 210, 0.15);
--radius: 4px;
--radius-sm: 2px;
--radius-lg: 6px;
}The purple — approximately #5E6AD2 — appears on selected states, active navigation items, focus rings, and primary buttons. Nowhere else. It has a 5.2:1 contrast ratio against the base background, which is sufficient and deliberate. High enough to be legible. Not so punchy it creates visual tension.
Density and Typography
Linear packs more information per pixel than almost any other SaaS product. This isn't a consequence of having more features — it's a deliberate type decision.
Base body text runs at 13–14px, not the 16px most Tailwind projects default to. Line height is tight: 1.4–1.5, not 1.6–1.75. Letter spacing on labels is -0.01em to -0.02em — slightly condensed, which reads as precise rather than cramped.
The heading font is the same as the body font. Linear doesn't use a display typeface. It uses Inter at varying weights and sizes, which keeps the visual hierarchy clean without introducing typographic noise.
/* Linear-approximate type system */
:root {
--font-base: 'Inter', system-ui, sans-serif;
--text-xs: 11px;
--text-sm: 13px;
--text-base: 14px;
--text-lg: 16px;
--text-xl: 20px;
--leading-tight: 1.4;
--leading-base: 1.5;
--tracking-tight: -0.02em;
--tracking-base: -0.01em;
}
body {
font-family: var(--font-base);
font-size: var(--text-base);
line-height: var(--leading-base);
letter-spacing: var(--tracking-base);
color: var(--text-primary);
}At 14px with -0.01em tracking and 1.5 line height, text reads as intentional rather than small. At 16px with 1.6 line height, it reads as a blog.
Why “Make It Look Like Linear” Fails in Cursor
Every developer building “the Linear of X” has tried prompting their AI coding tool with some version of “make this look like Linear.” The output is always the same: generic dark mode with a purple primary button.
The AI doesn't know what Linear actually does. It knows Linear is associated with “dark, minimal, purple.” That's not a design system. That's a mood board. The output reflects it.
The problem is that Linear's aesthetic lives in token precision — the difference between rgba(255,255,255,0.06) and rgba(255,255,255,0.12) borders, between --radius: 4px and --radius: 8px, between 13px and 16px base type. These are not details an AI invents correctly from a one-line prompt. They need to be specified.
This is where SeedFlip's Velocity seed comes in. It's a high-density, dark-mode design system built around the same structural logic as Linear: near-invisible borders, tight type scale, minimal radius, surgical accent placement. Load it and the demo landing page restyles into that aesthetic in real-time — not an approximation, a working UI wearing the system.
The Briefing (Pro, $19/mo) is the export that solves the Cursor problem. It's a ~1,700-character AI prompt with five sections — Typography, Colors, Shape, Depth, Rules — written as a creative director brief. The Rules section is where it earns its price: explicit constraints like “borders at 6% opacity maximum,” “accent on interactive states only,” “no radius above 6px,” “base type at 13–14px.” Paste it before you generate a component and Cursor has the actual token logic, not a vibe.
The IDE rule file exports — CLAUDE.md, .cursorrules, .windsurfrules — embed these constraints as persistent context. The design system doesn't degrade as the codebase grows because the rules are in scope on every generation.
Lock & Remix (Pro) lets you keep the Velocity palette while exploring Type variants — see what the same high-density dark system looks like with a slightly different font pairing, or lock Shape and shuffle Atmosphere to find the right gradient treatment. The Briefing updates to reflect whatever hybrid you land on.
The DNA (CSS Variables, free) exports the variable set after The Gate — unlimited shuffles once you're through the email wall. The Tailwind DNA maps it into a complete tailwind.config.js.
The Actual Reason Linear Looks Like Linear
It's not the purple. It's the restraint.
Every decision in Linear's system is about removing visual weight. Borders as light as they can be while remaining functional. Type as small as it can be while remaining legible. Radius as minimal as possible without looking broken. Accent color on as few elements as possible while still communicating interactivity.
The aesthetic emerges from subtraction. Most developers try to add their way to polish. Linear got there by cutting.
That's the system. The token values are above. The implementation is on you.
Start with the Velocity seed. Build something that doesn't waste a pixel.