Linear
Dark-canvas product surface — pure-black ground, indigo accent, custom Inter weights, pill CTAs.
Compare to…
- bg
#08090a - bg-marketing
#010102 - bg-level-1
#0f1011 - bg-level-2
#141516 - bg-level-3
#1a1b1d - bg-overlay
rgba(8,9,10,0.72) - surface
#0f1011 - surface-strong
#141516 - surface-tinted-brand
rgba(94,106,210,0.08) - text AAA · 18.7
#f7f8f8 - text-strong
#ffffff - text-secondary
#d0d6e0 - text-tertiary
#8a8f98 - text-quaternary
#62666d - text-disabled
#3d3f44 - brand AA·LG · 4.2
#5e6ad2 - brand-hover
#7170ff - brand-press
#4a55c1 - brand-soft
rgba(94,106,210,0.16) - accent
#7170ff - link
#828fff - link-hover
#a3acff - border — · 1.3
#23252a - border-strong — · 1.6
#34343a - border-subtle
rgba(255,255,255,0.06) - border-brand
#5e6ad2 - cta-fill
#e5e5e6 - cta-fill-hover
#f3f3f4 - cta-fill-press
#cfcfd1 - cta-text
#08090a - success
#4cb782 - success-bg
rgba(76,183,130,0.12) - warning
#f2c94c - warning-bg
rgba(242,201,76,0.12) - danger
#eb5757 - danger-bg
rgba(235,87,87,0.12) - info
#5e6ad2 - info-bg
rgba(94,106,210,0.12) - chip-bg
#1a1b1d - chip-text
#d0d6e0 - chip-border
#34343a - on-brand
#ffffff
- step-0 0px
- step-1 2px
- step-2 4px
- step-3 6px
- step-4 8px
- step-5 12px
- step-6 16px
- step-7 20px
- step-8 24px
- step-9 32px
- step-10 48px
- step-11 64px
- step-12 96px
- step-13 120px
- step-14 160px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - card
24px - pill
9999px
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
name: Linear
tagline: Dark-canvas product surface — pure-black ground, indigo accent, custom Inter weights, pill CTAs.
author: webdesignhot
source_url: https://linear.app
spec: design.md/v1.5
quality: curated
featured: true
categories: [dev-tools, saas]
tags: [dark, minimal, sans, mono, dense, structured]
preview_swatch: ['#08090a', '#5e6ad2', '#f7f8f8']
related: [vercel, stripe, raycast]
description: 'Linear treats its marketing site like the product itself — same Inter Variable type at custom weights, same pure-black canvas, same pill-shaped action surfaces. The system is engineered for keyboard-driven dense interfaces; the website inherits that geometry. Indigo `#5e6ad2` is reserved as accent-only; the dominant CTA inverts to near-white on near-black for a single eye anchor per screen.'
colors:
# Page grounds
bg: '#08090a' # canvas, pure-near-black with a hint of warmth
bg-marketing: '#010102' # marketing landing pages — deeper still
bg-level-1: '#0f1011' # first elevation tier (cards, panels)
bg-level-2: '#141516' # second elevation (hover, emphasized)
bg-level-3: '#1a1b1d' # third tier — popovers, raised tooltips
bg-overlay: 'rgba(8,9,10,0.72)' # modal scrim
# Surfaces & containers
surface: '#0f1011'
surface-strong: '#141516'
surface-tinted-brand: 'rgba(94,106,210,0.08)' # brand-tinted callout wash
# Text
text: '#f7f8f8' # body copy, headlines
text-strong: '#ffffff' # display, max contrast
text-secondary: '#d0d6e0' # supporting copy
text-tertiary: '#8a8f98' # metadata, captions
text-quaternary: '#62666d' # placeholder, faint helpers
text-disabled: '#3d3f44'
# Brand & accent
brand: '#5e6ad2' # Linear indigo — accent-only
brand-hover: '#7170ff' # active states / focus rings
brand-press: '#4a55c1'
brand-soft: 'rgba(94,106,210,0.16)' # tinted backdrop
accent: '#7170ff'
link: '#828fff' # link copy on dark
link-hover: '#a3acff'
# Borders
border: '#23252a' # default 1px hairline
border-strong: '#34343a' # emphasized
border-subtle: 'rgba(255,255,255,0.06)' # near-invisible
border-brand: '#5e6ad2'
# CTA-inverse (the signature primary)
cta-fill: '#e5e5e6' # near-white pill button
cta-fill-hover: '#f3f3f4'
cta-fill-press: '#cfcfd1'
cta-text: '#08090a'
# Semantic
success: '#4cb782'
success-bg: 'rgba(76,183,130,0.12)'
warning: '#f2c94c'
warning-bg: 'rgba(242,201,76,0.12)'
danger: '#eb5757'
danger-bg: 'rgba(235,87,87,0.12)'
info: '#5e6ad2'
info-bg: 'rgba(94,106,210,0.12)'
# Shortcut-chip ink (mono signature)
chip-bg: '#1a1b1d'
chip-text: '#d0d6e0'
chip-border: '#34343a'
on-brand: '#ffffff'
typography:
display:
family: 'Inter Variable, "SF Pro Display", -apple-system, system-ui, sans-serif'
weights: [400, 510, 590]
opentype-features: ['cv11', 'ss03', 'cv01'] # alt 1/g/l, single-storey
body:
family: 'Inter Variable, "SF Pro Display", -apple-system, system-ui, sans-serif'
weights: [400, 510]
opentype-features: ['cv11', 'ss03']
mono:
family: '"Berkeley Mono", ui-monospace, "SF Mono", monospace'
weights: [400, 500]
opentype-features: ['zero', 'tnum']
scale:
display-hero: { size: 80, weight: 510, lineHeight: 1.0, tracking: '-0.025em', family: display }
display: { size: 64, weight: 510, lineHeight: 1.05, tracking: '-0.022em', family: display }
h1: { size: 48, weight: 510, lineHeight: 1.05, tracking: '-0.018em', family: display }
h2: { size: 32, weight: 510, lineHeight: 1.15, tracking: '-0.015em', family: display }
h3: { size: 22, weight: 510, lineHeight: 1.25, tracking: '-0.01em', family: display }
h4: { size: 18, weight: 510, lineHeight: 1.3, tracking: '-0.005em', family: display }
eyebrow: { size: 13, weight: 510, lineHeight: 1.4, tracking: '0.04em', family: display, transform: uppercase }
body-large: { size: 17, weight: 400, lineHeight: 1.55, tracking: '-0.01em', family: body }
body: { size: 15, weight: 400, lineHeight: 1.55, tracking: '-0.005em', family: body }
body-small: { size: 13, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
body-emphasis: { size: 15, weight: 510, lineHeight: 1.55, tracking: '-0.005em', family: body }
label: { size: 12, weight: 510, lineHeight: 1.4, tracking: '0.04em', family: body, transform: uppercase }
caption: { size: 12, weight: 400, lineHeight: 1.4, tracking: '0', family: body }
micro: { size: 11, weight: 510, lineHeight: 1.3, tracking: '0.05em', family: mono, transform: uppercase }
code-inline: { size: 13, weight: 400, lineHeight: 1.5, tracking: '0', family: mono }
code-block: { size: 13, weight: 400, lineHeight: 1.6, tracking: '0', family: mono }
shortcut-chip: { size: 11, weight: 500, lineHeight: 1, tracking: '0.02em', family: mono }
button: { size: 14, weight: 510, lineHeight: 1, tracking: '-0.005em', family: body }
button-large: { size: 16, weight: 510, lineHeight: 1, tracking: '-0.005em', family: body }
radius:
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
card: 24
pill: 9999
spacing:
base: 4
scale: [0, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96, 120, 160]
layout:
page-width: 1024
prose-width: 680
header-height: 72
section-y: 96
gutter: 24
grid-columns: 12
components:
button-primary:
backgroundColor: '#e5e5e6'
textColor: '#08090a'
rounded: pill
padding: '0 12px (small) | 0 20px (large)'
height: '32 / 40'
font: '13–16px Inter Variable, weight 510'
hover: 'bg #f3f3f4 — slight brightness lift'
active: 'bg #cfcfd1'
focus: 'ring 2px #7170ff offset 2px on bg'
use: 'sign-up / get-started — high-contrast inverted, one per screen'
button-ghost:
backgroundColor: transparent
textColor: '#d0d6e0'
border: '1px solid #23252a'
rounded: pill
padding: '0 16px'
height: 32
hover: 'bg rgba(255,255,255,0.05); text #f7f8f8'
use: 'secondary nav, "Learn more"'
button-brand:
backgroundColor: '#5e6ad2'
textColor: '#ffffff'
rounded: pill
use: 'rare — used only when emphasis must be brand-coded (downloads, beta sign-up)'
hover: 'bg #7170ff'
button-icon:
backgroundColor: transparent
textColor: '#8a8f98'
rounded: md
size: '28 × 28'
hover: 'bg #141516; text #f7f8f8'
use: 'header utility — search, theme, account'
card:
backgroundColor: '#0f1011'
border: '1px solid #23252a'
rounded: lg
padding: 24
shadow: none
hover: 'border #34343a; bg #141516'
use: 'feature blocks, doc cards — never shadowed'
card-hero:
backgroundColor: '#0f1011'
border: '1px solid #23252a'
rounded: card
padding: 48
use: 'product-screenshot frames, feature splits'
input:
backgroundColor: '#0f1011'
textColor: '#f7f8f8'
placeholderColor: '#62666d'
border: '1px solid #23252a'
rounded: md
height: 32
padding: '0 10px'
focus: 'border #5e6ad2; ring rgba(94,106,210,0.32) 0 0 0 3px'
font: '14px Inter Variable 400'
use: 'compact dense — matches in-product editor'
pill-status:
backgroundColor: 'rgba(94,106,210,0.12)'
textColor: '#828fff'
border: '1px solid rgba(94,106,210,0.22)'
rounded: pill
padding: '2px 10px'
font: '12px Inter Variable 510'
use: 'status: in-progress / done / blocked — semantic colour swap'
shortcut-chip:
backgroundColor: '#1a1b1d'
textColor: '#d0d6e0'
border: '1px solid #34343a'
rounded: sm
padding: '2px 6px'
font: '11px Berkeley Mono 500 uppercase'
use: 'keyboard shortcuts in marketing copy and tooltips'
navbar:
backgroundColor: 'rgba(8,9,10,0.72)'
backdrop-filter: 'blur(12px) saturate(180%)'
border-bottom: '1px solid #23252a'
height: 72
use: 'sticky top — no shadow on scroll, just border edge'
tooltip:
backgroundColor: '#1a1b1d'
textColor: '#f7f8f8'
border: '1px solid #34343a'
rounded: md
font: '12px Inter Variable 510'
shadow: '0 8px 24px rgba(0,0,0,0.4)'
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
ease-out: 'cubic-bezier(0, 0, 0.2, 1)'
duration-instant: 80
duration-fast: 120
duration-standard: 180
duration-slow: 280
hover-button: 'transform translateY(-1px) over 120ms ease-out; bg shift over 120ms'
hover-card: 'border #34343a transition over 180ms; no transform'
page-transition: 'opacity 200ms ease-standard; no slide'
scroll-fade: 'opacity 0 → 1 over 280ms with translateY(8px) → 0'
reduced-motion: 'respects prefers-reduced-motion: reduce — all transitions to opacity-only, transform disabled'
breakpoints:
mobile: 640
tablet: 768
laptop: 1024
desktop: 1280
wide: 1536
shadows:
none: 'none'
ambient: '0 1px 2px rgba(0,0,0,0.4)'
popover: '0 8px 24px rgba(0,0,0,0.5)'
modal: '0 24px 48px rgba(0,0,0,0.6)'
ring-focus: '0 0 0 3px rgba(94,106,210,0.32)'
ring-cta: '0 0 0 2px #7170ff'
accessibility:
contrast-text-on-bg: 17.4 # #f7f8f8 on #08090a — AAA
contrast-text-on-brand: 4.7 # #ffffff on #5e6ad2 — AA
contrast-cta-text: 18.1 # #08090a on #e5e5e6 — AAA
focus-ring: '3px solid rgba(94,106,210,0.32) offset 2px'
reduced-motion-honored: true
keyboard-nav: 'visible focus on every interactive; tab cycles header → hero CTA → feature grid → footer'
aria-patterns: 'dialog uses role=dialog + aria-modal=true; popover uses role=dialog + aria-labelledby; status pills use aria-live=polite'
dark-mode: native # Linear is dark-first; light variant is in-product only, marketing has no light mode
---
## 1. Visual Theme & Atmosphere
Linear is dark-canvas product design at full conviction. The marketing
site is rendered with the same components, weights, and spatial
language as the in-product editor — a deliberate choice that says
"this is what your team will live in." Pure black `#08090a` ground
(not `#000` — a hair warmer to keep the type from crunching), indigo
`#5e6ad2` accent reserved for emphasis, and the pill-shaped CTA
pattern that mirrors keyboard-shortcut chips throughout the app. The
atmosphere is industrial and dense, like an OLED workstation at
2 a.m.: nothing decorative, every pixel earning its place.
What makes it distinctive vs. nearby alternatives: most dev-tool
sites soften their dark canvases for marketing — bigger margins,
lighter text, playful illustrations. Linear refuses. The site reads
like product documentation that happened to include a sign-up form,
and that's exactly what makes it credible to the workflow-obsessed
engineering teams it targets. There's no hero illustration, no
glowing gradient orbs, no marketing-flavoured motion — just product
screenshots set inside their own native frames, captured from the
real running app.
The mood is deliberate restraint as a flex. Where Stripe choreographs
gradients and Vercel celebrates the wordmark, Linear shows you the
issue tracker. The page is the artefact. The signature design moves
— the 510 sub-pixel weight, the inverted near-white CTA pill, the
Berkeley Mono shortcut chips — are all sourced directly from the
product, never invented for marketing.
**Key Characteristics**
- Pure-near-black `#08090a` ground (warm, not cold; never `#000`)
- Custom Inter Variable weights (`510`, `590`) — sub-pixel between 500 and 600
- Indigo `#5e6ad2` reserved as accent — never primary CTA fill
- Inverted CTA: near-white `#e5e5e6` pill on near-black ground
- Berkeley Mono (paid licence) for shortcuts and code — credibility signal
- 1024px page-width cap on 4K displays — refuses to stretch
- Tonal layering, not shadows, for depth (`#08090a` → `#0f1011` → `#141516`)
- Pill geometry runs through buttons, status chips, and key shortcuts
- No drop shadows on cards; floating UI only
- Marketing site shipped from the product codebase — same components
## 2. Color Palette & Roles
### Primary
- **bg** `#08090a` — page canvas, near-black with a hint of warmth
- **text** `#f7f8f8` — primary copy and headlines, never `#ffffff`
- **cta-fill** `#e5e5e6` — primary button background (the inversion move)
- **cta-text** `#08090a` — ink on the inverted button
### Brand & Dark
- **brand** `#5e6ad2` — Linear indigo, emphasis-only
- **brand-hover** `#7170ff` — active states, focus rings
- **bg-marketing** `#010102` — landing pages, deeper-than-product
- **bg-level-1** `#0f1011` — first elevation (cards, panels)
- **bg-level-2** `#141516` — hover state, second elevation
- **bg-level-3** `#1a1b1d` — popovers, tooltips, third elevation
### Accent
- **accent** `#7170ff` — brighter indigo for active glow / focus
- **link** `#828fff` — link copy on dark, slightly brighter than brand
- **link-hover** `#a3acff`
- **brand-soft** `rgba(94,106,210,0.16)` — tinted callout backdrops
### Interactive
- **cta-fill-hover** `#f3f3f4` — primary button hover lift
- **cta-fill-press** `#cfcfd1` — pressed state
- **brand-press** `#4a55c1` — branded button pressed
- Disabled buttons drop alpha to ~40% rather than swapping hue
### Neutral Scale
- **text** `#f7f8f8` — body
- **text-secondary** `#d0d6e0` — supporting copy
- **text-tertiary** `#8a8f98` — captions, metadata
- **text-quaternary** `#62666d` — placeholders, faint helpers
- **text-disabled** `#3d3f44` — disabled labels
### Surface & Borders
- **surface** `#0f1011` — default card
- **surface-strong** `#141516` — emphasized panel
- **border** `#23252a` — default 1px hairline
- **border-strong** `#34343a` — emphasized rule
- **border-subtle** `rgba(255,255,255,0.06)` — barely-visible
- **border-brand** `#5e6ad2` — active input outline
### Shadow Colors
Shadows are *almost never used on cards.* When they appear (popovers,
modals), they are pure-neutral black, multi-layer:
- **shadow-popover** `0 8px 24px rgba(0,0,0,0.5)`
- **shadow-modal** `0 24px 48px rgba(0,0,0,0.6)`
- **shadow-ambient** `0 1px 2px rgba(0,0,0,0.4)` — sticky-header subtle lift
### Semantic
- **success** `#4cb782` + **success-bg** `rgba(76,183,130,0.12)` + 1px tinted border
- **warning** `#f2c94c` + **warning-bg** `rgba(242,201,76,0.12)`
- **danger** `#eb5757` + **danger-bg** `rgba(235,87,87,0.12)`
- **info** `#5e6ad2` + **info-bg** `rgba(94,106,210,0.12)` — uses the brand
Status pills follow the same pattern: tinted bg + tinted border at
~22% alpha + tinted text at full saturation.
## 3. Typography Rules
### Font Family
- **Primary (display + body)**: Inter Variable, with `"SF Pro Display"`,
`-apple-system`, `system-ui`, `sans-serif` fallback chain
- **Mono**: Berkeley Mono (paid commercial licence, not free Google
font), with `ui-monospace`, `"SF Mono"`, `monospace` fallback
- **OpenType features in use**: `cv11` (alt 1, single-storey), `ss03`
(alt l, single-storey), `cv01` (alt g). These pull Inter slightly
toward Helvetica-Now feel and remove the disambiguating tail on `l`
### Hierarchy
| Role | Font | Size | Weight | Line Height | Tracking | OT Features | Notes |
|---|---|---|---|---|---|---|---|
| display-hero | Inter Var | 80 | 510 | 1.0 | -0.025em | cv11, ss03 | Marketing landing only |
| display | Inter Var | 64 | 510 | 1.05 | -0.022em | cv11, ss03 | Section heroes |
| h1 | Inter Var | 48 | 510 | 1.05 | -0.018em | cv11, ss03 | Page titles |
| h2 | Inter Var | 32 | 510 | 1.15 | -0.015em | cv11, ss03 | Major sections |
| h3 | Inter Var | 22 | 510 | 1.25 | -0.01em | cv11 | Sub-sections |
| h4 | Inter Var | 18 | 510 | 1.3 | -0.005em | cv11 | Card titles |
| eyebrow | Inter Var | 13 | 510 | 1.4 | 0.04em uppercase | — | Section markers |
| body-large | Inter Var | 17 | 400 | 1.55 | -0.01em | cv11 | Hero subhead |
| body | Inter Var | 15 | 400 | 1.55 | -0.005em | cv11 | Default body |
| body-emphasis | Inter Var | 15 | 510 | 1.55 | -0.005em | cv11 | Inline emphasis |
| body-small | Inter Var | 13 | 400 | 1.5 | 0 | — | Footnotes |
| label | Inter Var | 12 | 510 | 1.4 | 0.04em uppercase | — | Form labels |
| caption | Inter Var | 12 | 400 | 1.4 | 0 | — | Metadata |
| micro | Berkeley Mono | 11 | 510 | 1.3 | 0.05em uppercase | — | Eyebrows, tags |
| code-inline | Berkeley Mono | 13 | 400 | 1.5 | 0 | zero, tnum | Inline code |
| code-block | Berkeley Mono | 13 | 400 | 1.6 | 0 | zero, tnum | Code blocks |
| shortcut-chip | Berkeley Mono | 11 | 500 | 1 | 0.02em | — | Key chip ink |
| button | Inter Var | 14 | 510 | 1 | -0.005em | — | Default button |
| button-large | Inter Var | 16 | 510 | 1 | -0.005em | — | Hero CTA |
### Principles
- **The 510 weight is load-bearing.** Linear licenses a custom
intermediate Inter weight (between 500 and 600) for headlines. The
free fallback is `500` — but the 510 cut is what gives the system
its specific, slightly-firmer-than-medium voice.
- **No true bold.** Hierarchy is carried by size and tracking, not
weight. `700` is reserved for code emphasis and the rare wordmark
context — never body.
- **Tracking tightens with size.** Display-hero at `-0.025em` is
almost a third tighter than body. The 80px H1 needs the negative
tracking to feel typographically engineered, not bloated.
- **Mono is brand vocabulary.** Berkeley Mono isn't a fallback — it's
a specific paid licence chosen for its slab-influenced grotesque
shapes. It signals willingness to spend on type to the right
audience.
- **OpenType discipline.** `cv11` + `ss03` are enabled globally. The
alt single-storey `l` and `1` give Inter a more geometric feel and
match the keyboard-chip aesthetic.
- **Reading width caps at 680px** even when the page is 1024px wide.
Multi-column layouts appear in documentation, never on marketing.
## 4. Component Stylings
### Buttons (5 variants)
**Primary (the signature inversion)**
- Background: `#e5e5e6`
- Text: `#08090a` at 14/510
- Padding: `0 20px` (large), `0 12px` (small)
- Height: 40 / 32
- Radius: pill (9999)
- Border: none
- Hover: bg lifts to `#f3f3f4`; transform `translateY(-1px)` over 120ms
- Active: bg `#cfcfd1`
- Focus: `ring 2px #7170ff offset 2px`
- Use: sign-up, get-started, the *one* CTA per screen
**Ghost**
- Background: transparent
- Text: `#d0d6e0` at 14/510
- Border: `1px solid #23252a`
- Radius: pill
- Hover: bg `rgba(255,255,255,0.05)`; text `#f7f8f8`; border `#34343a`
- Use: secondary nav, "Learn more"
**Brand (rare)**
- Background: `#5e6ad2`
- Text: `#ffffff` at 14/510
- Radius: pill
- Hover: bg `#7170ff`
- Use: only when the action must read as brand-coded — beta downloads,
branded downloads. Most pages don't have one.
**Icon**
- Background: transparent → `#141516` on hover
- Size: 28 × 28
- Radius: 8 (md)
- Use: header utilities — search, theme toggle, account
**Destructive**
- Background: `#eb5757` → `#d54848` on hover
- Text: `#ffffff`
- Radius: pill
- Use: confirm-delete dialogs only
### Cards (3 variants)
**Standard card**
- Background: `#0f1011`, Border: `1px solid #23252a`, Radius: 12 (lg)
- Padding: 24, Shadow: none
- Hover: border `#34343a`, bg `#141516`
- Use: feature blocks, doc cards
**Hero card**
- Background: `#0f1011`, Border: `1px solid #23252a`, Radius: 24 (card)
- Padding: 48
- Use: product-screenshot frames
**Tinted brand card**
- Background: `rgba(94,106,210,0.08)`, Border: `1px solid rgba(94,106,210,0.22)`
- Radius: 12
- Use: rare brand-coded callouts (changelog highlights)
### Badges, Tags, Pills
**Status pill** — pill radius, tinted bg + tinted border at ~22% alpha
+ tinted text at full saturation. Used for: in-progress, done, blocked,
in-review. Each maps to semantic colour swap.
**Shortcut chip** — `#1a1b1d` bg, `#34343a` border, Berkeley Mono 11/500
uppercase, 4px radius (small), 2px × 6px padding. Renders as ⌘K, ⇧K, etc.
**Tag** — same as status pill but neutral: `#141516` bg, `#34343a`
border, `#d0d6e0` text. Used for category labels.
### Inputs / Forms
**Text input**
- Background: `#0f1011`, Border: `1px solid #23252a`, Radius: 8
- Height: 32, Padding: `0 10px`
- Font: `14px Inter Variable 400`
- Placeholder: `#62666d`
- Focus: border `#5e6ad2`; ring `rgba(94,106,210,0.32) 0 0 0 3px`
- Disabled: bg `#08090a`, text `#3d3f44`
**Select** — same shell as input + a chevron icon at 12px in
`#8a8f98`; popover follows tooltip styling.
**Checkbox / Radio** — 16 × 16, `1px solid #34343a`, 4px radius
(checkbox) or 9999 (radio); checked fill is brand `#5e6ad2`.
### Navigation
**Top nav**: 72px tall, `rgba(8,9,10,0.72)` bg with `backdrop-filter:
blur(12px) saturate(180%)`, 1px bottom border `#23252a`. Sticky on
scroll — no shadow added, just the border edge.
**Footer**: dark with low-contrast `#62666d` text on bg-marketing
`#010102`; 1px top border.
**Side nav (docs)**: tonal column at `bg-level-1` with `#23252a` rule
on the right; active item gets `bg-level-2` + 2px brand left border.
### Tooltips & Popovers
Tooltip: `#1a1b1d` bg, `#34343a` border, 8 radius, `12px Inter 510`
text, 6 × 10 padding. Shadow `0 8px 24px rgba(0,0,0,0.5)`.
Popover (combobox, menu): `#1a1b1d` bg with same border and shadow,
12 radius, max-width 320, list items use 6/8 padding.
### Toasts
Bottom-right stack, each toast is `#141516` with 1px `#34343a` border,
12 radius, semantic icon at left, body 14/400, optional close at
right. Auto-dismiss 4 seconds; respects reduced motion.
### Modals
Centered overlay on `rgba(8,9,10,0.72)` scrim with backdrop blur.
Dialog box at `#141516`, 16 radius, 24 padding, 1px `#34343a` border,
shadow `0 24px 48px rgba(0,0,0,0.6)`. Title at h3 510, body 15/400,
action row pinned to footer with primary CTA on the right.
## 5. Layout Principles
### Spacing System
- **Base unit**: 4px
- **Scale**: `[0, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96, 120, 160]`
- The system favours small steps (2, 6) for in-component spacing and
big jumps (96, 120) for section rhythm. There's almost no use of
10 or 14 — the ladder is even-only.
- Density is product-grade: 8px between form rows, 4px between an
icon and its label, 16px between cards. The marketing page inherits
the editor's tight spacing.
### Grid & Container
- **Page width**: 1024px max, even on 4K displays
- **Prose width**: 680px — multi-paragraph copy is always capped at
this width within the 1024 frame
- **Gutter**: 24px
- **Grid**: 12 columns on tablet+, 4 columns on mobile
- Hero treatment: full-bleed bg + centred 1024 content; product
screenshot lives inside its own card, not full-bleed
- Feature grid: 1.4fr / 1fr asymmetric splits when one side deserves
visual primacy (product screenshot vs. copy)
### Whitespace Philosophy
Linear is dense by product DNA but generous on marketing rhythm.
Sections breathe at 96–120px vertical gutters; *within* sections the
density tightens immediately to product values (8–24px). The
juxtaposition is the brand's tempo: macro-relaxed, micro-tight.
### Section Cadence
Linear refuses light/dark alternation entirely. The whole site stays
on `#08090a` (or deeper `#010102` on landing pages); section breaks
are tonal — `bg-level-1` panels stand against the canvas, not new
colours. The exception is changelog/customer-quote bands which lift
to `bg-level-2` for one viewport then return to canvas.
## 6. Shapes & Radius Scale
| Tier | px | Use |
|---|---|---|
| Micro | 2 | Decorative slashes, chip corners |
| Standard | 4 | Shortcut chips, inline tags, micro-pills |
| Comfortable | 8 | Inputs, icon buttons, default cards |
| Relaxed | 12 | Cards, panel containers |
| Large | 16 | Modal bodies, hero panels |
| Featured | 24 | Card-hero (product-screenshot frames) |
| Pill | 9999 | Buttons, status pills, avatar mode |
The pill is the system's signature — once you see it on a key
shortcut chip you can't unsee it on the CTAs and status indicators.
There is essentially no `0px` radius element except section dividers
(1px hairline rules); the system has no sharp corners.
Compound radii appear only in modal headers (`16 16 0 0` to lock to
the body) and in pinned tab strips (`8 8 0 0`).
## 7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | flat — `#08090a` only | page canvas |
| 1 | `#0f1011` + 1px `#23252a` border | cards, panels |
| 2 | `#141516` + 1px `#34343a` border | hover, emphasized |
| 3 | `#1a1b1d` + ambient shadow `0 1px 2px rgba(0,0,0,0.4)` | sticky header, eyebrow |
| 4 | `#1a1b1d` + popover shadow `0 8px 24px rgba(0,0,0,0.5)` | tooltips, menus, popovers |
| 5 | `#141516` + modal shadow `0 24px 48px rgba(0,0,0,0.6)` + scrim | modals, dialogs |
### Shadow Philosophy
Linear uses **tonal stacking** as its default depth language. Each
elevation step is roughly 8% lightness — barely perceptible
individually, deliberately readable as a stack. Borders pick up
where tone alone is too subtle: `#23252a` → `#34343a` is the
two-step border ladder.
Drop shadows are **floating UI only**: popovers, tooltips, modals,
toasts. Cards never carry shadows; the border + tonal lift do all
the work. Shadows are pure neutral black (no tint), multi-layer when
deep (modal). The result is a system that reads as solid surfaces
on a solid ground, not floating glass.
## 8. Interaction & Motion ✨
### Easing curves
- **ease-standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for
hover/state transitions
- **ease-emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — page enters,
modal slide-in
- **ease-out**: `cubic-bezier(0, 0, 0.2, 1)` — settling motions
### Duration buckets
- **instant**: 80ms — focus-ring appearance
- **fast**: 120ms — button hover, state changes
- **standard**: 180ms — card hover, popover open
- **slow**: 280ms — modal enter, scroll-fade
### Per-component micro-states
- **Button hover**: `translateY(-1px)` + bg lift over 120ms ease-out
- **Button active**: `translateY(0)` + bg press over 80ms
- **Card hover**: border colour transition `#23252a → #34343a` over
180ms ease-standard; bg lift `#0f1011 → #141516`; *no transform*
- **Link hover**: colour shift only, 120ms; no underline grow (Linear
uses static underlines on body links)
- **Popover open**: opacity 0 → 1 + scale 0.96 → 1 over 180ms
ease-emphasized
- **Modal enter**: scrim fade 280ms + dialog slide from `translateY(8px)`
to 0 over 280ms ease-emphasized
- **Toast enter**: slide from `translateX(16px)` + opacity, 280ms
ease-emphasized; auto-dismiss after 4s
### Page transitions
Linear avoids slide transitions on marketing — page changes are full
opacity 0 → 1 over 200ms. Scroll-fade for in-view content uses
opacity + 8px translateY → 0 over 280ms.
### Reduced motion
Respects `prefers-reduced-motion: reduce`. All transforms disabled,
all transitions reduced to opacity-only at the same durations. The
sticky-header backdrop-blur stays on (it's not motion).
## 9. Accessibility & A11y ✨
### Contrast pairs
- **#f7f8f8 on #08090a (text on bg)**: 17.4 — AAA at all sizes
- **#d0d6e0 on #08090a (secondary on bg)**: 13.1 — AAA
- **#8a8f98 on #08090a (tertiary on bg)**: 5.4 — AA body, fails AAA at small
- **#08090a on #e5e5e6 (CTA text)**: 18.1 — AAA
- **#ffffff on #5e6ad2 (text on brand)**: 4.7 — AA at body sizes
- **#828fff on #08090a (link)**: 8.2 — AAA
### Focus indicators
All interactive elements ship a focus ring: `3px solid
rgba(94,106,210,0.32)` with 2px offset on dark surfaces, never
outline-style — always box-shadow ring so it composites cleanly over
borders. Brand inputs get the lighter `#7170ff` 2px solid ring.
### ARIA patterns
- **Combobox** (search): `role=combobox` + `aria-expanded` +
`aria-controls` + `aria-activedescendant`
- **Listbox**: `role=listbox` with `role=option` children, arrow-key
navigation, Enter to select, Esc to dismiss
- **Dialog**: `role=dialog` + `aria-modal=true` + `aria-labelledby`
pointing to title node
- **Status pills**: `aria-live=polite` for in-page state changes
- **Shortcut chips**: paired with `aria-keyshortcuts` on the parent
control
### Keyboard nav
Tab order: header logo → nav links → header CTA → hero CTA → in-page
sections → footer. Skip-to-content link appears on Tab focus before
the header. All buttons and links are reachable via keyboard;
keyboard shortcuts are documented in the help menu (`?`).
### Screen reader hints
- Icon-only buttons carry `aria-label` (e.g., `aria-label="Search"`)
- Decorative icons get `aria-hidden=true`
- Status pills include their state in `aria-label` (e.g.,
`aria-label="Status: in progress"`)
### Reduced motion
Honoured globally; see §8. Auto-playing GIFs in changelog respect
the same query and freeze on first frame.
## 10. Responsive Behavior
| Breakpoint | px | Layout |
|---|---|---|
| mobile | < 640 | single-column, 16px gutter, h1 → 32px |
| tablet | 640–1023 | 2-column on splits, 20px gutter, h1 → 40px |
| laptop | 1024–1279 | full 1024 layout, 12-col grid, h1 → 48px |
| desktop | 1280–1535 | same as laptop — page caps at 1024 |
| wide | ≥ 1536 | same as laptop — refuses to stretch |
### Touch targets
Minimum 44 × 44 on mobile (buttons grow vertical padding from 8 to
12; icon buttons grow to 36 × 36). Tap targets use the same pill
geometry — fingerprint matches desktop.
### Collapsing strategy
- Header collapses to hamburger at ≤ 768
- Feature grids switch from 1.4fr/1fr asymmetric to single-column
stack at ≤ 768
- Tables (changelog, comparison) become card lists at ≤ 640
- Sticky sidebar (docs) becomes a top sheet on mobile
### Image behavior
Product screenshots use `aspect-ratio: 16 / 10` and `object-fit:
cover` with `loading=lazy`. SVG illustrations are inline and respect
`currentColor`. No image gets a border-radius mismatch from its
parent card.
### Container queries
Used in card-hero variants where the screenshot frame switches from
landscape to portrait based on container width below 480px.
## 11. Content & Voice ✨
### Tone
Direct, technical, slightly understated. Linear writes like an
engineer pair-reviewing a PR: declarative, present-tense, allergic
to hype. Sentences cap at ~14 words; metaphors are rare and always
mechanical when used.
### Microcopy patterns
- **Button verbs**: "Get started", "Sign in", "Try Linear", "Start
building" — short, imperative, present-tense. Never "Click here"
or "Learn more about our..."
- **Errors**: format `<noun> couldn't be <verbed>. <one-sentence
reason>.` Example: "Issue couldn't be saved. You're offline."
- **Success confirmations**: terse, no exclamation marks. Example:
"Issue updated."
- **Progress**: `Saving...` rather than `Please wait...`
### Empty states
Empty list views in the marketing demo show: short headline (e.g.,
"No issues yet"), one-line orientation, and a single CTA. No
illustration, no upbeat encouragement.
### CTA verb conventions
The verb ladder Linear uses, in observed frequency:
1. **Get started** — top-of-page hero CTA
2. **Try Linear** — secondary on landing
3. **Sign in** — utility nav
4. **Start building** — developer-facing pages
5. **See pricing** — pricing-link surface
Linear avoids "Sign up free" / "Free trial" / "Free forever" — the
free-tier fact is mentioned in copy below the CTA, not in the verb.
## 12. Dark Mode & Theming ✨
Linear is **dark-first by design**. The marketing site has no light
mode — the in-product editor offers a light theme but the public
website ships dark only. The brand identity is the dark canvas;
inverting it would break recognition.
If a downstream system needs to derive a light variant from these
tokens (e.g., for a light-mode docs portal):
```yaml
colors-light:
bg: '#ffffff'
bg-level-1: '#fafbfc'
bg-level-2: '#f4f5f8'
text: '#08090a'
text-secondary: '#393a3f'
text-tertiary: '#62666d'
brand: '#5e6ad2' # unchanged
border: '#e1e3e8'
cta-fill: '#08090a' # inverts the inversion
cta-text: '#ffffff'
```
But Linear's own marketing surface stays dark. This is intentional.
## 13. Lineage & Influences
Linear's marketing surface is engineered as a continuation of the
product, not a separate brand layer. The lineage runs through three
strands: dark-canvas product design (Vercel, Modal), keyboard-first
power tools (Sublime Text, Raycast, Superhuman), and Bay-Area-tech
typography discipline (Apple, Stripe). What Linear inherits is the
willingness to refuse marketing softening — to treat the website as
documentation. What it adds is the specific 510-weight Inter cut
and the inverted near-white CTA pill, both unique to this system.
What it rejects: Stripe-class chromatic gradients, Apple-class
glassy chrome, GitHub-class playful illustration. The system has no
mascot, no gradient mark, no decorative element. It also rejects
the Vercel move of using the brand wordmark as the hero — Linear's
hero is always the product itself, never the logo.
**Influences:**
- **Apple SF Pro Display** — Type fallback discipline; sets the
Bay-Area-tech baseline that Inter's variable cut continues
([apple.com/fonts](https://developer.apple.com/fonts/))
- **Berkeley Mono** — Paid licensed mono for shortcut chips and
code; credibility signal to engineers
([berkeleygraphics.com](https://berkeleygraphics.com/typefaces/berkeley-mono/))
- **Vercel Geist** — Adjacent dev-tool typography lineage; both
prove sans Inter-family for product UI ([vercel.com/font](https://vercel.com/font))
- **Raycast** — Keyboard-shortcut chip aesthetic; Linear's chip
geometry shares Raycast's mono-inside-rounded pattern
- **Superhuman** — Keyboard-first product UX; Linear inherits the
density and shortcut-as-first-class-citizen philosophy
## 14. Do's and Don'ts
### Do
- Treat the brand color as accent-only. Linear's indigo is
punctuation, not a CTA fill — invert to white-on-near-black for
the primary action.
- Use custom intermediate Inter weights (`510`, `590`) when
available; fall back to `500` / `600` only when shipping to
runtimes without variable-font support.
- Cap page width at 1024px even on 4K displays. Wider lines hurt
product credibility.
- Use tonal layering (`#08090a` → `#0f1011` → `#141516`) for depth.
Each step is ~8% lightness.
- Render keyboard shortcuts in Berkeley Mono inside `#1a1b1d` chips
with `#34343a` borders and 4px radius.
- Use the pill (9999) for CTAs, status indicators, and any
emphasis-bearing geometry.
- Honor `prefers-reduced-motion` — switch all transforms to
opacity-only.
- Cap reading width at 680px even when the page is 1024.
- Ship the marketing site from the product codebase — match
components 1:1.
- Use mono micro-labels (Berkeley Mono 11px uppercase) as section
eyebrows.
### Don't
- Soften dark canvases for marketing — the product is dark, the site
should be dark.
- Add drop shadows on cards. Use tonal layering or borders.
- Mix the pill (`9999px`) with sharp `0px` — the system has no
zero-radius elements except section dividers.
- Use brand indigo `#5e6ad2` as a CTA fill colour. The CTA inverts
to near-white; brand indigo is for accents, links, and tinted
backgrounds.
- Introduce a second saturated colour. Linear's chromatic budget is
one indigo plus the semantic four.
- Use pure `#000` or `#ffffff` — both are off by design (`#08090a`,
`#f7f8f8`).
- Centre H1s. Linear's headlines are left-aligned, period.
- Replace Berkeley Mono with a free Google fallback in production.
The whole point of the choice is the licence.
- Use slide-in page transitions. Opacity-only matches the system.
- Stretch product screenshots wider than 1024 — they sit inside
cards, never full-bleed.
## 15. Agent Prompt Guide
### Quick Color Reference
```
bg: #08090a
text: #f7f8f8
text-muted: #8a8f98
brand: #5e6ad2
accent: #7170ff
link: #828fff
border: #23252a
cta-fill: #e5e5e6
cta-text: #08090a
chip-bg: #1a1b1d
success: #4cb782
danger: #eb5757
```
### Example Component Prompts
1. **Hero**: "Create a hero section on `#08090a` background with a
left-aligned 64px Inter Variable headline at weight 510 and
`-0.022em` tracking, body copy at 17px/400 in `#f7f8f8`, capped
at 680px reading width, with a single primary CTA: a pill button
filled `#e5e5e6` with `#08090a` text reading 'Get started'."
2. **Card**: "Design a feature card with `#0f1011` background, 1px
`#23252a` border, 12px radius, 24px padding, no shadow. Title at
18px Inter 510, body at 15px/400 in `#d0d6e0`. On hover, transition
border to `#34343a` and bg to `#141516` over 180ms."
3. **Status pill**: "Render a status pill with pill radius (9999),
`rgba(94,106,210,0.12)` background, `rgba(94,106,210,0.22)` border,
`#828fff` text at 12px Inter 510, 2px × 10px padding. Vary the
colour to map to in-progress (brand) / done (success `#4cb782`) /
blocked (danger `#eb5757`)."
4. **Shortcut chip**: "Build a keyboard-shortcut chip: `#1a1b1d`
background, 1px `#34343a` border, 4px radius, 11px Berkeley Mono
500 uppercase text in `#d0d6e0`, 2px × 6px padding. Use for ⌘K,
⇧K, Esc — render as a small inline element next to its label."
5. **Sticky nav**: "Make a 72px-tall sticky nav with
`rgba(8,9,10,0.72)` background, `backdrop-filter: blur(12px)
saturate(180%)`, 1px bottom border `#23252a`. Logo on the left,
utility nav (search icon, account) on the right; on scroll the
border edge stays — no shadow added."
6. **Inverted CTA pill**: "Create a primary CTA button: pill radius
(9999), `#e5e5e6` background, `#08090a` text at 14px Inter Variable
weight 510, padding `0 20px`, height 40. Hover: bg `#f3f3f4` +
`translateY(-1px)` over 120ms ease-out. Focus: `0 0 0 2px #7170ff`
ring with 2px offset."
### Iteration Guide
1. **Pure-near-black, not pure black.** If your `bg` reads as
`#000`, soften by 1–2 lightness points to `#08090a`. The warmth
prevents type crunch.
2. **CTA inverts.** If your primary action is brand-coloured, you've
missed the central move. Flip it: near-white pill on near-black
ground. Brand colour goes on accents, links, and tinted bgs only.
3. **Custom Inter weight or fallback.** Prefer Inter Variable at 510
for headlines; fall back to 500 only when variable isn't shipping.
Never use 600 — it crosses into the wrong density.
4. **No card shadows.** If a card needs depth, lift its bg one tonal
step (`#0f1011 → #141516`) and tighten its border. Shadows belong
to floating UI only.
5. **Pill the CTAs and status.** Mixing pill (9999) with rectilinear
buttons (8px) breaks the system. Choose pill for any
emphasis-bearing rounded geometry.
6. **1024 cap.** Never let the page stretch past 1024 even on 4K.
The product credibility comes from the spatial discipline.
7. **Mono = Berkeley.** When using a code or chip surface, prefer
Berkeley Mono. If the licence isn't available, JetBrains Mono is
the closest free substitute — but acknowledge the downgrade.
8. **Reduced motion always.** Respect `prefers-reduced-motion` on
every transition. Linear's motion is restrained even at full —
reduced should feel almost identical.
1. Visual Theme & Atmosphere
Linear is dark-canvas product design at full conviction. The marketing
site is rendered with the same components, weights, and spatial
language as the in-product editor — a deliberate choice that says
“this is what your team will live in.” Pure black #08090a ground
(not #000 — a hair warmer to keep the type from crunching), indigo
#5e6ad2 accent reserved for emphasis, and the pill-shaped CTA
pattern that mirrors keyboard-shortcut chips throughout the app. The
atmosphere is industrial and dense, like an OLED workstation at
2 a.m.: nothing decorative, every pixel earning its place.
What makes it distinctive vs. nearby alternatives: most dev-tool sites soften their dark canvases for marketing — bigger margins, lighter text, playful illustrations. Linear refuses. The site reads like product documentation that happened to include a sign-up form, and that’s exactly what makes it credible to the workflow-obsessed engineering teams it targets. There’s no hero illustration, no glowing gradient orbs, no marketing-flavoured motion — just product screenshots set inside their own native frames, captured from the real running app.
The mood is deliberate restraint as a flex. Where Stripe choreographs gradients and Vercel celebrates the wordmark, Linear shows you the issue tracker. The page is the artefact. The signature design moves — the 510 sub-pixel weight, the inverted near-white CTA pill, the Berkeley Mono shortcut chips — are all sourced directly from the product, never invented for marketing.
Key Characteristics
- Pure-near-black
#08090aground (warm, not cold; never#000) - Custom Inter Variable weights (
510,590) — sub-pixel between 500 and 600 - Indigo
#5e6ad2reserved as accent — never primary CTA fill - Inverted CTA: near-white
#e5e5e6pill on near-black ground - Berkeley Mono (paid licence) for shortcuts and code — credibility signal
- 1024px page-width cap on 4K displays — refuses to stretch
- Tonal layering, not shadows, for depth (
#08090a→#0f1011→#141516) - Pill geometry runs through buttons, status chips, and key shortcuts
- No drop shadows on cards; floating UI only
- Marketing site shipped from the product codebase — same components
2. Color Palette & Roles
Primary
- bg
#08090a— page canvas, near-black with a hint of warmth - text
#f7f8f8— primary copy and headlines, never#ffffff - cta-fill
#e5e5e6— primary button background (the inversion move) - cta-text
#08090a— ink on the inverted button
Brand & Dark
- brand
#5e6ad2— Linear indigo, emphasis-only - brand-hover
#7170ff— active states, focus rings - bg-marketing
#010102— landing pages, deeper-than-product - bg-level-1
#0f1011— first elevation (cards, panels) - bg-level-2
#141516— hover state, second elevation - bg-level-3
#1a1b1d— popovers, tooltips, third elevation
Accent
- accent
#7170ff— brighter indigo for active glow / focus - link
#828fff— link copy on dark, slightly brighter than brand - link-hover
#a3acff - brand-soft
rgba(94,106,210,0.16)— tinted callout backdrops
Interactive
- cta-fill-hover
#f3f3f4— primary button hover lift - cta-fill-press
#cfcfd1— pressed state - brand-press
#4a55c1— branded button pressed - Disabled buttons drop alpha to ~40% rather than swapping hue
Neutral Scale
- text
#f7f8f8— body - text-secondary
#d0d6e0— supporting copy - text-tertiary
#8a8f98— captions, metadata - text-quaternary
#62666d— placeholders, faint helpers - text-disabled
#3d3f44— disabled labels
Surface & Borders
- surface
#0f1011— default card - surface-strong
#141516— emphasized panel - border
#23252a— default 1px hairline - border-strong
#34343a— emphasized rule - border-subtle
rgba(255,255,255,0.06)— barely-visible - border-brand
#5e6ad2— active input outline
Shadow Colors
Shadows are almost never used on cards. When they appear (popovers, modals), they are pure-neutral black, multi-layer:
- shadow-popover
0 8px 24px rgba(0,0,0,0.5) - shadow-modal
0 24px 48px rgba(0,0,0,0.6) - shadow-ambient
0 1px 2px rgba(0,0,0,0.4)— sticky-header subtle lift
Semantic
- success
#4cb782+ success-bgrgba(76,183,130,0.12)+ 1px tinted border - warning
#f2c94c+ warning-bgrgba(242,201,76,0.12) - danger
#eb5757+ danger-bgrgba(235,87,87,0.12) - info
#5e6ad2+ info-bgrgba(94,106,210,0.12)— uses the brand
Status pills follow the same pattern: tinted bg + tinted border at ~22% alpha + tinted text at full saturation.
3. Typography Rules
Font Family
- Primary (display + body): Inter Variable, with
"SF Pro Display",-apple-system,system-ui,sans-seriffallback chain - Mono: Berkeley Mono (paid commercial licence, not free Google
font), with
ui-monospace,"SF Mono",monospacefallback - OpenType features in use:
cv11(alt 1, single-storey),ss03(alt l, single-storey),cv01(alt g). These pull Inter slightly toward Helvetica-Now feel and remove the disambiguating tail onl
Hierarchy
| Role | Font | Size | Weight | Line Height | Tracking | OT Features | Notes |
|---|---|---|---|---|---|---|---|
| display-hero | Inter Var | 80 | 510 | 1.0 | -0.025em | cv11, ss03 | Marketing landing only |
| display | Inter Var | 64 | 510 | 1.05 | -0.022em | cv11, ss03 | Section heroes |
| h1 | Inter Var | 48 | 510 | 1.05 | -0.018em | cv11, ss03 | Page titles |
| h2 | Inter Var | 32 | 510 | 1.15 | -0.015em | cv11, ss03 | Major sections |
| h3 | Inter Var | 22 | 510 | 1.25 | -0.01em | cv11 | Sub-sections |
| h4 | Inter Var | 18 | 510 | 1.3 | -0.005em | cv11 | Card titles |
| eyebrow | Inter Var | 13 | 510 | 1.4 | 0.04em uppercase | — | Section markers |
| body-large | Inter Var | 17 | 400 | 1.55 | -0.01em | cv11 | Hero subhead |
| body | Inter Var | 15 | 400 | 1.55 | -0.005em | cv11 | Default body |
| body-emphasis | Inter Var | 15 | 510 | 1.55 | -0.005em | cv11 | Inline emphasis |
| body-small | Inter Var | 13 | 400 | 1.5 | 0 | — | Footnotes |
| label | Inter Var | 12 | 510 | 1.4 | 0.04em uppercase | — | Form labels |
| caption | Inter Var | 12 | 400 | 1.4 | 0 | — | Metadata |
| micro | Berkeley Mono | 11 | 510 | 1.3 | 0.05em uppercase | — | Eyebrows, tags |
| code-inline | Berkeley Mono | 13 | 400 | 1.5 | 0 | zero, tnum | Inline code |
| code-block | Berkeley Mono | 13 | 400 | 1.6 | 0 | zero, tnum | Code blocks |
| shortcut-chip | Berkeley Mono | 11 | 500 | 1 | 0.02em | — | Key chip ink |
| button | Inter Var | 14 | 510 | 1 | -0.005em | — | Default button |
| button-large | Inter Var | 16 | 510 | 1 | -0.005em | — | Hero CTA |
Principles
- The 510 weight is load-bearing. Linear licenses a custom
intermediate Inter weight (between 500 and 600) for headlines. The
free fallback is
500— but the 510 cut is what gives the system its specific, slightly-firmer-than-medium voice. - No true bold. Hierarchy is carried by size and tracking, not
weight.
700is reserved for code emphasis and the rare wordmark context — never body. - Tracking tightens with size. Display-hero at
-0.025emis almost a third tighter than body. The 80px H1 needs the negative tracking to feel typographically engineered, not bloated. - Mono is brand vocabulary. Berkeley Mono isn’t a fallback — it’s a specific paid licence chosen for its slab-influenced grotesque shapes. It signals willingness to spend on type to the right audience.
- OpenType discipline.
cv11+ss03are enabled globally. The alt single-storeyland1give Inter a more geometric feel and match the keyboard-chip aesthetic. - Reading width caps at 680px even when the page is 1024px wide. Multi-column layouts appear in documentation, never on marketing.
4. Component Stylings
Buttons (5 variants)
Primary (the signature inversion)
- Background:
#e5e5e6 - Text:
#08090aat 14/510 - Padding:
0 20px(large),0 12px(small) - Height: 40 / 32
- Radius: pill (9999)
- Border: none
- Hover: bg lifts to
#f3f3f4; transformtranslateY(-1px)over 120ms - Active: bg
#cfcfd1 - Focus:
ring 2px #7170ff offset 2px - Use: sign-up, get-started, the one CTA per screen
Ghost
- Background: transparent
- Text:
#d0d6e0at 14/510 - Border:
1px solid #23252a - Radius: pill
- Hover: bg
rgba(255,255,255,0.05); text#f7f8f8; border#34343a - Use: secondary nav, “Learn more”
Brand (rare)
- Background:
#5e6ad2 - Text:
#ffffffat 14/510 - Radius: pill
- Hover: bg
#7170ff - Use: only when the action must read as brand-coded — beta downloads, branded downloads. Most pages don’t have one.
Icon
- Background: transparent →
#141516on hover - Size: 28 × 28
- Radius: 8 (md)
- Use: header utilities — search, theme toggle, account
Destructive
- Background:
#eb5757→#d54848on hover - Text:
#ffffff - Radius: pill
- Use: confirm-delete dialogs only
Cards (3 variants)
Standard card
- Background:
#0f1011, Border:1px solid #23252a, Radius: 12 (lg) - Padding: 24, Shadow: none
- Hover: border
#34343a, bg#141516 - Use: feature blocks, doc cards
Hero card
- Background:
#0f1011, Border:1px solid #23252a, Radius: 24 (card) - Padding: 48
- Use: product-screenshot frames
Tinted brand card
- Background:
rgba(94,106,210,0.08), Border:1px solid rgba(94,106,210,0.22) - Radius: 12
- Use: rare brand-coded callouts (changelog highlights)
Badges, Tags, Pills
Status pill — pill radius, tinted bg + tinted border at ~22% alpha
- tinted text at full saturation. Used for: in-progress, done, blocked, in-review. Each maps to semantic colour swap.
Shortcut chip — #1a1b1d bg, #34343a border, Berkeley Mono 11/500
uppercase, 4px radius (small), 2px × 6px padding. Renders as ⌘K, ⇧K, etc.
Tag — same as status pill but neutral: #141516 bg, #34343a
border, #d0d6e0 text. Used for category labels.
Inputs / Forms
Text input
- Background:
#0f1011, Border:1px solid #23252a, Radius: 8 - Height: 32, Padding:
0 10px - Font:
14px Inter Variable 400 - Placeholder:
#62666d - Focus: border
#5e6ad2; ringrgba(94,106,210,0.32) 0 0 0 3px - Disabled: bg
#08090a, text#3d3f44
Select — same shell as input + a chevron icon at 12px in
#8a8f98; popover follows tooltip styling.
Checkbox / Radio — 16 × 16, 1px solid #34343a, 4px radius
(checkbox) or 9999 (radio); checked fill is brand #5e6ad2.
Navigation
Top nav: 72px tall, rgba(8,9,10,0.72) bg with backdrop-filter: blur(12px) saturate(180%), 1px bottom border #23252a. Sticky on
scroll — no shadow added, just the border edge.
Footer: dark with low-contrast #62666d text on bg-marketing
#010102; 1px top border.
Side nav (docs): tonal column at bg-level-1 with #23252a rule
on the right; active item gets bg-level-2 + 2px brand left border.
Tooltips & Popovers
Tooltip: #1a1b1d bg, #34343a border, 8 radius, 12px Inter 510
text, 6 × 10 padding. Shadow 0 8px 24px rgba(0,0,0,0.5).
Popover (combobox, menu): #1a1b1d bg with same border and shadow,
12 radius, max-width 320, list items use 6/8 padding.
Toasts
Bottom-right stack, each toast is #141516 with 1px #34343a border,
12 radius, semantic icon at left, body 14/400, optional close at
right. Auto-dismiss 4 seconds; respects reduced motion.
Modals
Centered overlay on rgba(8,9,10,0.72) scrim with backdrop blur.
Dialog box at #141516, 16 radius, 24 padding, 1px #34343a border,
shadow 0 24px 48px rgba(0,0,0,0.6). Title at h3 510, body 15/400,
action row pinned to footer with primary CTA on the right.
5. Layout Principles
Spacing System
- Base unit: 4px
- Scale:
[0, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96, 120, 160] - The system favours small steps (2, 6) for in-component spacing and big jumps (96, 120) for section rhythm. There’s almost no use of 10 or 14 — the ladder is even-only.
- Density is product-grade: 8px between form rows, 4px between an icon and its label, 16px between cards. The marketing page inherits the editor’s tight spacing.
Grid & Container
- Page width: 1024px max, even on 4K displays
- Prose width: 680px — multi-paragraph copy is always capped at this width within the 1024 frame
- Gutter: 24px
- Grid: 12 columns on tablet+, 4 columns on mobile
- Hero treatment: full-bleed bg + centred 1024 content; product screenshot lives inside its own card, not full-bleed
- Feature grid: 1.4fr / 1fr asymmetric splits when one side deserves visual primacy (product screenshot vs. copy)
Whitespace Philosophy
Linear is dense by product DNA but generous on marketing rhythm. Sections breathe at 96–120px vertical gutters; within sections the density tightens immediately to product values (8–24px). The juxtaposition is the brand’s tempo: macro-relaxed, micro-tight.
Section Cadence
Linear refuses light/dark alternation entirely. The whole site stays
on #08090a (or deeper #010102 on landing pages); section breaks
are tonal — bg-level-1 panels stand against the canvas, not new
colours. The exception is changelog/customer-quote bands which lift
to bg-level-2 for one viewport then return to canvas.
6. Shapes & Radius Scale
| Tier | px | Use |
|---|---|---|
| Micro | 2 | Decorative slashes, chip corners |
| Standard | 4 | Shortcut chips, inline tags, micro-pills |
| Comfortable | 8 | Inputs, icon buttons, default cards |
| Relaxed | 12 | Cards, panel containers |
| Large | 16 | Modal bodies, hero panels |
| Featured | 24 | Card-hero (product-screenshot frames) |
| Pill | 9999 | Buttons, status pills, avatar mode |
The pill is the system’s signature — once you see it on a key
shortcut chip you can’t unsee it on the CTAs and status indicators.
There is essentially no 0px radius element except section dividers
(1px hairline rules); the system has no sharp corners.
Compound radii appear only in modal headers (16 16 0 0 to lock to
the body) and in pinned tab strips (8 8 0 0).
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | flat — #08090a only | page canvas |
| 1 | #0f1011 + 1px #23252a border | cards, panels |
| 2 | #141516 + 1px #34343a border | hover, emphasized |
| 3 | #1a1b1d + ambient shadow 0 1px 2px rgba(0,0,0,0.4) | sticky header, eyebrow |
| 4 | #1a1b1d + popover shadow 0 8px 24px rgba(0,0,0,0.5) | tooltips, menus, popovers |
| 5 | #141516 + modal shadow 0 24px 48px rgba(0,0,0,0.6) + scrim | modals, dialogs |
Shadow Philosophy
Linear uses tonal stacking as its default depth language. Each
elevation step is roughly 8% lightness — barely perceptible
individually, deliberately readable as a stack. Borders pick up
where tone alone is too subtle: #23252a → #34343a is the
two-step border ladder.
Drop shadows are floating UI only: popovers, tooltips, modals, toasts. Cards never carry shadows; the border + tonal lift do all the work. Shadows are pure neutral black (no tint), multi-layer when deep (modal). The result is a system that reads as solid surfaces on a solid ground, not floating glass.
8. Interaction & Motion ✨
Easing curves
- ease-standard:
cubic-bezier(0.4, 0, 0.2, 1)— default for hover/state transitions - ease-emphasized:
cubic-bezier(0.2, 0, 0, 1)— page enters, modal slide-in - ease-out:
cubic-bezier(0, 0, 0.2, 1)— settling motions
Duration buckets
- instant: 80ms — focus-ring appearance
- fast: 120ms — button hover, state changes
- standard: 180ms — card hover, popover open
- slow: 280ms — modal enter, scroll-fade
Per-component micro-states
- Button hover:
translateY(-1px)+ bg lift over 120ms ease-out - Button active:
translateY(0)+ bg press over 80ms - Card hover: border colour transition
#23252a → #34343aover 180ms ease-standard; bg lift#0f1011 → #141516; no transform - Link hover: colour shift only, 120ms; no underline grow (Linear uses static underlines on body links)
- Popover open: opacity 0 → 1 + scale 0.96 → 1 over 180ms ease-emphasized
- Modal enter: scrim fade 280ms + dialog slide from
translateY(8px)to 0 over 280ms ease-emphasized - Toast enter: slide from
translateX(16px)+ opacity, 280ms ease-emphasized; auto-dismiss after 4s
Page transitions
Linear avoids slide transitions on marketing — page changes are full opacity 0 → 1 over 200ms. Scroll-fade for in-view content uses opacity + 8px translateY → 0 over 280ms.
Reduced motion
Respects prefers-reduced-motion: reduce. All transforms disabled,
all transitions reduced to opacity-only at the same durations. The
sticky-header backdrop-blur stays on (it’s not motion).
9. Accessibility & A11y ✨
Contrast pairs
- #f7f8f8 on #08090a (text on bg): 17.4 — AAA at all sizes
- #d0d6e0 on #08090a (secondary on bg): 13.1 — AAA
- #8a8f98 on #08090a (tertiary on bg): 5.4 — AA body, fails AAA at small
- #08090a on #e5e5e6 (CTA text): 18.1 — AAA
- #ffffff on #5e6ad2 (text on brand): 4.7 — AA at body sizes
- #828fff on #08090a (link): 8.2 — AAA
Focus indicators
All interactive elements ship a focus ring: 3px solid rgba(94,106,210,0.32) with 2px offset on dark surfaces, never
outline-style — always box-shadow ring so it composites cleanly over
borders. Brand inputs get the lighter #7170ff 2px solid ring.
ARIA patterns
- Combobox (search):
role=combobox+aria-expanded+aria-controls+aria-activedescendant - Listbox:
role=listboxwithrole=optionchildren, arrow-key navigation, Enter to select, Esc to dismiss - Dialog:
role=dialog+aria-modal=true+aria-labelledbypointing to title node - Status pills:
aria-live=politefor in-page state changes - Shortcut chips: paired with
aria-keyshortcutson the parent control
Keyboard nav
Tab order: header logo → nav links → header CTA → hero CTA → in-page
sections → footer. Skip-to-content link appears on Tab focus before
the header. All buttons and links are reachable via keyboard;
keyboard shortcuts are documented in the help menu (?).
Screen reader hints
- Icon-only buttons carry
aria-label(e.g.,aria-label="Search") - Decorative icons get
aria-hidden=true - Status pills include their state in
aria-label(e.g.,aria-label="Status: in progress")
Reduced motion
Honoured globally; see §8. Auto-playing GIFs in changelog respect the same query and freeze on first frame.
10. Responsive Behavior
| Breakpoint | px | Layout |
|---|---|---|
| mobile | < 640 | single-column, 16px gutter, h1 → 32px |
| tablet | 640–1023 | 2-column on splits, 20px gutter, h1 → 40px |
| laptop | 1024–1279 | full 1024 layout, 12-col grid, h1 → 48px |
| desktop | 1280–1535 | same as laptop — page caps at 1024 |
| wide | ≥ 1536 | same as laptop — refuses to stretch |
Touch targets
Minimum 44 × 44 on mobile (buttons grow vertical padding from 8 to 12; icon buttons grow to 36 × 36). Tap targets use the same pill geometry — fingerprint matches desktop.
Collapsing strategy
- Header collapses to hamburger at ≤ 768
- Feature grids switch from 1.4fr/1fr asymmetric to single-column stack at ≤ 768
- Tables (changelog, comparison) become card lists at ≤ 640
- Sticky sidebar (docs) becomes a top sheet on mobile
Image behavior
Product screenshots use aspect-ratio: 16 / 10 and object-fit: cover with loading=lazy. SVG illustrations are inline and respect
currentColor. No image gets a border-radius mismatch from its
parent card.
Container queries
Used in card-hero variants where the screenshot frame switches from landscape to portrait based on container width below 480px.
11. Content & Voice ✨
Tone
Direct, technical, slightly understated. Linear writes like an engineer pair-reviewing a PR: declarative, present-tense, allergic to hype. Sentences cap at ~14 words; metaphors are rare and always mechanical when used.
Microcopy patterns
- Button verbs: “Get started”, “Sign in”, “Try Linear”, “Start building” — short, imperative, present-tense. Never “Click here” or “Learn more about our…”
- Errors: format
<noun> couldn't be <verbed>. <one-sentence reason>.Example: “Issue couldn’t be saved. You’re offline.” - Success confirmations: terse, no exclamation marks. Example: “Issue updated.”
- Progress:
Saving...rather thanPlease wait...
Empty states
Empty list views in the marketing demo show: short headline (e.g., “No issues yet”), one-line orientation, and a single CTA. No illustration, no upbeat encouragement.
CTA verb conventions
The verb ladder Linear uses, in observed frequency:
- Get started — top-of-page hero CTA
- Try Linear — secondary on landing
- Sign in — utility nav
- Start building — developer-facing pages
- See pricing — pricing-link surface
Linear avoids “Sign up free” / “Free trial” / “Free forever” — the free-tier fact is mentioned in copy below the CTA, not in the verb.
12. Dark Mode & Theming ✨
Linear is dark-first by design. The marketing site has no light mode — the in-product editor offers a light theme but the public website ships dark only. The brand identity is the dark canvas; inverting it would break recognition.
If a downstream system needs to derive a light variant from these tokens (e.g., for a light-mode docs portal):
colors-light:
bg: '#ffffff'
bg-level-1: '#fafbfc'
bg-level-2: '#f4f5f8'
text: '#08090a'
text-secondary: '#393a3f'
text-tertiary: '#62666d'
brand: '#5e6ad2' # unchanged
border: '#e1e3e8'
cta-fill: '#08090a' # inverts the inversion
cta-text: '#ffffff'
But Linear’s own marketing surface stays dark. This is intentional.
13. Lineage & Influences
Linear’s marketing surface is engineered as a continuation of the product, not a separate brand layer. The lineage runs through three strands: dark-canvas product design (Vercel, Modal), keyboard-first power tools (Sublime Text, Raycast, Superhuman), and Bay-Area-tech typography discipline (Apple, Stripe). What Linear inherits is the willingness to refuse marketing softening — to treat the website as documentation. What it adds is the specific 510-weight Inter cut and the inverted near-white CTA pill, both unique to this system.
What it rejects: Stripe-class chromatic gradients, Apple-class glassy chrome, GitHub-class playful illustration. The system has no mascot, no gradient mark, no decorative element. It also rejects the Vercel move of using the brand wordmark as the hero — Linear’s hero is always the product itself, never the logo.
Influences:
- Apple SF Pro Display — Type fallback discipline; sets the Bay-Area-tech baseline that Inter’s variable cut continues (apple.com/fonts)
- Berkeley Mono — Paid licensed mono for shortcut chips and code; credibility signal to engineers (berkeleygraphics.com)
- Vercel Geist — Adjacent dev-tool typography lineage; both prove sans Inter-family for product UI (vercel.com/font)
- Raycast — Keyboard-shortcut chip aesthetic; Linear’s chip geometry shares Raycast’s mono-inside-rounded pattern
- Superhuman — Keyboard-first product UX; Linear inherits the density and shortcut-as-first-class-citizen philosophy
14. Do’s and Don’ts
Do
- Treat the brand color as accent-only. Linear’s indigo is punctuation, not a CTA fill — invert to white-on-near-black for the primary action.
- Use custom intermediate Inter weights (
510,590) when available; fall back to500/600only when shipping to runtimes without variable-font support. - Cap page width at 1024px even on 4K displays. Wider lines hurt product credibility.
- Use tonal layering (
#08090a→#0f1011→#141516) for depth. Each step is ~8% lightness. - Render keyboard shortcuts in Berkeley Mono inside
#1a1b1dchips with#34343aborders and 4px radius. - Use the pill (9999) for CTAs, status indicators, and any emphasis-bearing geometry.
- Honor
prefers-reduced-motion— switch all transforms to opacity-only. - Cap reading width at 680px even when the page is 1024.
- Ship the marketing site from the product codebase — match components 1:1.
- Use mono micro-labels (Berkeley Mono 11px uppercase) as section eyebrows.
Don’t
- Soften dark canvases for marketing — the product is dark, the site should be dark.
- Add drop shadows on cards. Use tonal layering or borders.
- Mix the pill (
9999px) with sharp0px— the system has no zero-radius elements except section dividers. - Use brand indigo
#5e6ad2as a CTA fill colour. The CTA inverts to near-white; brand indigo is for accents, links, and tinted backgrounds. - Introduce a second saturated colour. Linear’s chromatic budget is one indigo plus the semantic four.
- Use pure
#000or#ffffff— both are off by design (#08090a,#f7f8f8). - Centre H1s. Linear’s headlines are left-aligned, period.
- Replace Berkeley Mono with a free Google fallback in production. The whole point of the choice is the licence.
- Use slide-in page transitions. Opacity-only matches the system.
- Stretch product screenshots wider than 1024 — they sit inside cards, never full-bleed.
15. Agent Prompt Guide
Quick Color Reference
bg: #08090a
text: #f7f8f8
text-muted: #8a8f98
brand: #5e6ad2
accent: #7170ff
link: #828fff
border: #23252a
cta-fill: #e5e5e6
cta-text: #08090a
chip-bg: #1a1b1d
success: #4cb782
danger: #eb5757
Example Component Prompts
-
Hero: “Create a hero section on
#08090abackground with a left-aligned 64px Inter Variable headline at weight 510 and-0.022emtracking, body copy at 17px/400 in#f7f8f8, capped at 680px reading width, with a single primary CTA: a pill button filled#e5e5e6with#08090atext reading ‘Get started’.” -
Card: “Design a feature card with
#0f1011background, 1px#23252aborder, 12px radius, 24px padding, no shadow. Title at 18px Inter 510, body at 15px/400 in#d0d6e0. On hover, transition border to#34343aand bg to#141516over 180ms.” -
Status pill: “Render a status pill with pill radius (9999),
rgba(94,106,210,0.12)background,rgba(94,106,210,0.22)border,#828ffftext at 12px Inter 510, 2px × 10px padding. Vary the colour to map to in-progress (brand) / done (success#4cb782) / blocked (danger#eb5757).” -
Shortcut chip: “Build a keyboard-shortcut chip:
#1a1b1dbackground, 1px#34343aborder, 4px radius, 11px Berkeley Mono 500 uppercase text in#d0d6e0, 2px × 6px padding. Use for ⌘K, ⇧K, Esc — render as a small inline element next to its label.” -
Sticky nav: “Make a 72px-tall sticky nav with
rgba(8,9,10,0.72)background,backdrop-filter: blur(12px) saturate(180%), 1px bottom border#23252a. Logo on the left, utility nav (search icon, account) on the right; on scroll the border edge stays — no shadow added.” -
Inverted CTA pill: “Create a primary CTA button: pill radius (9999),
#e5e5e6background,#08090atext at 14px Inter Variable weight 510, padding0 20px, height 40. Hover: bg#f3f3f4+translateY(-1px)over 120ms ease-out. Focus:0 0 0 2px #7170ffring with 2px offset.”
Iteration Guide
- Pure-near-black, not pure black. If your
bgreads as#000, soften by 1–2 lightness points to#08090a. The warmth prevents type crunch. - CTA inverts. If your primary action is brand-coloured, you’ve missed the central move. Flip it: near-white pill on near-black ground. Brand colour goes on accents, links, and tinted bgs only.
- Custom Inter weight or fallback. Prefer Inter Variable at 510 for headlines; fall back to 500 only when variable isn’t shipping. Never use 600 — it crosses into the wrong density.
- No card shadows. If a card needs depth, lift its bg one tonal
step (
#0f1011 → #141516) and tighten its border. Shadows belong to floating UI only. - Pill the CTAs and status. Mixing pill (9999) with rectilinear buttons (8px) breaks the system. Choose pill for any emphasis-bearing rounded geometry.
- 1024 cap. Never let the page stretch past 1024 even on 4K. The product credibility comes from the spatial discipline.
- Mono = Berkeley. When using a code or chip surface, prefer Berkeley Mono. If the licence isn’t available, JetBrains Mono is the closest free substitute — but acknowledge the downgrade.
- Reduced motion always. Respect
prefers-reduced-motionon every transition. Linear’s motion is restrained even at full — reduced should feel almost identical.
Drop linear into your project, then ship the actual sections in an afternoon.
npx design-md add linear npx agentkit init --design linear Brutalist developer-product polish — near-white canvas, near-pure black-on-near-white ty…
Editorial fintech polish — light Söhne headlines at weight 300, navy-not-black text, sig…
Near-black canvas, glowing keycaps, monospaced shortcut chips — a marketing site that th…