midnight precision instrument
Theme: dark
Linear's design system is a midnight command center built on near-black surfaces (#08090a) with paper-white type and one electric acid-lime accent (#e4f222) that functions as a functional flashlight — small, high-contrast, and used sparingly to signal action. The interface treats darkness as a substrate rather than a theme: text is crisp white at tight tracking (-0.022em), weights sit in a low 400–510 band rather than bold, and borders are hairline-thin (0.5px) to let geometry do the work that shadows usually would. Components feel precision-machined — 6px and 12px radii, compact 8–12px paddings, and almost no decorative ornament — letting the product UI (issue cards, kanban boards, AI agent panels) be the only visual texture in an otherwise quiet system.
| Name | Value | Token | Role |
|---|---|---|---|
| Void | #08090a |
--color-void |
Page canvas, full-bleed backgrounds — the default everything sits on |
| Carbon | #0f1011 |
--color-carbon |
Card surfaces, nav bars — one step above canvas for contained content |
| Obsidian | #161718 |
--color-obsidian |
Elevated surfaces, deeper card panels |
| Graphite | #23252a |
--color-graphite |
Subtle borders, dividers, ghost button outlines — low-contrast structural edges |
| Smoke | #383b3f |
--color-smoke |
Hairline borders at higher contrast than graphite — section separators |
| Ash | #62666d |
--color-ash |
Muted body text, inactive icons, secondary metadata |
| Fog | #8a8f98 |
--color-fog |
Tertiary text, placeholder copy, icon fills |
| Mist | #d0d6e0 |
--color-mist |
Secondary headings, button text on dark surfaces |
| Bone | #e5e5e6 |
--color-bone |
Near-white surface fills, high-contrast button text |
| Paper | #ffffff |
--color-paper |
Primary headings, hero type, max-contrast emphasis text |
| Acid Lime | #e4f222 |
--color-acid-lime |
Primary action buttons, active nav indicators — electric accent that breaks the monochrome system |
| Pulse Green | #27a644 |
--color-pulse-green |
Green outline accent for tags, dividers, and focused UI edges. Use as a supporting accent, not as a status color |
| Coral Red | #eb5757 |
--color-coral-red |
Red wash for highlight backgrounds, decorative bands, and soft emphasis behind content. Use as a supporting accent, not as a status color |
| Signal Teal | #02b8cc |
--color-signal-teal |
Decorative accent, informational icon fills |
| Iris Violet | #6366f1 |
--color-iris-violet |
Tag/badge fills — soft chromatic punctuation on tags and labels |
| Lavender | #8b5cf6 |
--color-lavender |
Secondary tag fills, category indicators |
Inter Variable — Primary UI and heading typeface — used across nav, body, headings, buttons, cards · --font-inter-variable
- Substitute: Inter (variable), or system-ui as fallback
- Weights: 300, 400, 510, 590
- Sizes: 10, 11, 12, 13, 14, 15, 16, 17, 20, 24, 32, 48, 64, 72
- Line height: 1.0–2.75
- Letter spacing: -0.022em at 48–72px, -0.012em at 20–32px, -0.011em at 15px, -0.010em at 13–16px
- OpenType features:
"cv01" on, "ss03" on, "zero" on - Role: Primary UI and heading typeface — used across nav, body, headings, buttons, cards
Berkeley Mono — Code-adjacent UI text — issue IDs (ENG-2703), keyboard shortcuts, monospaced metadata · --font-berkeley-mono
- Substitute: JetBrains Mono, IBM Plex Mono, or ui-monospace
- Weights: 400
- Sizes: 12, 14
- Line height: 1.40–1.71
- Letter spacing: -0.013em
- OpenType features:
"cv01" on, "ss03" on - Role: Code-adjacent UI text — issue IDs (ENG-2703), keyboard shortcuts, monospaced metadata
| Role | Size | Line Height | Letter Spacing | Token |
|---|---|---|---|---|
| caption | 13px | 1.2 | — | --text-caption |
| body-sm | 15px | 1.6 | -0.165px | --text-body-sm |
| body-lg | 20px | 1.33 | -0.24px | --text-body-lg |
| subheading | 24px | 1.33 | -0.288px | --text-subheading |
| heading-sm | 32px | 1.13 | -0.704px | --text-heading-sm |
| heading | 48px | 1 | -1.056px | --text-heading |
| heading-lg | 64px | 1 | -1.408px | --text-heading-lg |
| display | 72px | 1 | -1.584px | --text-display |
Base unit: 4px
Density: compact
| Name | Value | Token |
|---|---|---|
| 4 | 4px | --spacing-4 |
| 8 | 8px | --spacing-8 |
| 12 | 12px | --spacing-12 |
| 16 | 16px | --spacing-16 |
| 20 | 20px | --spacing-20 |
| 24 | 24px | --spacing-24 |
| 28 | 28px | --spacing-28 |
| 32 | 32px | --spacing-32 |
| 36 | 36px | --spacing-36 |
| 40 | 40px | --spacing-40 |
| 48 | 48px | --spacing-48 |
| 56 | 56px | --spacing-56 |
| 64 | 64px | --spacing-64 |
| 80 | 80px | --spacing-80 |
| 96 | 96px | --spacing-96 |
| 128 | 128px | --spacing-128 |
| Element | Value |
|---|---|
| cards | 12px |
| pills | 9999px |
| small | 2px |
| badges | 4px |
| inputs | 6px |
| buttons | 6px |
| Name | Value | Token |
|---|---|---|
| sm | rgba(0, 0, 0, 0.4) 0px 2px 4px 0px |
--shadow-sm |
| md | rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset |
--shadow-md |
| subtle | rgb(35, 37, 42) 0px 0px 0px 1px inset |
--shadow-subtle |
| subtle-2 | rgba(0, 0, 0, 0.2) 0px 0px 0px 1px |
--shadow-subtle-2 |
| subtle-3 | rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) ... |
--shadow-subtle-3 |
| xl | rgba(8, 9, 10, 0.6) 0px 4px 32px 0px |
--shadow-xl |
| subtle-4 | rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255... |
--shadow-subtle-4 |
| subtle-5 | rgba(0, 0, 0, 0.1) 0px 0px 0px 2px |
--shadow-subtle-5 |
- Page max-width: 1200px
- Section gap: 96px
- Card padding: 24px
- Element gap: 8px
Role: High-emphasis CTA — the one chromatic button in the system
Background #e4f222, text #08090a, border-radius 6px, padding 10px 16px, Inter 14px / weight 510, letter-spacing -0.011em. Sits as the sole filled chromatic element — every other button on the site is neutral.
Role: Top navigation items
Transparent background, text #d0d6e0, padding 8px 12px, Inter 13px / weight 400. No border, no fill — pure typographic nav with underline on hover.
Role: Tag chips, status pills, compact action triggers
Background rgba(255,255,255,0.05), text #d0d6e0, border-radius 9999px, padding 4px 12px, Inter 12–13px / weight 400.
Role: Secondary actions, less prominent CTAs
Transparent background, border 1px #23252a, text #d0d6e0, border-radius 6px, padding 8px 12px, Inter 13px / weight 400.
Role: High-emphasis nav CTA
Background #ffffff, text #08090a, border-radius 9999px, padding 8px 16px, Inter 13px / weight 510. White pill against the dark nav bar — the second highest-contrast element after the acid-lime CTA.
Role: Large showcase surface for product UI screenshots
Background #0f1011, border-radius 12px, inset shadow rgb(35,37,42) 0 0 0 1px, padding 24px. Hairline inner border defines the card edge — no outer shadow, no glow.
Role: Small content cards, nested panels
Background rgba(255,255,255,0.02), border-radius 6px, shadow rgba(0,0,0,0.4) 0 2px 4px, padding 8px. Almost invisible — the card barely separates from the canvas.
Role: Form fields, search inputs
Background rgba(255,255,255,0.02), border 1px rgba(255,255,255,0.08), text #d0d6e0, border-radius 6px, padding 12px 14px, Inter 14px / weight 400. Focus ring: border brightens to #d0d6e0.
Role: Issue status, category labels, inline metadata
Background rgba(255,255,255,0.05), text #8a8f98, border-radius 4px, padding 0px 6px, Inter 12px / weight 400. Color-coded variants use Pulse Green, Coral Red, Iris Violet, or Lavender fills.
Role: Brand identification in nav
Linear wordmark + geometric glyph, Inter 16px / weight 510, color #ffffff. Glyph rendered as inline SVG in white.
Role: Social proof — customer logos in a horizontal row
Neutral grey logos (Vercel, Cursor, Oscar, OpenAI, Coinbase, Cash App, Boom, Ramp) at #8a8f98–#d0d6e0, evenly spaced with 48–64px gaps, no card backgrounds.
Role: Atmospheric base under the product screenshot
Linear gradient from rgb(8,9,10) at 10% to rgb(208,214,224) at 100% — a subtle light wash that grounds the floating product UI against the void.
- Use Inter Variable with font-feature-settings 'cv01' on, 'ss03' on, 'zero' on — these alternate glyphs define Linear's typographic identity
- Use #e4f222 exclusively for the single primary action per view — never for decoration, never for secondary buttons
- Set body text at 16px Inter weight 400 with line-height 1.5 — larger reading sizes (17px+ at weight 590) are reserved for body emphasis blocks
- Use letter-spacing -0.022em at 48px and above — tight tracking is non-negotiable for display type
- Set card radius to 12px, button radius to 6px, pill radius to 9999px — three radii is the entire radius vocabulary
- Use 0.5px hairline borders (#23252a or #383b3f) instead of shadows for surface separation — Linear's elevation comes from borders and subtle inner shadows
- Keep section gaps at 96px and element gaps at 8px — the 8/12/24/96 spacing ladder is the rhythm
- Do not use bold weights (700+) — Linear's type scale caps at weight 590, the system deliberately avoids heavy display weights
- Do not use decorative gradients on buttons, cards, or text — gradients are reserved for the hero atmospheric floor only
- Do not introduce additional chromatic accent colors as actions — the acid-lime button is the only chromatic UI element
- Do not use large radii (16px+) on cards or panels — 12px is the max card radius in this system
- Do not use shadows to separate cards from the canvas — use hairline borders (#23252a) and inner inset shadows instead
- Do not use chromatic text colors for body copy — all body text sits in the #d0d6e0 / #8a8f98 / #62666d grey scale
- Do not use Berkeley Mono for headings or marketing copy — it is reserved for issue IDs, keyboard shortcuts, and technical metadata
| Level | Name | Value | Purpose |
|---|---|---|---|
| 0 | Void | #08090a |
Page canvas — the default full-bleed background |
| 1 | Carbon | #0f1011 |
Card surfaces, product screenshot frames, nav containers |
| 2 | Obsidian | #161718 |
Elevated panels, deeper nested surfaces |
| 3 | Slate | #23252a |
Interactive surface tint, ghost button fills, border-adjacent backgrounds |
Elevation in Linear's system is achieved almost entirely through hairline borders (0.5px #23252a or 1px inset #23252a) and subtle dark drop shadows (rgba(0,0,0,0.4) 0 2px 4px) rather than layered shadow stacks. The visual hierarchy comes from the surface-level progression (#08090a → #0f1011 → #161718 → #23252a) and border definition, not from ambient shadow. The acid-lime CTA button uses an inset shadow stack (0px 5px 2px / 0px 3px 2px / 0px 1px 1px) — the only place in the system where a real shadow is applied to a chrome element.
Linear's visual language is product-screenshot-first: the hero and section illustrations are real Linear app UI captured at full fidelity — issue cards, kanban boards, AI agent panels, command palettes — placed inside framed card containers with hairline borders. No stock photography, no lifestyle imagery, no abstract illustration. Logos appear as a customer strip in neutral grey (#8a8f98) at uniform size. Icons are minimal line-art SVGs in single-color grey scale. The hero screenshot floats on a subtle linear gradient (dark-to-light) that creates atmospheric depth without literal scenery. Every visual element is a functional artifact of the product itself.
Layout is max-width contained at ~1200px, centered, with full-bleed dark backgrounds extending to viewport edges. The hero is a left-aligned oversized headline (64–72px) paired with a right-aligned link CTA, followed by a large product screenshot that bleeds beyond the max-width slightly. Section rhythm alternates between text-left/image-right 2-column compositions and full-width product showcase bands, separated by 96px vertical gaps. The customer logo strip is a single horizontal row. The page never uses 3-column card grids or masonry — information density stays low, with most sections using generous whitespace and a single focal point per screen. Navigation is a fixed top bar with left-aligned logo and right-aligned links, no sidebar, no mega-menu.
Quick Color Reference:
- text (primary heading): #ffffff
- text (body): #d0d6e0
- text (muted): #8a8f98
- background (canvas): #08090a
- background (card): #0f1011
- border (hairline): #23252a
- accent (CTA): #e4f222
- primary action: #e4f222 (filled action)
3-5 Example Component Prompts:
-
Hero headline block: Full-bleed #08090a canvas. Headline at 64px Inter Variable weight 510, color #ffffff, letter-spacing -0.022em, line-height 1.0. Subtext at 16px Inter weight 400, color #8a8f98. No button — secondary link text in #d0d6e0 with arrow glyph.
-
Product screenshot card: Background #0f1011, border-radius 12px, inset border 1px #23252a via box-shadow, padding 24px. Contains a simulated app UI at full opacity over the card surface. No outer drop shadow.
-
Acid-lime primary action button: Background #e4f222, text #08090a, border-radius 6px, padding 10px 16px, Inter 14px weight 510, letter-spacing -0.011em. Only one per view.
-
Nav top bar: Background #08090a (transparent over canvas), padding 16px horizontal, max-width 1200px centered. Logo wordmark #ffffff at 16px weight 510 left-aligned. Nav links #d0d6e0 at 13px weight 400, 8px gaps. Right-aligned white pill sign-up button: bg #ffffff, text #08090a, border-radius 9999px, padding 8px 16px.
-
Status badge row: Horizontal flex, 8px gap. Each badge: background rgba(255,255,255,0.05), text #8a8f98, border-radius 4px, padding 0px 6px, Inter 12px weight 400. Color-coded variants: #27a644 for success, #eb5757 for error, #6366f1 for tags.
Display: 72px / 510 / lh 1.0 / ls -0.022em Hero: 64px / 510 / lh 1.0 / ls -0.022em Section heading: 48px / 510 / lh 1.0 / ls -0.022em Subheading: 32px / 400 / lh 1.13 / ls -0.022em Heading: 24px / 400 / lh 1.33 / ls -0.012em Body emphasis: 20px / 590 / lh 1.33 / ls -0.012em Body large: 17px / 590 / lh 1.6 / ls default Body: 16px / 400 / lh 1.5 / ls default Body small: 15px / 400 / lh 1.6 / ls -0.011em Caption: 13px / 400 / lh 1.2 / ls default Label: 12px / 400 / lh 1.4 / ls default Micro: 10px / 510 / lh 1.5 / ls default
- Vercel — Same dark-canvas-first approach with hairline borders, tight Inter typography, and product-screenshot-as-hero layout — both treat the product UI as the visual content rather than illustration
- Cursor — Identical midnight dark mode with acid-lime accent CTA, compact Inter type at 400–510 weights, and product-screenshot showcase cards at 12px radius
- Raycast — Shared dark precision-instrument aesthetic — compact spacing, 6px button radius, monochromatic chrome with a single functional accent color for active states
- Framer — Same dark-canvas layout language with large 48–64px Inter headings at tight tracking, product-screenshot hero cards, and minimal ornament between sections
:root {
/* Colors */
--color-void: #08090a;
--color-carbon: #0f1011;
--color-obsidian: #161718;
--color-graphite: #23252a;
--color-smoke: #383b3f;
--color-ash: #62666d;
--color-fog: #8a8f98;
--color-mist: #d0d6e0;
--color-bone: #e5e5e6;
--color-paper: #ffffff;
--color-acid-lime: #e4f222;
--color-pulse-green: #27a644;
--color-coral-red: #eb5757;
--color-signal-teal: #02b8cc;
--color-iris-violet: #6366f1;
--color-lavender: #8b5cf6;
/* Typography — Font Families */
--font-inter-variable: 'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-berkeley-mono: 'Berkeley Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
/* Typography — Scale */
--text-caption: 13px;
--leading-caption: 1.2;
--text-body-sm: 15px;
--leading-body-sm: 1.6;
--tracking-body-sm: -0.165px;
--text-body-lg: 20px;
--leading-body-lg: 1.33;
--tracking-body-lg: -0.24px;
--text-subheading: 24px;
--leading-subheading: 1.33;
--tracking-subheading: -0.288px;
--text-heading-sm: 32px;
--leading-heading-sm: 1.13;
--tracking-heading-sm: -0.704px;
--text-heading: 48px;
--leading-heading: 1;
--tracking-heading: -1.056px;
--text-heading-lg: 64px;
--leading-heading-lg: 1;
--tracking-heading-lg: -1.408px;
--text-display: 72px;
--leading-display: 1;
--tracking-display: -1.584px;
/* Typography — Weights */
--font-weight-light: 300;
--font-weight-regular: 400;
--font-weight-w510: 510;
--font-weight-w590: 590;
/* Spacing */
--spacing-unit: 4px;
--spacing-4: 4px;
--spacing-8: 8px;
--spacing-12: 12px;
--spacing-16: 16px;
--spacing-20: 20px;
--spacing-24: 24px;
--spacing-28: 28px;
--spacing-32: 32px;
--spacing-36: 36px;
--spacing-40: 40px;
--spacing-48: 48px;
--spacing-56: 56px;
--spacing-64: 64px;
--spacing-80: 80px;
--spacing-96: 96px;
--spacing-128: 128px;
/* Layout */
--page-max-width: 1200px;
--section-gap: 96px;
--card-padding: 24px;
--element-gap: 8px;
/* Border Radius */
--radius-sm: 2px;
--radius-md: 6px;
--radius-xl: 12px;
--radius-2xl: 16px;
--radius-2xl-2: 22px;
--radius-full: 400px;
--radius-full-2: 9999px;
/* Named Radii */
--radius-cards: 12px;
--radius-pills: 9999px;
--radius-small: 2px;
--radius-badges: 4px;
--radius-inputs: 6px;
--radius-buttons: 6px;
/* Shadows */
--shadow-sm: rgba(0, 0, 0, 0.4) 0px 2px 4px 0px;
--shadow-md: rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset;
--shadow-subtle: rgb(35, 37, 42) 0px 0px 0px 1px inset;
--shadow-subtle-2: rgba(0, 0, 0, 0.2) 0px 0px 0px 1px;
--shadow-subtle-3: rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) 0px 3px 2px 0px, rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.08) 0px 0px 1px 0px;
--shadow-xl: rgba(8, 9, 10, 0.6) 0px 4px 32px 0px;
--shadow-subtle-4: rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.04) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.6) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 4px 4px 0px;
--shadow-subtle-5: rgba(0, 0, 0, 0.1) 0px 0px 0px 2px;
/* Surfaces */
--surface-void: #08090a;
--surface-carbon: #0f1011;
--surface-obsidian: #161718;
--surface-slate: #23252a;
}@theme {
/* Colors */
--color-void: #08090a;
--color-carbon: #0f1011;
--color-obsidian: #161718;
--color-graphite: #23252a;
--color-smoke: #383b3f;
--color-ash: #62666d;
--color-fog: #8a8f98;
--color-mist: #d0d6e0;
--color-bone: #e5e5e6;
--color-paper: #ffffff;
--color-acid-lime: #e4f222;
--color-pulse-green: #27a644;
--color-coral-red: #eb5757;
--color-signal-teal: #02b8cc;
--color-iris-violet: #6366f1;
--color-lavender: #8b5cf6;
/* Typography */
--font-inter-variable: 'Inter Variable', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
--font-berkeley-mono: 'Berkeley Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
/* Typography — Scale */
--text-caption: 13px;
--leading-caption: 1.2;
--text-body-sm: 15px;
--leading-body-sm: 1.6;
--tracking-body-sm: -0.165px;
--text-body-lg: 20px;
--leading-body-lg: 1.33;
--tracking-body-lg: -0.24px;
--text-subheading: 24px;
--leading-subheading: 1.33;
--tracking-subheading: -0.288px;
--text-heading-sm: 32px;
--leading-heading-sm: 1.13;
--tracking-heading-sm: -0.704px;
--text-heading: 48px;
--leading-heading: 1;
--tracking-heading: -1.056px;
--text-heading-lg: 64px;
--leading-heading-lg: 1;
--tracking-heading-lg: -1.408px;
--text-display: 72px;
--leading-display: 1;
--tracking-display: -1.584px;
/* Spacing */
--spacing-4: 4px;
--spacing-8: 8px;
--spacing-12: 12px;
--spacing-16: 16px;
--spacing-20: 20px;
--spacing-24: 24px;
--spacing-28: 28px;
--spacing-32: 32px;
--spacing-36: 36px;
--spacing-40: 40px;
--spacing-48: 48px;
--spacing-56: 56px;
--spacing-64: 64px;
--spacing-80: 80px;
--spacing-96: 96px;
--spacing-128: 128px;
/* Border Radius */
--radius-sm: 2px;
--radius-md: 6px;
--radius-xl: 12px;
--radius-2xl: 16px;
--radius-2xl-2: 22px;
--radius-full: 400px;
--radius-full-2: 9999px;
/* Shadows */
--shadow-sm: rgba(0, 0, 0, 0.4) 0px 2px 4px 0px;
--shadow-md: rgba(0, 0, 0, 0.2) 0px 0px 12px 0px inset;
--shadow-subtle: rgb(35, 37, 42) 0px 0px 0px 1px inset;
--shadow-subtle-2: rgba(0, 0, 0, 0.2) 0px 0px 0px 1px;
--shadow-subtle-3: rgba(0, 0, 0, 0.01) 0px 5px 2px 0px, rgba(0, 0, 0, 0.04) 0px 3px 2px 0px, rgba(0, 0, 0, 0.07) 0px 1px 1px 0px, rgba(0, 0, 0, 0.08) 0px 0px 1px 0px;
--shadow-xl: rgba(8, 9, 10, 0.6) 0px 4px 32px 0px;
--shadow-subtle-4: rgba(255, 255, 255, 0.03) 0px 0px 0px 1px inset, rgba(255, 255, 255, 0.04) 0px 1px 0px 0px inset, rgba(0, 0, 0, 0.6) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 4px 4px 0px;
--shadow-subtle-5: rgba(0, 0, 0, 0.1) 0px 0px 0px 2px;
}