DESIGN.md inspired by Tailscale
Warm-light approachable-technical — off-white canvas, near-black Inter, brick-red accent.
Compare to…
- bg
#f9f7f6 - bg-pure
#ffffff - bg-elev
#f3f0ee - bg-warm
#efeae7 - bg-ink
#181717 - bg-ink-soft
#232222 - surface
#ffffff - surface-warm
#f9f7f6 - text AAA · 16.8
#181717 - text-secondary
#4a4746 - text-tertiary
#736f6d - text-faint — · 2.5
#a39e9b - text-on-ink
#f5f2f0 - text-on-ink-soft
#a39e9b - brand AA·LG · 4.2
#d04841 - brand-hover
#b83d37 - brand-deep
#9e332e - brand-soft
rgba(208, 72, 65, 0.10) - brand-tint
rgba(208, 72, 65, 0.06) - link
#d04841 - link-hover
#b83d37 - focus
rgba(208, 72, 65, 0.40) - on-brand
#ffffff - cta-bg
#d04841 - cta-text
#ffffff - cta-bg-secondary
#232222 - cta-text-secondary
#ffffff - border — · 1.3
rgba(24, 23, 23, 0.12) - border-soft
rgba(24, 23, 23, 0.07) - border-strong — · 1.6
rgba(24, 23, 23, 0.22) - border-ink
#181717 - shadow-ambient
rgba(24, 23, 23, 0.04) - shadow-card
rgba(24, 23, 23, 0.06) - shadow-elev
rgba(24, 23, 23, 0.08) - shadow-deep
rgba(24, 23, 23, 0.14) - scrim
rgba(24, 23, 23, 0.45) - success
#2f7d52 - success-soft
rgba(47, 125, 82, 0.10) - warning
#c9821f - warning-soft
rgba(201, 130, 31, 0.10) - danger
#d04841 - danger-soft
rgba(208, 72, 65, 0.10) - info
#181717 - info-soft
rgba(24, 23, 23, 0.06)
- step-0 0px
- step-1 4px
- step-2 8px
- step-3 12px
- step-4 16px
- step-5 24px
- step-6 32px
- step-7 48px
- step-8 64px
- step-9 96px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - pill
9999px
Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.
- background → bg
- foreground → text
- primary → brand
- primary-foreground → on-brand
- accent → —
- muted → text-secondary
- border → border
- ring → brand
Tailscale rejects the cold blue-on-clinical-white default of the networking / infrastructure category. The brand draws from the warm-minimal lineage — Stripe-era developer-product polish ported onto a warmer canvas, the human-technical register of Linear and Vercel, and the off-white "intentional, not default" surface philosophy that Notion and Mintlify popularised — but commits to a single confident brick-red `#d04841` accent where peers reach for blue or violet. The off-white `#f9f7f6` canvas signals "considered" the way Vercel's `#fafafa` does, but adds a hair of warmth that softens the security-tool register into something approachable. Inter carries both display and body at restrained weights (h1 at 500, not 700), so the visual identity reads engineering-calm rather than consumer-loud. The two-tier CTA grammar — warm brick-red as the dominant action, dark near-black as the supporting one — is the brand's most distinctive structural decision, inverting the more common "neutral primary, colour secondary" arrangement.
- The full type identity — Inter set at restrained weights for both display and body; the engineering-calm register depends on the typeface, not on colour.
- Developer-product-as-magazine polish; the warm-light, type-disciplined, single-accent register descends from Stripe's marketing era.
- Adjacent dev-tool peer; the calm, low-shout headline weight and the human-technical voice register share Linear's restraint.
- The off-white "intentional, not #ffffff" canvas philosophy and near-black-on-near-white type discipline — Tailscale warms the same idea.
- Warm off-white surface as a deliberate signal of approachability over the clinical white of legacy enterprise software.
- The protocol Tailscale builds on; the engineering-credibility-first, no-marketing-fluff posture shapes the tone of the product copy.
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: Tailscale
tagline: Warm-light approachable-technical — off-white canvas, near-black Inter, brick-red accent.
updated_at: 2026-05-29T00:00:00.000Z
published_at: 2026-05-28T22:16:01.704Z
author: webdesignhot
source_url: https://tailscale.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [dev-tools]
tags: [light, structured, sans, networking, developer]
preview_swatch: ['#f9f7f6', '#d04841', '#181717']
related: []
description: 'Tailscale is a mesh-VPN / Zero-Trust networking tool that markets itself as approachable-technical rather than cold-infrastructure. The site rejects the blue-on-white SaaS default: the canvas is a warm off-white `#f9f7f6` (a hair of cream, not the clinical `#ffffff` of most networking vendors), the type is near-black `#181717` set in **Inter**, and the single brand accent is a confident brick-RED `#d04841` (rgb 208, 72, 65) reserved for primary CTAs, links, and small flourishes. Headlines run Inter 48px at weight 500 — restrained for a marketing hero, signalling engineering-calm over consumer-shout. The primary CTA fills brick-red with white text at a 16px radius; the secondary CTA goes dark `#232222` at a tighter 8px radius — a two-tier CTA grammar where the *warm red* is the dominant action and the *near-black* is the supporting one. The register is unmistakable: a developer tool that wants to feel human and warm while still reading as precise, secure, and infrastructure-grade. Warmth without softness; technical without coldness.'
# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
background: bg
foreground: text
primary: brand
primary-foreground: on-brand
muted: text-secondary
border: border
ring: brand
colors:
bg: '#f9f7f6' # page canvas — warm off-white, a hair of cream, not clinical white
bg-pure: '#ffffff' # card surface, modal background — pure white tier above the canvas
bg-elev: '#f3f0ee' # subtle elevation; section bands, inset blocks, alternate stripes
bg-warm: '#efeae7' # third tier; quote bands, feature-stripe fills, warm shading
bg-ink: '#181717' # near-black inversion band — dark testimonial / closing-CTA sections
bg-ink-soft: '#232222' # dark secondary-CTA fill and dark card surface
surface: '#ffffff' # default card surface on the warm canvas
surface-warm: '#f9f7f6' # nested surface inside white panels (echoes the canvas)
text: '#181717' # primary text — near-black, warm-leaning, at ~9% lightness
text-secondary: '#4a4746' # supporting copy, body in dense rows — warm grey
text-tertiary: '#736f6d' # captions, meta, helper text
text-faint: '#a39e9b' # placeholder, disabled, faintest meta — warm grey
text-on-ink: '#f5f2f0' # text on the near-black inversion band
text-on-ink-soft: '#a39e9b' # secondary text on the dark band
brand: '#d04841' # brick-red — rgb(208,72,65); primary CTA fill, links, accents
brand-hover: '#b83d37' # deeper brick-red — hover/pressed on the primary CTA
brand-deep: '#9e332e' # pressed/active state, deepest red tier
brand-soft: 'rgba(208, 72, 65, 0.10)' # soft red wash — link aura, badge bg, status pill
brand-tint: 'rgba(208, 72, 65, 0.06)' # subtlest red tint — aria-current row, quiet emphasis
link: '#d04841' # inline link colour — brick-red
link-hover: '#b83d37' # link hover deepens to brand-hover, underline appears
focus: 'rgba(208, 72, 65, 0.40)' # focus ring — translucent brick-red
on-brand: '#ffffff' # white text on the brick-red CTA
cta-bg: '#d04841' # primary CTA fill — the warm brick-red is the dominant action
cta-text: '#ffffff' # CTA text on brick-red
cta-bg-secondary: '#232222' # secondary CTA fill — dark near-black, the supporting action
cta-text-secondary: '#ffffff' # secondary CTA text on dark
border: 'rgba(24, 23, 23, 0.12)' # default hairline — near-black at 12% over warm canvas
border-soft: 'rgba(24, 23, 23, 0.07)' # quietest separation
border-strong: 'rgba(24, 23, 23, 0.22)' # outlined buttons, focused inputs, ghost-CTA border
border-ink: '#181717' # full near-black border — high-emphasis outlined CTA
shadow-ambient: 'rgba(24, 23, 23, 0.04)'
shadow-card: 'rgba(24, 23, 23, 0.06)'
shadow-elev: 'rgba(24, 23, 23, 0.08)'
shadow-deep: 'rgba(24, 23, 23, 0.14)'
scrim: 'rgba(24, 23, 23, 0.45)'
success: '#2f7d52' # advisory green — "all systems operational", success states
success-soft: 'rgba(47, 125, 82, 0.10)'
warning: '#c9821f' # advisory amber — warnings, rate limits
warning-soft: 'rgba(201, 130, 31, 0.10)'
danger: '#d04841' # destructive red collapses into the brand brick-red
danger-soft: 'rgba(208, 72, 65, 0.10)'
info: '#181717' # info reads as neutral near-black on warm canvas
info-soft: 'rgba(24, 23, 23, 0.06)'
typography:
display:
family: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
weights: [500, 600, 700]
opentype-features: ['kern', 'liga', 'calt']
body:
family: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif'
weights: [400, 500, 600]
opentype-features: ['kern', 'liga']
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace'
weights: [400, 500]
opentype-features: ['liga', 'calt', 'zero', 'tnum']
scale:
display-hero: { size: 80, weight: 700, lineHeight: 1.0, tracking: '-0.03em', family: display }
display-lg: { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.02em', family: display }
h1: { size: 48, weight: 500, lineHeight: 1.1, tracking: '-0.018em', family: display }
h2: { size: 32, weight: 600, lineHeight: 1.2, tracking: '-0.012em', family: display }
h3: { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
h4: { size: 20, weight: 600, lineHeight: 1.3, tracking: '0', family: body }
h5: { size: 18, weight: 600, lineHeight: 1.4, tracking: '0', family: body }
eyebrow: { size: 13, weight: 600, lineHeight: 1.4, tracking: '0.02em', family: body, transform: uppercase }
body-lg: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
label: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: body }
label-strong: { size: 13, weight: 600, lineHeight: 1.4, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
button: { size: 16, weight: 500, lineHeight: 1.2, tracking: '0', family: body }
button-sm: { size: 14, weight: 500, lineHeight: 1.2, tracking: '0', family: body }
code-block: { size: 14, weight: 400, lineHeight: 1.6, tracking: '0', family: mono, opentype: ['liga', 'calt'] }
code-inline: { size: 14, weight: 500, lineHeight: 1.4, tracking: '0', family: mono }
code-micro: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0', family: mono }
radius:
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
pill: 9999
spacing:
base: 4
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96]
layout:
page-width: 1280
prose-width: 720
header-height: 64
components:
button-primary:
bg: '#d04841'
color: '#ffffff'
radius: 16
padding: '12px 20px'
height: 48
font: 'Inter 16px / 500'
hover-bg: '#b83d37'
use: 'Primary CTA — brick-red fill, white text, 16px radius. Start connecting devices, Get started. The dominant warm action.'
button-secondary:
bg: '#232222'
color: '#ffffff'
radius: 8
padding: '12px 20px'
height: 48
font: 'Inter 16px / 500'
hover-bg: '#181717'
use: 'Secondary CTA — dark near-black fill, white text, tighter 8px radius. Contact sales, Talk to an expert. The supporting action.'
button-ghost:
bg: 'transparent'
color: '#181717'
border: '1px solid rgba(24, 23, 23, 0.22)'
radius: 8
padding: '12px 20px'
height: 48
font: 'Inter 16px / 500'
hover-bg: 'rgba(24, 23, 23, 0.04)'
use: 'Outlined twin — transparent fill, near-black hairline border. Read the docs, Learn more.'
button-link:
bg: 'transparent'
color: '#d04841'
underline: 'none at rest, 1px on hover'
font: 'Inter 16px / 500'
use: 'Text-link CTA — brick-red, hover reveals underline. See pricing, View case study.'
card:
bg: '#ffffff'
border: '1px solid rgba(24, 23, 23, 0.12)'
radius: 12
padding: 24
shadow: 'rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px'
use: 'Default feature / product card — pure-white fill on warm canvas, hairline border, soft warm shadow.'
card-dark:
bg: '#232222'
color: '#f5f2f0'
border: '1px solid rgba(255, 255, 255, 0.08)'
radius: 16
padding: 32
use: 'Inverted testimonial / highlight card on the dark band.'
input:
bg: '#ffffff'
color: '#181717'
border: '1px solid rgba(24, 23, 23, 0.22)'
radius: 8
padding: '10px 12px'
height: 44
font: 'Inter 16px / 400'
placeholder-color: '#a39e9b'
focus-border: '#d04841'
focus-ring: '0 0 0 3px rgba(208, 72, 65, 0.20)'
use: 'Form field, search bar — white fill, near-black hairline, brick-red focus ring.'
badge:
bg: 'rgba(208, 72, 65, 0.10)'
color: '#9e332e'
radius: 9999
padding: '4px 12px'
font: 'Inter 13px / 600'
use: 'Status / highlight pill — Most popular, New, Beta. Soft red wash, deep-red text.'
nav-top:
bg: 'rgba(249, 247, 246, 0.85)'
backdrop-filter: 'blur(12px) saturate(160%)'
height: 64
border-bottom: '1px solid rgba(24, 23, 23, 0.08)'
use: 'Sticky top nav — translucent warm-canvas fill with blur, faint hairline divider.'
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
ease-out-soft: 'cubic-bezier(0.0, 0, 0.2, 1)'
duration-fast: 150
duration-standard: 240
duration-slow: 320
link-hover: 'underline grows 150ms; color deepens to brand-hover'
button-hover: 'bg deepens 240ms standard, subtle 1px lift on primary'
card-hover: 'shadow tier intensifies + border deepens 240ms — minimal lift'
scroll-reveal: 'sections fade + 12px rise over 320ms ease-out-soft on viewport entry'
reduced-motion: 'respects prefers-reduced-motion: reduce — transforms suppress, opacity-only fades, durations halve'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
none: 'none'
ambient: 'rgba(24, 23, 23, 0.04) 0 1px 2px'
card: 'rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px'
elevated: 'rgba(24, 23, 23, 0.08) 0 4px 12px, rgba(24, 23, 23, 0.06) 0 16px 32px -8px'
popover: 'rgba(24, 23, 23, 0.14) 0 12px 32px -8px'
modal: 'rgba(24, 23, 23, 0.20) 0 24px 64px -16px'
ring: '0 0 0 3px rgba(208, 72, 65, 0.20)'
accessibility:
contrast-text-on-bg: 15.9 # #181717 on #f9f7f6 — AAA at all sizes
contrast-text-secondary-on-bg: 8.6 # #4a4746 on #f9f7f6 — AAA at body sizes
contrast-text-tertiary-on-bg: 4.7 # #736f6d on #f9f7f6 — AA at body sizes
contrast-on-brand-on-brand: 4.6 # #ffffff on #d04841 — AA at all sizes / large AAA
contrast-cta-secondary: 15.1 # #ffffff on #232222 — AAA at all sizes
contrast-link-on-bg: 4.5 # #d04841 on #f9f7f6 — AA at body; reinforced with hover-underline
focus-ring: '3px solid rgba(208, 72, 65, 0.20) + 2px outline-offset; brick-red ring on every focusable'
reduced-motion-honored: true
touch-target-min: 44
prose-line-length: 'capped at 720px / ~70 characters even on 1280px layouts'
dark-mode: optional # light-default; near-black inversion bands appear within the light page
lineage:
summary: 'Tailscale rejects the cold blue-on-clinical-white default of the networking / infrastructure category. The brand draws from the warm-minimal lineage — Stripe-era developer-product polish ported onto a warmer canvas, the human-technical register of Linear and Vercel, and the off-white "intentional, not default" surface philosophy that Notion and Mintlify popularised — but commits to a single confident brick-red `#d04841` accent where peers reach for blue or violet. The off-white `#f9f7f6` canvas signals "considered" the way Vercel''s `#fafafa` does, but adds a hair of warmth that softens the security-tool register into something approachable. Inter carries both display and body at restrained weights (h1 at 500, not 700), so the visual identity reads engineering-calm rather than consumer-loud. The two-tier CTA grammar — warm brick-red as the dominant action, dark near-black as the supporting one — is the brand''s most distinctive structural decision, inverting the more common "neutral primary, colour secondary" arrangement.'
influences:
- name: 'Inter (Rasmus Andersson)'
role: 'The full type identity — Inter set at restrained weights for both display and body; the engineering-calm register depends on the typeface, not on colour.'
url: 'https://rsms.me/inter/'
- name: 'Stripe'
role: 'Developer-product-as-magazine polish; the warm-light, type-disciplined, single-accent register descends from Stripe''s marketing era.'
url: 'https://stripe.com'
- name: 'Linear'
role: 'Adjacent dev-tool peer; the calm, low-shout headline weight and the human-technical voice register share Linear''s restraint.'
url: 'https://linear.app'
- name: 'Vercel'
role: 'The off-white "intentional, not #ffffff" canvas philosophy and near-black-on-near-white type discipline — Tailscale warms the same idea.'
url: 'https://vercel.com'
- name: 'Notion'
role: 'Warm off-white surface as a deliberate signal of approachability over the clinical white of legacy enterprise software.'
url: 'https://notion.so'
- name: 'WireGuard'
role: 'The protocol Tailscale builds on; the engineering-credibility-first, no-marketing-fluff posture shapes the tone of the product copy.'
url: 'https://www.wireguard.com'
---
## 1. Visual Theme & Atmosphere
Tailscale's marketing site is a deliberate refusal of the networking category's house style. Open any legacy VPN, SASE, or Zero-Trust vendor and you get the same page: clinical `#ffffff`, navy-blue accents, a shield icon, and copy that reads like a compliance datasheet. Tailscale throws all of that out. The canvas is a *warm* off-white `#f9f7f6` — not cream, but not the cold default white either; a surface that signals "a person designed this on purpose." The type is near-black `#181717` in **Inter**. And the single brand accent is a confident brick-RED `#d04841` (rgb 208, 72, 65) — a warm, slightly-earthy red that no infrastructure competitor is using. The cumulative effect is a security tool that feels *human and warm* while still reading as precise, credible, and engineering-grade.
The defining decision is the **warmth-without-softness** balance. The off-white canvas, the warm-leaning near-black text (`#181717` reads slightly warmer than a true grey), the brick-red rather than a primary-blue — every choice nudges the brand toward "approachable" — but the restraint of the execution keeps it from tipping into consumer-friendly mush. Headlines run Inter at **48px / weight 500**, which is unusually light for a marketing hero; most SaaS pushes 700–800 to shout. Tailscale's 500-weight h1 is a confidence signal: the product doesn't need to raise its voice. The page reads the way a senior infrastructure engineer talks — calm, exact, willing to use the words "mesh", "Zero Trust", and "WireGuard" without dumbing them down, but never cold.
The chromatic register is single-accent discipline. Brick-red `#d04841` does *all* the colour work: it fills the primary CTA, it colours inline links, it tints the "Most popular" badge, it draws the focus ring, and it appears in small illustration flourishes. There is no secondary accent hue — no green-for-success-blue-for-info rainbow. Where a state needs a colour, the system reaches first for the neutral ramp (warm greys) and only introduces red where the brand wants attention. This is the same accent-only discipline that Linear and Vercel practise, but Tailscale picks a *warm* accent instead of a cool one, which is what makes the page feel categorically different from its blue-saturated peers.
The second structural tell is the **two-tier CTA grammar**. The primary action is the warm brick-red pill (`#d04841` fill, white text, **16px radius**) — "Start connecting devices", "Get started". The secondary action is a dark near-black button (`#232222` fill, white text, **tighter 8px radius**) — "Contact sales". This inverts the more common arrangement where the neutral/dark button is primary and the colour is secondary. Tailscale makes the *warm colour* dominant and the *dark neutral* supporting — a small grammar choice that reinforces the brand's whole thesis: the warm, human path (self-serve, connect a device now) is the headline action; the enterprise path (talk to a human) is the quieter twin. The radius difference (16px vs 8px) is intentional too — the bigger, friendlier radius lives on the friendlier action.
Density is moderate and editorial. The page caps at 1280px, with a 720px reading column inside. Product cards sit in pure-white tiles on the warm canvas, lifted by soft warm-toned shadows. Sections alternate by *brightness and warmth* — warm canvas → pure-white card band → warm-grey quote stripe → a near-black inversion band for a testimonial or the closing CTA — rather than by colour. Customer logos (Cohere, Duolingo, Hugging Face, Microsoft, Nvidia) render in a clean grid; "30,000 businesses choose Tailscale" anchors the social proof. The vocabulary that captures the feeling: *warm-off-white, brick-red-accent, Inter-calm, approachable-technical, single-accent, two-tier-CTA, security-with-warmth, engineering-honest, soft-shadow, no-navy, no-clinical-white, human-infrastructure.*
**Key Characteristics**
- Warm off-white `#f9f7f6` canvas — a hair of cream, deliberately *not* the clinical `#ffffff` of legacy networking vendors
- Near-black `#181717` text and headlines — warm-leaning, at ~9% lightness
- Single brand accent: confident brick-RED `#d04841` (rgb 208, 72, 65) — warm, not the category-default navy/blue
- **Inter** carries both display and body — engineering-calm, no second typeface
- Restrained hero weight: h1 at Inter **48px / 500**, not the 700–800 marketing shout
- Two-tier CTA grammar: warm brick-red primary (16px radius) + dark `#232222` secondary (8px radius)
- Accent-only chromatic discipline — red does the colour work; neutral warm greys carry hierarchy
- Pure-white `#ffffff` cards on the warm canvas, lifted by soft warm-toned shadows
- Brightness-and-warmth section alternation (canvas → white → warm-grey → near-black), never colour-coded bands
- 1280px page width with a 720px reading column — editorial, moderate density
- Rounded 16px on the friendly primary action; 8/12px on cards, inputs, and the supporting button
- Light-default, with near-black inversion bands used for testimonials and the closing CTA
## 2. Color Palette & Roles
### Canvas / Primary
- **Canvas** (`#f9f7f6`) [→ `--bg`]: the page background — warm off-white with a hair of cream. The *only* page background; the brand's entry ticket. Cooler `#ffffff` would collapse Tailscale into the clinical-networking default it's built to reject.
- **Pure White** (`#ffffff`) [→ `--bg-pure`]: card and modal surface. The contrast against the warm `#f9f7f6` canvas is the brand's primary elevation signal.
- **Body Text** (`#181717`) [→ `--text`]: primary text and headlines — warm-leaning near-black at ~9% lightness, 15.9:1 against the canvas. The slight warmth (vs a neutral grey) ties the type to the warm canvas.
- **Section Elevation** (`#f3f0ee`) [→ `--bg-elev`]: subtle warm elevation for section bands, inset blocks, alternate stripes.
- **Warm Stripe** (`#efeae7`) [→ `--bg-warm`]: third-tier warm shading for quote bands and feature-stripe fills.
### Brand & Sub-Brand
- **Brick-Red** (`#d04841`) [→ `--brand`]: the canonical brand colour — rgb(208, 72, 65). Fills the primary CTA, colours inline links, tints badges, draws the focus ring. The single accent; no second hue.
- **Brand Hover** (`#b83d37`) [→ `--brand-hover`]: deeper brick-red for primary-CTA hover and link hover.
- **Brand Deep** (`#9e332e`) [→ `--brand-deep`]: pressed/active state and badge text colour (for AA contrast on the soft wash).
- **Brand Soft** (`rgba(208, 72, 65, 0.10)`) [→ `--brand-soft`]: soft red wash — badge backgrounds, link aura, status-pill fills.
- **Brand Tint** (`rgba(208, 72, 65, 0.06)`) [→ `--brand-tint`]: subtlest red tint for `aria-current` rows and very quiet emphasis.
### Accent
Tailscale's only chromatic flourish is brick-red itself — there is no gradient and no secondary accent hue. Small illustration touches, the "Most popular" pricing badge, inline-link colour, checkmark glyphs in feature lists, and the focus ring all draw from the same `#d04841` family. The discipline is "one warm accent, applied with restraint" — the opposite of the multi-colour gradient flourishes that Stripe-era and Vercel-era pages use. When the page needs visual energy, it reaches for the near-black inversion band, not a second colour.
### Interactive
- **Link** (`#d04841`) [→ `--link`]: inline links in body copy — brick-red, no underline at rest. Hover deepens to `#b83d37` and reveals a 1px underline.
- **Selected** (`#9e332e` text on `rgba(208, 72, 65, 0.10)`): selected nav, active TOC item, current pricing tier.
- **Disabled** (`#a39e9b` text): disabled controls drop to the faint warm grey, no colour cue.
- **Focus** (`rgba(208, 72, 65, 0.40)` ring): keyboard focus — translucent brick-red ring on every focusable element.
### Neutral Scale (Warm Greys)
Tailscale's neutral ramp is warm-tinted rather than pure grey — every step carries a trace of the canvas's warmth so the greys never read clinical:
- **Pure White** (`#ffffff`) — card surface
- **Canvas** (`#f9f7f6`) — page background
- **Bg Elev** (`#f3f0ee`) — section band, inset block
- **Bg Warm** (`#efeae7`) — third tier, quote stripe
- **Border Soft** (`rgba(24, 23, 23, 0.07)`) — quietest separation
- **Border** (`rgba(24, 23, 23, 0.12)`) — default hairline
- **Border Strong** (`rgba(24, 23, 23, 0.22)`) — inputs, ghost-button border
- **Text Faint** (`#a39e9b`) — placeholder, disabled
- **Text Tertiary** (`#736f6d`) — captions, meta
- **Text Secondary** (`#4a4746`) — supporting copy, dense-row body
- **Text** (`#181717`) — primary text, headlines
### Surface & Borders
- **Canvas** (`#f9f7f6`) — the single warm page background
- **Pure White** (`#ffffff`) — card and modal surface
- **Bg Elev** (`#f3f0ee`) — section band, inset block
- **Bg Warm** (`#efeae7`) — quote band, feature stripe
- **Bg Ink** (`#181717`) — near-black inversion band (testimonial, closing CTA)
- **Bg Ink Soft** (`#232222`) — dark secondary-CTA fill and dark card surface
- **Border Soft** (`rgba(24, 23, 23, 0.07)`) — quietest separation
- **Border Default** (`rgba(24, 23, 23, 0.12)`) — translucent near-black hairline over warm canvas
- **Border Strong** (`rgba(24, 23, 23, 0.22)`) — outlined buttons, focused inputs
- **Border Ink** (`#181717`) — full near-black border for high-emphasis outlined CTAs
### Shadow Colors
Tailscale's shadows are **warm-toned and soft** — built from `rgba(24, 23, 23, …)` rather than pure black, so they sit harmoniously on the warm canvas. The stack is gentle (6–8% on cards) but slightly more present than Vercel's near-invisible 4% — enough to give product tiles a friendly, resting-on-the-surface lift without the clinical flatness of the networking category.
- `rgba(24, 23, 23, 0.04) 0 1px 2px` — ambient
- `rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px` — card (the signature soft warm lift)
- `rgba(24, 23, 23, 0.08) 0 4px 12px, rgba(24, 23, 23, 0.06) 0 16px 32px -8px` — elevated dropdown
- `rgba(24, 23, 23, 0.14) 0 12px 32px -8px` — popover
- `rgba(24, 23, 23, 0.20) 0 24px 64px -16px` — modal
### Semantic
- **Success** (`#2f7d52` on `rgba(47, 125, 82, 0.10)`): advisory green — "all systems operational", deployment-ready states. The one place a non-red colour appears, and even here it's a muted, warm-leaning green.
- **Warning** (`#c9821f` on `rgba(201, 130, 31, 0.10)`): advisory amber — warnings, rate-limit notices.
- **Danger** (`#d04841` on `rgba(208, 72, 65, 0.10)`): destructive red *collapses into the brand brick-red* — Tailscale's convention treats danger and brand as the same hue, since the brand colour is already red. Destructive confirmations read as a slightly deeper, more saturated red.
- **Info** (`#181717` on `rgba(24, 23, 23, 0.06)`): info reads as neutral near-black on a warm-grey wash — info is *not* given a colour, preserving the single-accent discipline.
## 3. Typography Rules
### Font Family
**Primary**: `Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`. **Inter** (Rasmus Andersson, open-source) carries the *entire* identity — both display and body. Inter is the de-facto neutral-grotesque of modern SaaS, but Tailscale's distinctiveness comes not from the typeface itself but from *how it's set*: restrained weights, calm headline sizing, and the warm canvas behind it. Inter's tall x-height and even rhythm read clearly at small sizes (dense docs, dashboard tables) and stay composed at hero scale.
**Mono companion**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace`. Tailscale uses the system mono stack rather than a proprietary mono — code samples (`tailscale up`, ACL JSON, exit-node config) render in the OS-native monospace. The choice is pragmatic: the brand's identity lives in Inter and the brick-red, not in a bespoke mono. Mono carries CLI commands, ACL policy snippets, IP/CIDR notation, and inline code references.
**OpenType features**: Inter renders with `kern`, `liga`, and `calt` (contextual alternates) always on. The mono stack adds `liga`/`calt` for code, `zero` for slashed zero (so `0` and `O` disambiguate in IP addresses), and `tnum` for tabular numerals in pricing tables and dashboard metrics.
The single-family discipline (Inter for everything, system mono for code) keeps the brand calm and unfussy — no display serif, no second sans. The identity is carried by *weight restraint* and the warm-canvas + brick-red pairing.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Transform | Notes |
|------|------|------|--------|-------------|----------------|-----------|-------|
| display-hero | Inter | 80px | 700 | 1.0 | -0.03em | — | Oversized landing hero (rare) |
| display-lg | Inter | 56px | 700 | 1.05 | -0.02em | — | Major section opener |
| h1 | Inter | 48px | 500 | 1.1 | -0.018em | — | Page / hero title — restrained 500 weight |
| h2 | Inter | 32px | 600 | 1.2 | -0.012em | — | Marketing section H2 |
| h3 | Inter | 24px | 600 | 1.25 | -0.005em | — | Card heading, article H3 |
| h4 | Inter | 20px | 600 | 1.3 | 0 | — | Sub-card heading |
| h5 | Inter | 18px | 600 | 1.4 | 0 | — | Inline emphasis heading |
| eyebrow | Inter | 13px | 600 | 1.4 | 0.02em | uppercase | Section pre-label |
| body-lg | Inter | 18px | 400 | 1.55 | 0 | — | Hero deck, lede paragraph |
| body | Inter | 16px | 400 | 1.55 | 0 | — | Default body copy |
| body-sm | Inter | 14px | 400 | 1.5 | 0 | — | Card body, dense-row body |
| label | Inter | 13px | 500 | 1.4 | 0 | — | Form field label |
| label-strong | Inter | 13px | 600 | 1.4 | 0 | — | Emphasised label, table header |
| caption | Inter | 12px | 500 | 1.4 | 0.02em | — | Image caption, footer micro |
| button | Inter | 16px | 500 | 1.2 | 0 | — | Default button copy |
| button-sm | Inter | 14px | 500 | 1.2 | 0 | — | Compact / header button |
| code-block | Mono | 14px | 400 | 1.6 | 0 | — | CLI / config block content |
| code-inline | Mono | 14px | 500 | 1.4 | 0 | — | Inline `code` references |
| code-micro | Mono | 12px | 500 | 1.4 | 0 | — | Code tag, language label |
### Principles
- **Restrained headline weight.** The h1 sits at **500**, not the 700–800 marketing default. The calm weight is the brand's confidence signal — the product doesn't shout.
- **Single-family discipline.** Inter for display, body, captions, and labels. System mono for code only. No display serif, no second sans.
- **Weight steps up for sub-headings, not the hero.** h2/h3/h4 climb to 600 while the hero h1 stays at 500 — the page gets *firmer* as headings get smaller, an inversion of the usual "biggest = boldest" rule.
- **Body holds at weight 400.** Crisp 400-weight Inter body is what keeps long-form security/networking copy readable and calm.
- **Negative tracking compresses with size.** `-0.03em` at 80px, `-0.02em` at 56px, `-0.018em` at 48px, `-0.012em` at 32px, near-zero below 24px.
- **16px body at 1.55 line-height.** Comfortable marketing-page reading, generous enough for dense technical explanation.
- **Reading width caps at 720px** even on the 1280px page — line length calibrated for ~70 characters.
- **Mono for every CLI command and config snippet.** The system mono with `zero` (slashed zero) and `tnum` is the brand's technical-credibility tell — IP addresses and CIDR ranges read unambiguously.
## 4. Component Stylings
### Buttons
**Primary (Brick-Red)** — `#d04841` brick-red fill, white text at 16px / 500, **16px radius**, 12×20px padding, 48px height. Hover deepens to `#b83d37` over 240ms standard with a subtle 1px lift. This is the dominant action — the warm path. Use case: *Start connecting devices*, *Get started*, *Try Tailscale* — the headline CTA on every section.
**Secondary (Dark)** — `#232222` near-black fill, white text at 16px / 500, **8px radius** (tighter than the primary), 12×20px padding, 48px height. Hover deepens to `#181717`. The supporting twin — the enterprise / human path. Use case: *Contact sales*, *Talk to an expert*, *Book a demo*. Paired adjacently with the primary brick-red button.
**Ghost (Outlined)** — Transparent fill, near-black text at 16px / 500, 1px border at `rgba(24, 23, 23, 0.22)`, 8px radius, 48px height. Hover fills with `rgba(24, 23, 23, 0.04)`. Use case: *Read the docs*, *Learn more*, *Browse use cases* — the quiet third action.
**Link** — Transparent fill, brick-red text at 16px / 500. No underline at rest; 1px underline appears on hover and colour deepens to `#b83d37`. Use case: text-link CTA — *See pricing*, *View case study*, *Read the changelog*.
### Cards
**Default Card** — `#ffffff` pure-white fill, 1px hairline border at `rgba(24, 23, 23, 0.12)`, **12px radius**, 24px padding, soft warm dual-layer shadow (`rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px`). The signature card — used for product highlights (Business VPN, Privileged Access, Infrastructure Access, Securing AI / Aperture), feature grids, and customer-story tiles. The pure-white-on-warm-canvas contrast is the primary elevation cue; the soft warm shadow adds a friendly lift.
**Dark Card** — `#232222` near-black fill, `#f5f2f0` text, 1px border at `rgba(255, 255, 255, 0.08)`, **16px radius**, 32px padding. Used for inverted testimonial blocks or highlight cards on otherwise warm-light pages. Rare; one or two per page.
**Product Card (with icon)** — Default card with a 40×40 icon at top (brick-red or near-black line icon), a 24px / 600 h3 title, 16px / 400 body in `#4a4746` secondary, and a brick-red text-link CTA at the bottom (*Learn more →*).
### Inputs / Forms
**Text Input** — `#ffffff` fill, near-black text at 16px / 400 Inter, 1px border at `rgba(24, 23, 23, 0.22)`, **8px radius**, 44px height, 10×12px padding. Placeholder at `#a39e9b` faint warm grey. On focus: border shifts to brick-red `#d04841` and a 3px translucent brick-red ring appears (`0 0 0 3px rgba(208, 72, 65, 0.20)`).
**Select** — Same shape as text-input with a chevron at right (16px) at tertiary-text colour.
**Search** — Text-input shape with a leading magnifier icon; used in docs and the customer directory.
### Badges, Tags, Pills
**Highlight Badge** — `rgba(208, 72, 65, 0.10)` soft-red wash, deep-red text (`#9e332e`) at 13px / 600, **9999px pill radius**, 4×12px padding. Use case: *Most popular* (on the Premium pricing tier), *New*, *Beta*. The deep-red text keeps AA contrast against the soft wash.
**Neutral Tag** — `rgba(24, 23, 23, 0.06)` neutral warm wash, secondary-text colour at 13px / 500, pill or 4px radius, 4×10px padding. Use case: category labels, region tags, integration names.
**Status Dot Pill** — Live-status indicator with a 6px circle dot (`#2f7d52` green for operational, `#d04841` for incident) + a 13px / 500 Inter label. Used in the footer system-status and on dashboard surfaces.
### Navigation
**Top Nav** — `rgba(249, 247, 246, 0.85)` translucent warm-canvas fill with `backdrop-filter: blur(12px) saturate(160%)`, **64px height**, 1px bottom hairline at `rgba(24, 23, 23, 0.08)`. Wordmark left in Inter ~18px / 600 near-black. Center: nav links (Platform, Solutions, Customers, Community, Partnerships, Pricing) at 16px / 500 with mega-menu dropdowns. Right: ghost *Log in* + dark secondary *Contact sales* + primary brick-red *Get started* (or *Start connecting devices*).
**Footer** — `#f9f7f6` warm canvas (or a near-black `#181717` inversion variant), multi-column link grid (Platform, Solutions, Company, Support, Legal, Social) in Inter 14px / 400 secondary-text. Wordmark + system-status dot pill + region/locale selector at the bottom.
## 5. Layout Principles
### Spacing System
- Base unit: **4px**
- Scale: `0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96`
- Section padding (vertical): 96px for major marketing bands; 48–64px between sub-sections; 24–32px between content blocks and paragraphs
- Card internal padding: 24px on default cards; 32px on dark testimonial cards
- Inter-card gutters: 24px between cards in 2-up / 3-up grids; 16px in dense 4-up grids
### Grid & Container
- Single canonical max width: **1280px** for all marketing sections — moderate, editorial, not the 1400px dense-data sprawl of Vercel
- 12-column grid with 24px gutters
- Reading column caps at **720px** even inside the 1280px container — line length calibrated for ~70 characters
- Hero treatment: warm-canvas full-bleed band, headline left-aligned (sometimes centered), dual-CTA pair (brick-red primary + dark secondary), customer-logo strip beneath
### Whitespace Philosophy
Tailscale leans editorial-generous rather than dashboard-dense. Sections breathe with 96px vertical padding; product cards have room around them; the 720px reading column keeps long-form security explanations comfortable. The warmth of the canvas does part of the whitespace work — a warm off-white feels softer and more open than a clinical white, so the page can carry density without feeling cramped. The whitespace says "this is considered, this is calm, you have time to read."
### Section Cadence
A typical Tailscale page runs:
1. **Hero** — warm `#f9f7f6` canvas, 48px / 500 h1 ("The best secure connectivity platform for the AI era"), 18px / 400 body deck, dual CTA (brick-red *Start connecting devices* + dark *Contact sales*)
2. **Customer Logo Strip** — "30,000 businesses choose Tailscale", monochrome logos (Cohere, Duolingo, Hugging Face, Microsoft, Nvidia) on the warm canvas
3. **Product Grid** — pure-white cards in 2-up / 3-up (Business VPN, Privileged Access, Securing AI / Aperture, Infrastructure Access), each with icon + h3 + body + text-link
4. **Feature / Value Band** — warm-grey `#efeae7` stripe with a centered explanation and supporting visual
5. **Code / Config Band** — `#ffffff` band with a mono CLI block (`tailscale up`) and prose introducing the example
6. **Developer Testimonials** — quote cards (some on the dark `#232222` band) with X/Twitter pull-quotes
7. **Closing CTA** — near-black `#181717` inversion band with white headline + a single brick-red primary CTA
8. **Footer** — multi-column link grid in 14px / 400 secondary, system-status dot pill at the bottom
The alternation is *brightness-and-warmth-based* (warm canvas → white → warm-grey → near-black) rather than colour-based.
## 6. Shapes & Radius Scale
| Tier | Value | Use |
|------|-------|-----|
| Micro | 2px | Decorative dividers, indicator marks inside chips |
| Small | 4px | Tag chips, small inline chips |
| Comfortable | 8px | Inputs, secondary/ghost buttons, code chips |
| Relaxed | 12px | Cards (default), dropdowns, modals |
| Featured | 16px | Primary CTA, dark testimonial cards, hero panels |
| Pill | 9999px | Highlight badges, status pills, chips |
Tailscale's signature shape is the **16px primary-CTA radius paired with the 8px secondary**. The radius difference is a deliberate grammar: the friendlier, larger 16px corner lives on the warm brick-red primary action (the human, self-serve path), while the tighter 8px corner lives on the dark secondary (the enterprise path). Cards and inputs sit at the modern 12px / 8px consensus. The 9999px pill is reserved for small badges and status pills, never for buttons — Tailscale's CTAs are *soft-cornered rectangles*, not full pills, which keeps them reading as buttons-with-warmth rather than consumer-app pills.
## 7. Depth & Elevation
| Level | Treatment | Use |
|-------|-----------|-----|
| 0 — Flat | no shadow, warm canvas bg | Page canvas, body sections, warm-grey stripes |
| 1 — Hairline | 1px `rgba(24, 23, 23, 0.12)` border | Flat tiles, tag groups, inline blocks |
| 2 — Card | 1px border + `rgba(24, 23, 23, 0.06) 0 1px 3px, 0 8px 24px -6px` | Default product / feature cards |
| 3 — Elevated | `rgba(24, 23, 23, 0.08) 0 4px 12px, 0 16px 32px -8px` | Dropdowns, hover-lifted cards, mega-menus |
| 4 — Popover | `rgba(24, 23, 23, 0.14) 0 12px 32px -8px` | Command menus, tooltips, popovers |
| 5 — Modal | scrim `rgba(24, 23, 23, 0.45)` + `rgba(24, 23, 23, 0.20) 0 24px 64px -16px` | Sign-up dialog, confirmation modals |
### Shadow Philosophy
Tailscale uses **soft, warm-toned shadows** built from `rgba(24, 23, 23, …)` rather than pure black, so they sit harmoniously on the warm `#f9f7f6` canvas. The card shadow is dual-layer (a tight 1–3px ambient + a wide, soft 24px diffusion) at 4–6% opacity — present enough to give product tiles a friendly, resting-on-the-surface lift, but never the heavy drama of consumer-product shadows. The brand sits between Vercel's near-invisible 4% (too clinical for Tailscale's warmth) and the heavy consumer lift (too soft for an infrastructure tool).
The hairline border `rgba(24, 23, 23, 0.12)` does much of the elevation work in tandem with the canvas-vs-card brightness contrast (`#f9f7f6` canvas vs `#ffffff` card). Cards lift via *border + brightness + soft warm shadow* together. Heavy shadows (popover, modal) are reserved for true overlay UI where the element must read as floating *above* the page. The warmth in the shadow colour is the micro-detail that keeps the elevation system coherent with the rest of the palette.
## 8. Interaction & Motion
### Easing Curves
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — Material-style; default for hover, focus, colour transitions
- **Emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — punchier exit; modal entry, toast slide-in
- **Out-Soft**: `cubic-bezier(0.0, 0, 0.2, 1)` — gentle settle; dropdown reveal, scroll-reveal
### Duration Buckets
| Bucket | Value | Use |
|--------|-------|-----|
| Fast | 150ms | Link underline grow, focus ring fade-in |
| Standard | 240ms | Button hover deepen, card border deepen |
| Slow | 320ms | Scroll-reveal fade-and-rise, dropdown reveal |
### Per-Component Recipes
- **Brick-red link hover**: colour deepens `#d04841` → `#b83d37` and a 1px underline grows from 0 to full width over 150ms ease-standard.
- **Primary CTA hover**: bg deepens `#d04841` → `#b83d37` over 240ms standard, with a subtle 1px upward lift. Pressed state goes `#9e332e`.
- **Secondary CTA hover**: bg deepens `#232222` → `#181717` over 240ms.
- **Ghost button hover**: bg fills `transparent` → `rgba(24, 23, 23, 0.04)` and border deepens over 240ms.
- **Card hover**: border deepens + shadow intensifies (the elevated tier) over 240ms, with a minimal 2px lift on interactive product cards.
- **Scroll-reveal**: marketing-page sections fade in with a 12px upward rise over 320ms ease-out-soft when entering the viewport at ~80% threshold. One-shot per section.
- **Mega-menu reveal**: dropdown fades + drops 8px over 240ms ease-out-soft; closes instantly on blur.
- **Modal entry**: backdrop scrim fades in over 200ms; modal content fades + scales from 0.97 to 1.0 over 320ms ease-emphasized.
- **Toast slide-in**: from top-right with 12px translate-down + opacity 0→1 over 320ms ease-emphasized; auto-dismisses after 5s.
### Page Transitions
Page-to-page navigation uses a soft cross-fade with the sticky header held static. Smooth-scroll for anchor links uses ease-emphasized. The motion register is calm and unhurried — matching the brand's engineering-calm voice; nothing bounces or overshoots aggressively.
### Reduced Motion
Respects `prefers-reduced-motion: reduce`. All `translate` and `scale` transforms suppress entirely — replaced with instant render or opacity-only fades. Durations halve. Scroll-reveal becomes static on-mount (no rise). Modal scale-in becomes instant. Link-hover underline appears instantly rather than growing. The brand experience stays visually consistent under reduced motion — nothing breaks or disappears.
## 9. Accessibility & A11y
### Contrast Pairs
| Pair | Ratio | Level |
|------|-------|-------|
| `#181717` text on `#f9f7f6` canvas | 15.9 | AAA at all sizes |
| `#181717` text on `#ffffff` card | 17.0 | AAA at all sizes |
| `#4a4746` secondary on `#f9f7f6` | 8.6 | AAA at body sizes |
| `#736f6d` tertiary on `#f9f7f6` | 4.7 | AA at body sizes |
| `#a39e9b` faint on `#f9f7f6` | 2.4 | Fails AA at body — used only for placeholder/disabled |
| `#ffffff` text on `#d04841` brick-red CTA | 4.6 | AA at all sizes / AAA at large |
| `#ffffff` text on `#232222` dark CTA | 15.1 | AAA at all sizes |
| `#d04841` link on `#f9f7f6` canvas | 4.5 | AA at body / AAA at large; reinforced with hover-underline |
| `#9e332e` badge text on `rgba(208,72,65,0.10)` wash | 6.8 | AA at body sizes |
| `#f5f2f0` text on `#181717` inversion band | 15.2 | AAA at all sizes |
The brand link colour `#d04841` sits at ~4.5:1 against the warm canvas — passing WCAG AA at body sizes. Tailscale reinforces the link affordance with a hover-underline so colour-blind users can identify links by behaviour, not colour alone. White-on-brick-red (`#ffffff` on `#d04841`) sits at ~4.6:1 — AA for the 16px / 500 button text and AAA at the larger sizes; the primary CTA never drops below 16px so the ratio always holds.
### Focus Indicators
Focus ring is `3px solid rgba(208, 72, 65, 0.20)` translucent brick-red with 2px outline-offset — the warm accent doubling as the focus colour. The ring appears on every focusable element (buttons, links, inputs, cards-as-links). On inputs, focus also shifts the border to solid `#d04841`. The brick-red ring is unmistakable against the warm canvas and ties the focus system to the brand colour.
### ARIA Patterns
- **Top nav**: `<nav aria-label="Primary">` landmark with a skip-link to `<main>`. Mega-menu dropdowns use `aria-haspopup="true" aria-expanded`.
- **Product grid**: `<section aria-label="Platform">` with `<article>` cards; each labelled via `aria-labelledby` pointing to the card heading.
- **Pricing table**: proper `<table>` semantics with `<th scope="col">` for tiers and `<th scope="row">` for features; the "Most popular" badge announced as part of the tier heading.
- **Code blocks**: `<pre><code role="region" aria-label="Tailscale CLI example" tabindex="0">` — focusable and language-labelled.
- **Modal**: `role="dialog" aria-modal="true" aria-labelledby` with a focus trap and Esc-to-close.
- **Toast notifications**: `aria-live="polite"` for non-critical, `aria-live="assertive"` for errors.
- **System-status indicator**: `aria-live="polite"` with descriptive text ("All systems operational").
### Keyboard Navigation
- Tab order: skip-link → wordmark → primary nav → search → auth CTAs → main content (document order) → footer
- Arrow keys navigate inside mega-menu dropdowns and the pricing tier toggles
- `Esc` closes modals, dropdowns, and the mobile nav sheet
- Code blocks are focusable (`tabindex="0"`) so keyboard users can scroll into them
- The primary brick-red CTA is always reachable and is the first interactive element in the hero's tab order
### Screen Reader Hints
- Uppercase eyebrows use `text-transform: uppercase` (CSS) so screen readers announce natural-case
- Decorative illustrations and the brick-red flourish glyphs carry `aria-hidden="true"`
- The brand wordmark uses `aria-label="Tailscale"`
- IP addresses and CIDR ranges in mono blocks announce digit-by-digit; the slashed-zero (`zero` feature) is purely visual
- Pricing values announce with currency and period ("eight US dollars per user per month")
### Reduced Motion
All transitions degrade to opacity-only or instant. Scroll-reveal rise suppresses (static on-mount). Modal scale-in becomes instant. Link-hover underline appears instantly. The brand experience preserves full visual consistency under reduced motion.
## 10. Responsive Behavior
### Breakpoints
| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | <640px | Top nav collapses to logo + CTA + hamburger; hero h1 drops 48→32px; cards 1-up; CTA pair stacks vertically; logo strip wraps to 2-up |
| Tablet | 640–1024px | Top nav keeps inline links (no mega-menu hover); hero h1 at 40px; cards 2-up; logo strip 3-up |
| Desktop | 1024–1280px | Full nav with mega-menu; hero h1 at 48px; cards 3-up; full layouts |
| Wide | 1280px+ | Content width caps at 1280; gutters absorb the remainder |
### Touch Targets
- Buttons: 48px height across the board — comfortably above the 44px Apple HIG minimum
- Inputs: 44px height
- Tag chips: 28px visual height with padding for a 44px effective tap area
- Top nav links: 44×44px minimum tap area
- Product cards: full-card tap target when the card is a link
### Collapsing Strategy
- **Top nav** at <1024px: primary nav links collapse into a hamburger sheet; mega-menus become accordion sections inside the sheet
- **Hero CTA pair** at <640px: stacks vertically (brick-red primary above, dark secondary below)
- **Product card grid**: 3 → 2 → 1 columns
- **Customer logo strip**: 5 → 3 → 2 across; logos maintain aspect ratio
- **Pricing cards** at <1024px: swipe-able horizontal scroll with snap points, or stack vertically with the "Most popular" tier first
- **Code blocks**: gain horizontal scroll on overflow rather than wrapping CLI commands
### Image Behavior
Customer logos use SVG with `currentColor` so they inherit the secondary-text colour (monochrome on the marketing surface). Product screenshots use `aspect-ratio` to prevent layout shift. Marketing illustrations use `srcset` 1x/2x for retina. Below-fold images lazy-load; the hero is eager.
### Container Queries
Used inside product cards: when a card crosses ~320px width, an inline icon-and-title layout switches from stacked to side-by-side. This lets the same product card render compactly in a dense 3-up grid and expansively as a single featured tile.
## 11. Content & Voice
### Tone
**Approachable-technical, calm, credibility-first.** Tailscale writes like a trusted infrastructure engineer who happens to be warm — confident in the technical claims ("Zero Trust identity-based connectivity platform that replaces your legacy VPN, SASE, and PAM") but never cold or jargon-walled. Headlines are declarative statements ("The best secure connectivity platform for the AI era"); subheads explain capability in plain terms; product copy uses real technical vocabulary (mesh, exit node, ACL, WireGuard, Zero Trust) without translating it into consumer-speak, but always with enough framing that a non-specialist can follow. The voice sits between Linear's calm restraint and a senior engineer explaining why this is genuinely simpler than the legacy alternative.
### Microcopy Patterns
- **Button verbs**: *Start connecting devices*, *Get started*, *Contact sales*, *Talk to an expert*, *Read the docs*, *See pricing*. Outcome-focused and concrete — "Start connecting devices" describes the literal first action, not a generic "Sign up".
- **Error messages**: specific and accountable — *"Couldn't reach this node. Check that `tailscaled` is running and the device is online."* Includes the exact technical detail and the next step.
- **Success confirmations**: brief and declarative — *"Device connected."* / *"Exit node enabled."* No exclamation.
- **Empty states**: instruction-led with the exact command — *"No devices yet. Run `tailscale up` on a machine to add it to your tailnet."*
- **Field labels**: single-word where possible — *Email*, *Tailnet*, *Device name*, *Tags*.
- **Tooltips**: explain technical concepts inline (e.g. ephemeral nodes, ACL tags) without breaking the reading flow.
### Empty States
Empty states follow the brand's instruction-led convention: name the state, give the next step, include the exact command or action. *"No devices in this tailnet yet — run `tailscale up` to add your first."* The tone is helpful-engineer, not apologetic.
### CTA Verb Conventions
- Primary (brick-red): *Start connecting devices*, *Get started*, *Try Tailscale free*
- Secondary (dark): *Contact sales*, *Talk to an expert*, *Book a demo*
- Tertiary text-link: *See pricing*, *Read the docs*, *View case study*, *Browse use cases*
- Avoided: *Click here*, *Submit*, *Buy now*, exclamation-heavy enthusiasm. Tailscale uses concrete, outcome-describing verbs and product/feature names directly.
The verbs match the approachable-technical voice — concrete, warm, never marketing-template.
## 12. Dark Mode & Theming
**Light-default, with intentional near-black inversion bands.** Tailscale's marketing site is built on the warm `#f9f7f6` canvas and does not ship a full site-wide dark theme toggle on the marketing surface — the page is light-default and respects `prefers-color-scheme` only at the CSS-variable level for embedded UI. Instead, the brand uses **near-black inversion bands within the light page** as a deliberate compositional device: a `#181717` (or `#232222`) section appears for testimonials and the closing CTA, inverting text to `#f5f2f0` near-white while the brick-red accent stays unchanged.
Inversion-band token swap:
- **band bg**: `#f9f7f6` → `#181717` (near-black, warm-leaning)
- **dark card bg**: `#ffffff` → `#232222`
- **text**: `#181717` → `#f5f2f0` (near-white)
- **text-secondary**: `#4a4746` → `#a39e9b`
- **brand**: `#d04841` (unchanged — brick-red passes contrast on both warm-light and near-black grounds)
- **border**: `rgba(24, 23, 23, 0.12)` → `rgba(255, 255, 255, 0.08)`
- **primary CTA**: stays brick-red `#d04841` on the dark band — the warm accent reads strongly against near-black
The product dashboard (`login.tailscale.com`) ships its own system-aware dark mode; the marketing surface uses inversion as accent rather than a full theme. The brick-red accent is the constant across both grounds — its contrast holds on warm-light *and* near-black, which is why the band-inversion device works without a second accent.
## 13. Lineage & Influences
Tailscale's design DNA traces three lineages. First, the **warm-minimal developer-product polish** that Stripe pioneered and Linear and Vercel refined — type-disciplined, single-accent, editorial-spaced — but Tailscale ports it onto a *warmer* canvas and picks a *warm* accent where its peers stay cool. Second, the **off-white "intentional, not default" surface philosophy** shared by Notion, Mintlify, and Vercel: a near-white canvas that signals "a person designed this" rather than "this is an unstyled browser page". Tailscale's `#f9f7f6` is the warmest reading of that idea in the dev-tool space. Third, the **engineering-credibility-first posture** inherited from WireGuard, the protocol Tailscale is built on — the copy leads with technical truth and trusts the reader, never wrapping the product in marketing fluff.
The defining decision is the **warm brick-red accent** in a category that defaults to navy and blue. Every legacy VPN / SASE / Zero-Trust vendor reaches for a cool, "secure" blue; Tailscale's `#d04841` is a deliberate counter-positioning — a warm, human, slightly-earthy red that makes the brand instantly distinguishable on a category landing page full of blue shields. The red is applied with single-accent discipline (it does *all* the colour work) borrowed from Linear and Vercel, but its warmth is entirely Tailscale's own.
The second considered decision is the **two-tier CTA grammar** — warm brick-red as the dominant primary, dark near-black as the supporting secondary, with a deliberate radius difference (16px friendly primary vs 8px tighter secondary). This inverts the more common "neutral primary, colour secondary" arrangement that Vercel uses, and it encodes the brand's product thesis: the warm, self-serve path is the headline; the enterprise/sales path is the quieter twin.
What Tailscale rejects: the clinical `#ffffff` canvas of legacy networking vendors, navy/blue brand accents (the category default), the shield-and-lock visual cliché, multi-colour gradient flourishes (Stripe-era / Vercel-era signal), shouty 700–800 hero weights, and jargon-walled enterprise-legalese copy. The brand keeps the warmth of consumer design and the credibility of infrastructure tooling in the same frame.
**Influences:**
- **Inter (Rasmus Andersson)** — The full type identity; Inter set at restrained weights for both display and body. The engineering-calm register depends on the typeface, not on colour. *https://rsms.me/inter/*
- **Stripe** — Developer-product-as-magazine polish; the warm-light, type-disciplined, single-accent register descends from Stripe's marketing era. *https://stripe.com*
- **Linear** — Adjacent dev-tool peer; the calm, low-shout headline weight and the human-technical voice share Linear's restraint. *https://linear.app*
- **Vercel** — The off-white "intentional, not `#ffffff`" canvas philosophy and near-black-on-near-white type discipline — Tailscale warms the same idea. *https://vercel.com*
- **Notion** — Warm off-white surface as a deliberate signal of approachability over the clinical white of legacy enterprise software. *https://notion.so*
- **WireGuard** — The protocol Tailscale builds on; the engineering-credibility-first, no-marketing-fluff posture shapes the tone of the product copy. *https://www.wireguard.com*
## 14. Do's and Don'ts
### Do
- **Do** use warm off-white `#f9f7f6` for the canvas — a hair of cream, deliberately not clinical `#ffffff`. The warmth is the brand's first signal.
- **Do** use near-black `#181717` for text — warm-leaning, at ~9% lightness, 15.9:1 on the canvas.
- **Do** make the brick-red `#d04841` the *primary* CTA fill — the warm colour is the dominant action.
- **Do** use the dark `#232222` for the *secondary* CTA — the supporting enterprise/sales path.
- **Do** keep the radius difference: 16px on the friendly brick-red primary, 8px on the tighter dark secondary.
- **Do** set headlines in Inter at a restrained 500 weight (h1 at 48px / 500) — calm confidence, not a marketing shout.
- **Do** practise single-accent discipline — brick-red does all the colour work; warm greys carry hierarchy.
- **Do** use soft warm-toned shadows (`rgba(24, 23, 23, …)` at 4–6%) so they sit on the warm canvas.
- **Do** alternate sections by brightness-and-warmth (canvas → white → warm-grey → near-black), not by colour.
- **Do** use near-black inversion bands for testimonials and the closing CTA — the brick-red accent holds on both grounds.
- **Do** keep the brick-red accent constant across light and inversion-band grounds.
- **Do** write approachable-technical copy — real terms (mesh, ACL, Zero Trust, WireGuard) with enough framing to follow.
### Don't
- **Don't** use clinical `#ffffff` for the page canvas. The warm off-white is the entry ticket; cold white collapses the brand into the networking-category default.
- **Don't** reach for navy or blue accents. Every legacy VPN vendor uses blue — the brick-red is the counter-positioning.
- **Don't** introduce a second accent hue. The system is single-accent brick-red + warm-grey neutrals.
- **Don't** make the dark button the primary and the colour the secondary. Tailscale inverts that: warm colour is dominant.
- **Don't** push hero weight to 700–800. The 500-weight h1 is the brand's calm-confidence signal.
- **Don't** introduce a serif or a second sans. Inter is the entire system; mono is system-stack for code only.
- **Don't** use pure-black `#000000` shadows. Warm-toned `rgba(24, 23, 23, …)` shadows keep the palette coherent.
- **Don't** widen the reading column beyond 720px. ~70-character line length even on the 1280px page.
- **Don't** use the shield-and-lock security cliché or stock "cybersecurity" visuals. The warmth is the differentiator.
- **Don't** wall the copy in enterprise-legalese or jargon. Approachable-technical means real terms *with* framing.
- **Don't** use exclamation-heavy enthusiasm. The voice is calm engineering-credibility.
- **Don't** make CTAs full 9999px pills. Tailscale's buttons are soft-cornered rectangles (16px / 8px); the pill is for badges only.
## 15. Agent Prompt Guide
### Quick Color Reference
```
Canvas: #f9f7f6 (warm off-white — NEVER #ffffff)
Pure White: #ffffff (card surface only)
Bg Warm Stripe: #efeae7
Text: #181717 (warm near-black)
Text Secondary: #4a4746
Text Tertiary: #736f6d
Brand Brick-Red: #d04841 (primary CTA fill, links, accents)
Brand Hover: #b83d37
CTA Secondary BG: #232222 (dark — supporting action)
Inversion Band: #181717 (testimonial / closing-CTA band)
Border: rgba(24, 23, 23, 0.12)
Focus Ring: rgba(208, 72, 65, 0.20) 0 0 0 3px
```
### Example Component Prompts
1. **"Create a Tailscale-style hero: warm off-white `#f9f7f6` canvas, 48px / 500 Inter h1 with `-0.018em` tracking in warm near-black `#181717` ('The best secure connectivity platform for the AI era'), 18px / 400 Inter body deck at 1.55 line-height, dual CTA pair below — primary brick-red button (`#d04841` fill, white text 16px / 500, 16px radius, 48px height, label 'Start connecting devices') and secondary dark button (`#232222` fill, white text 16px / 500, 8px radius, 48px height, label 'Contact sales'). Customer-logo strip beneath in monochrome `#4a4746`."**
2. **"Design a Tailscale product card: `#ffffff` pure-white fill on a warm `#f9f7f6` canvas, 12px radius, 1px `rgba(24, 23, 23, 0.12)` hairline border, 24px padding, soft warm shadow `rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px`. Inside: 40×40 line icon in `#d04841`, 24px / 600 Inter h3 heading, 16px / 400 Inter body in `#4a4746`, brick-red text-link 'Learn more →' at the bottom. Hover: shadow intensifies, border deepens, 2px lift."**
3. **"Build a Tailscale pricing card row: four flat white cards (Personal, Standard, Premium, Enterprise) at 12px radius with `rgba(24, 23, 23, 0.12)` borders on the warm canvas. The Premium tier carries a 'Most popular' badge (`rgba(208, 72, 65, 0.10)` soft-red wash, `#9e332e` text, 13px / 600, 9999px pill). Tier name in 20px / 600, price in Inter 32px / 700 with tabular numerals, feature list with brick-red checkmarks, brick-red primary CTA 'Get started' (16px radius) — Enterprise uses dark `#232222` 'Contact sales' (8px radius)."**
4. **"Render a Tailscale top nav: 64px height, `rgba(249, 247, 246, 0.85)` translucent warm-canvas fill with `backdrop-filter: blur(12px) saturate(160%)`, 1px bottom hairline `rgba(24, 23, 23, 0.08)`. Wordmark left in Inter 18px / 600 near-black. Center nav links (Platform, Solutions, Customers, Community, Partnerships, Pricing) in 16px / 500 with mega-menu dropdowns. Right: ghost 'Log in' + dark secondary 'Contact sales' (`#232222`, 8px radius) + primary brick-red 'Get started' (`#d04841`, 16px radius)."**
5. **"Compose a Tailscale closing-CTA band: full-bleed near-black `#181717` inversion band, centered white headline in Inter 32px / 600 (`#f5f2f0`), 18px / 400 supporting line in `#a39e9b`, single brick-red primary CTA 'Start connecting devices' (`#d04841` fill, white text, 16px radius, 48px height). The brick-red accent stays unchanged on the dark ground."**
6. **"Build a Tailscale code band: `#ffffff` band on the warm page, centered mono CLI block at 720px reading width in the system monospace stack with slashed-zero (`zero`) enabled, 14px / 400 / 1.6 line-height, showing `tailscale up`. Above the block: an uppercase eyebrow 'GET CONNECTED' in Inter 13px / 600 / 0.02em tracking in `#4a4746`, then a 32px / 600 h2 and a 16px / 400 body paragraph introducing the command."**
### Iteration Guide
1. **Check the canvas value.** If it's `#ffffff` or any cool grey, you've drifted into the networking-category default. Tailscale is warm off-white `#f9f7f6` — the warmth is the brand's first and most important signal.
2. **Make the accent red, not blue.** If your accent is navy or primary-blue, you've reverted to the category cliché. Tailscale's accent is brick-red `#d04841` — a warm, human counter-positioning.
3. **Put the colour on the *primary* CTA.** If the brick-red is on the secondary button and a dark/neutral button is primary, flip them. Tailscale's warm colour is the dominant action; the dark `#232222` is the supporting twin.
4. **Keep the radius asymmetry.** 16px on the friendly brick-red primary, 8px on the tighter dark secondary. Equal radii lose the brand's CTA grammar.
5. **Drop the hero weight to 500.** If your h1 is 700–800, it's too loud. Tailscale's calm 48px / 500 Inter h1 is the confidence signal.
6. **Stay single-accent.** Brick-red does all the colour work; let warm greys carry hierarchy. A second accent hue breaks the discipline — even success can lean on the inversion band instead of a green.
7. **Warm your shadows.** Use `rgba(24, 23, 23, …)` not `rgba(0, 0, 0, …)`. Pure-black shadows read clinical against the warm canvas.
8. **Use inversion, not a colour band.** When a section needs energy, reach for the near-black `#181717` inversion band with the brick-red accent intact — not a coloured background.
---
*Theme-toggle audit: score=2, signals=[prefers-color-scheme-css]*
1. Visual Theme & Atmosphere
Tailscale’s marketing site is a deliberate refusal of the networking category’s house style. Open any legacy VPN, SASE, or Zero-Trust vendor and you get the same page: clinical #ffffff, navy-blue accents, a shield icon, and copy that reads like a compliance datasheet. Tailscale throws all of that out. The canvas is a warm off-white #f9f7f6 — not cream, but not the cold default white either; a surface that signals “a person designed this on purpose.” The type is near-black #181717 in Inter. And the single brand accent is a confident brick-RED #d04841 (rgb 208, 72, 65) — a warm, slightly-earthy red that no infrastructure competitor is using. The cumulative effect is a security tool that feels human and warm while still reading as precise, credible, and engineering-grade.
The defining decision is the warmth-without-softness balance. The off-white canvas, the warm-leaning near-black text (#181717 reads slightly warmer than a true grey), the brick-red rather than a primary-blue — every choice nudges the brand toward “approachable” — but the restraint of the execution keeps it from tipping into consumer-friendly mush. Headlines run Inter at 48px / weight 500, which is unusually light for a marketing hero; most SaaS pushes 700–800 to shout. Tailscale’s 500-weight h1 is a confidence signal: the product doesn’t need to raise its voice. The page reads the way a senior infrastructure engineer talks — calm, exact, willing to use the words “mesh”, “Zero Trust”, and “WireGuard” without dumbing them down, but never cold.
The chromatic register is single-accent discipline. Brick-red #d04841 does all the colour work: it fills the primary CTA, it colours inline links, it tints the “Most popular” badge, it draws the focus ring, and it appears in small illustration flourishes. There is no secondary accent hue — no green-for-success-blue-for-info rainbow. Where a state needs a colour, the system reaches first for the neutral ramp (warm greys) and only introduces red where the brand wants attention. This is the same accent-only discipline that Linear and Vercel practise, but Tailscale picks a warm accent instead of a cool one, which is what makes the page feel categorically different from its blue-saturated peers.
The second structural tell is the two-tier CTA grammar. The primary action is the warm brick-red pill (#d04841 fill, white text, 16px radius) — “Start connecting devices”, “Get started”. The secondary action is a dark near-black button (#232222 fill, white text, tighter 8px radius) — “Contact sales”. This inverts the more common arrangement where the neutral/dark button is primary and the colour is secondary. Tailscale makes the warm colour dominant and the dark neutral supporting — a small grammar choice that reinforces the brand’s whole thesis: the warm, human path (self-serve, connect a device now) is the headline action; the enterprise path (talk to a human) is the quieter twin. The radius difference (16px vs 8px) is intentional too — the bigger, friendlier radius lives on the friendlier action.
Density is moderate and editorial. The page caps at 1280px, with a 720px reading column inside. Product cards sit in pure-white tiles on the warm canvas, lifted by soft warm-toned shadows. Sections alternate by brightness and warmth — warm canvas → pure-white card band → warm-grey quote stripe → a near-black inversion band for a testimonial or the closing CTA — rather than by colour. Customer logos (Cohere, Duolingo, Hugging Face, Microsoft, Nvidia) render in a clean grid; “30,000 businesses choose Tailscale” anchors the social proof. The vocabulary that captures the feeling: warm-off-white, brick-red-accent, Inter-calm, approachable-technical, single-accent, two-tier-CTA, security-with-warmth, engineering-honest, soft-shadow, no-navy, no-clinical-white, human-infrastructure.
Key Characteristics
- Warm off-white
#f9f7f6canvas — a hair of cream, deliberately not the clinical#ffffffof legacy networking vendors - Near-black
#181717text and headlines — warm-leaning, at ~9% lightness - Single brand accent: confident brick-RED
#d04841(rgb 208, 72, 65) — warm, not the category-default navy/blue - Inter carries both display and body — engineering-calm, no second typeface
- Restrained hero weight: h1 at Inter 48px / 500, not the 700–800 marketing shout
- Two-tier CTA grammar: warm brick-red primary (16px radius) + dark
#232222secondary (8px radius) - Accent-only chromatic discipline — red does the colour work; neutral warm greys carry hierarchy
- Pure-white
#ffffffcards on the warm canvas, lifted by soft warm-toned shadows - Brightness-and-warmth section alternation (canvas → white → warm-grey → near-black), never colour-coded bands
- 1280px page width with a 720px reading column — editorial, moderate density
- Rounded 16px on the friendly primary action; 8/12px on cards, inputs, and the supporting button
- Light-default, with near-black inversion bands used for testimonials and the closing CTA
2. Color Palette & Roles
Canvas / Primary
- Canvas (
#f9f7f6) [→--bg]: the page background — warm off-white with a hair of cream. The only page background; the brand’s entry ticket. Cooler#ffffffwould collapse Tailscale into the clinical-networking default it’s built to reject. - Pure White (
#ffffff) [→--bg-pure]: card and modal surface. The contrast against the warm#f9f7f6canvas is the brand’s primary elevation signal. - Body Text (
#181717) [→--text]: primary text and headlines — warm-leaning near-black at ~9% lightness, 15.9:1 against the canvas. The slight warmth (vs a neutral grey) ties the type to the warm canvas. - Section Elevation (
#f3f0ee) [→--bg-elev]: subtle warm elevation for section bands, inset blocks, alternate stripes. - Warm Stripe (
#efeae7) [→--bg-warm]: third-tier warm shading for quote bands and feature-stripe fills.
Brand & Sub-Brand
- Brick-Red (
#d04841) [→--brand]: the canonical brand colour — rgb(208, 72, 65). Fills the primary CTA, colours inline links, tints badges, draws the focus ring. The single accent; no second hue. - Brand Hover (
#b83d37) [→--brand-hover]: deeper brick-red for primary-CTA hover and link hover. - Brand Deep (
#9e332e) [→--brand-deep]: pressed/active state and badge text colour (for AA contrast on the soft wash). - Brand Soft (
rgba(208, 72, 65, 0.10)) [→--brand-soft]: soft red wash — badge backgrounds, link aura, status-pill fills. - Brand Tint (
rgba(208, 72, 65, 0.06)) [→--brand-tint]: subtlest red tint foraria-currentrows and very quiet emphasis.
Accent
Tailscale’s only chromatic flourish is brick-red itself — there is no gradient and no secondary accent hue. Small illustration touches, the “Most popular” pricing badge, inline-link colour, checkmark glyphs in feature lists, and the focus ring all draw from the same #d04841 family. The discipline is “one warm accent, applied with restraint” — the opposite of the multi-colour gradient flourishes that Stripe-era and Vercel-era pages use. When the page needs visual energy, it reaches for the near-black inversion band, not a second colour.
Interactive
- Link (
#d04841) [→--link]: inline links in body copy — brick-red, no underline at rest. Hover deepens to#b83d37and reveals a 1px underline. - Selected (
#9e332etext onrgba(208, 72, 65, 0.10)): selected nav, active TOC item, current pricing tier. - Disabled (
#a39e9btext): disabled controls drop to the faint warm grey, no colour cue. - Focus (
rgba(208, 72, 65, 0.40)ring): keyboard focus — translucent brick-red ring on every focusable element.
Neutral Scale (Warm Greys)
Tailscale’s neutral ramp is warm-tinted rather than pure grey — every step carries a trace of the canvas’s warmth so the greys never read clinical:
- Pure White (
#ffffff) — card surface - Canvas (
#f9f7f6) — page background - Bg Elev (
#f3f0ee) — section band, inset block - Bg Warm (
#efeae7) — third tier, quote stripe - Border Soft (
rgba(24, 23, 23, 0.07)) — quietest separation - Border (
rgba(24, 23, 23, 0.12)) — default hairline - Border Strong (
rgba(24, 23, 23, 0.22)) — inputs, ghost-button border - Text Faint (
#a39e9b) — placeholder, disabled - Text Tertiary (
#736f6d) — captions, meta - Text Secondary (
#4a4746) — supporting copy, dense-row body - Text (
#181717) — primary text, headlines
Surface & Borders
- Canvas (
#f9f7f6) — the single warm page background - Pure White (
#ffffff) — card and modal surface - Bg Elev (
#f3f0ee) — section band, inset block - Bg Warm (
#efeae7) — quote band, feature stripe - Bg Ink (
#181717) — near-black inversion band (testimonial, closing CTA) - Bg Ink Soft (
#232222) — dark secondary-CTA fill and dark card surface - Border Soft (
rgba(24, 23, 23, 0.07)) — quietest separation - Border Default (
rgba(24, 23, 23, 0.12)) — translucent near-black hairline over warm canvas - Border Strong (
rgba(24, 23, 23, 0.22)) — outlined buttons, focused inputs - Border Ink (
#181717) — full near-black border for high-emphasis outlined CTAs
Shadow Colors
Tailscale’s shadows are warm-toned and soft — built from rgba(24, 23, 23, …) rather than pure black, so they sit harmoniously on the warm canvas. The stack is gentle (6–8% on cards) but slightly more present than Vercel’s near-invisible 4% — enough to give product tiles a friendly, resting-on-the-surface lift without the clinical flatness of the networking category.
rgba(24, 23, 23, 0.04) 0 1px 2px— ambientrgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px— card (the signature soft warm lift)rgba(24, 23, 23, 0.08) 0 4px 12px, rgba(24, 23, 23, 0.06) 0 16px 32px -8px— elevated dropdownrgba(24, 23, 23, 0.14) 0 12px 32px -8px— popoverrgba(24, 23, 23, 0.20) 0 24px 64px -16px— modal
Semantic
- Success (
#2f7d52onrgba(47, 125, 82, 0.10)): advisory green — “all systems operational”, deployment-ready states. The one place a non-red colour appears, and even here it’s a muted, warm-leaning green. - Warning (
#c9821fonrgba(201, 130, 31, 0.10)): advisory amber — warnings, rate-limit notices. - Danger (
#d04841onrgba(208, 72, 65, 0.10)): destructive red collapses into the brand brick-red — Tailscale’s convention treats danger and brand as the same hue, since the brand colour is already red. Destructive confirmations read as a slightly deeper, more saturated red. - Info (
#181717onrgba(24, 23, 23, 0.06)): info reads as neutral near-black on a warm-grey wash — info is not given a colour, preserving the single-accent discipline.
3. Typography Rules
Font Family
Primary: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif. Inter (Rasmus Andersson, open-source) carries the entire identity — both display and body. Inter is the de-facto neutral-grotesque of modern SaaS, but Tailscale’s distinctiveness comes not from the typeface itself but from how it’s set: restrained weights, calm headline sizing, and the warm canvas behind it. Inter’s tall x-height and even rhythm read clearly at small sizes (dense docs, dashboard tables) and stay composed at hero scale.
Mono companion: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace. Tailscale uses the system mono stack rather than a proprietary mono — code samples (tailscale up, ACL JSON, exit-node config) render in the OS-native monospace. The choice is pragmatic: the brand’s identity lives in Inter and the brick-red, not in a bespoke mono. Mono carries CLI commands, ACL policy snippets, IP/CIDR notation, and inline code references.
OpenType features: Inter renders with kern, liga, and calt (contextual alternates) always on. The mono stack adds liga/calt for code, zero for slashed zero (so 0 and O disambiguate in IP addresses), and tnum for tabular numerals in pricing tables and dashboard metrics.
The single-family discipline (Inter for everything, system mono for code) keeps the brand calm and unfussy — no display serif, no second sans. The identity is carried by weight restraint and the warm-canvas + brick-red pairing.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Transform | Notes |
|---|---|---|---|---|---|---|---|
| display-hero | Inter | 80px | 700 | 1.0 | -0.03em | — | Oversized landing hero (rare) |
| display-lg | Inter | 56px | 700 | 1.05 | -0.02em | — | Major section opener |
| h1 | Inter | 48px | 500 | 1.1 | -0.018em | — | Page / hero title — restrained 500 weight |
| h2 | Inter | 32px | 600 | 1.2 | -0.012em | — | Marketing section H2 |
| h3 | Inter | 24px | 600 | 1.25 | -0.005em | — | Card heading, article H3 |
| h4 | Inter | 20px | 600 | 1.3 | 0 | — | Sub-card heading |
| h5 | Inter | 18px | 600 | 1.4 | 0 | — | Inline emphasis heading |
| eyebrow | Inter | 13px | 600 | 1.4 | 0.02em | uppercase | Section pre-label |
| body-lg | Inter | 18px | 400 | 1.55 | 0 | — | Hero deck, lede paragraph |
| body | Inter | 16px | 400 | 1.55 | 0 | — | Default body copy |
| body-sm | Inter | 14px | 400 | 1.5 | 0 | — | Card body, dense-row body |
| label | Inter | 13px | 500 | 1.4 | 0 | — | Form field label |
| label-strong | Inter | 13px | 600 | 1.4 | 0 | — | Emphasised label, table header |
| caption | Inter | 12px | 500 | 1.4 | 0.02em | — | Image caption, footer micro |
| button | Inter | 16px | 500 | 1.2 | 0 | — | Default button copy |
| button-sm | Inter | 14px | 500 | 1.2 | 0 | — | Compact / header button |
| code-block | Mono | 14px | 400 | 1.6 | 0 | — | CLI / config block content |
| code-inline | Mono | 14px | 500 | 1.4 | 0 | — | Inline code references |
| code-micro | Mono | 12px | 500 | 1.4 | 0 | — | Code tag, language label |
Principles
- Restrained headline weight. The h1 sits at 500, not the 700–800 marketing default. The calm weight is the brand’s confidence signal — the product doesn’t shout.
- Single-family discipline. Inter for display, body, captions, and labels. System mono for code only. No display serif, no second sans.
- Weight steps up for sub-headings, not the hero. h2/h3/h4 climb to 600 while the hero h1 stays at 500 — the page gets firmer as headings get smaller, an inversion of the usual “biggest = boldest” rule.
- Body holds at weight 400. Crisp 400-weight Inter body is what keeps long-form security/networking copy readable and calm.
- Negative tracking compresses with size.
-0.03emat 80px,-0.02emat 56px,-0.018emat 48px,-0.012emat 32px, near-zero below 24px. - 16px body at 1.55 line-height. Comfortable marketing-page reading, generous enough for dense technical explanation.
- Reading width caps at 720px even on the 1280px page — line length calibrated for ~70 characters.
- Mono for every CLI command and config snippet. The system mono with
zero(slashed zero) andtnumis the brand’s technical-credibility tell — IP addresses and CIDR ranges read unambiguously.
4. Component Stylings
Buttons
Primary (Brick-Red) — #d04841 brick-red fill, white text at 16px / 500, 16px radius, 12×20px padding, 48px height. Hover deepens to #b83d37 over 240ms standard with a subtle 1px lift. This is the dominant action — the warm path. Use case: Start connecting devices, Get started, Try Tailscale — the headline CTA on every section.
Secondary (Dark) — #232222 near-black fill, white text at 16px / 500, 8px radius (tighter than the primary), 12×20px padding, 48px height. Hover deepens to #181717. The supporting twin — the enterprise / human path. Use case: Contact sales, Talk to an expert, Book a demo. Paired adjacently with the primary brick-red button.
Ghost (Outlined) — Transparent fill, near-black text at 16px / 500, 1px border at rgba(24, 23, 23, 0.22), 8px radius, 48px height. Hover fills with rgba(24, 23, 23, 0.04). Use case: Read the docs, Learn more, Browse use cases — the quiet third action.
Link — Transparent fill, brick-red text at 16px / 500. No underline at rest; 1px underline appears on hover and colour deepens to #b83d37. Use case: text-link CTA — See pricing, View case study, Read the changelog.
Cards
Default Card — #ffffff pure-white fill, 1px hairline border at rgba(24, 23, 23, 0.12), 12px radius, 24px padding, soft warm dual-layer shadow (rgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px). The signature card — used for product highlights (Business VPN, Privileged Access, Infrastructure Access, Securing AI / Aperture), feature grids, and customer-story tiles. The pure-white-on-warm-canvas contrast is the primary elevation cue; the soft warm shadow adds a friendly lift.
Dark Card — #232222 near-black fill, #f5f2f0 text, 1px border at rgba(255, 255, 255, 0.08), 16px radius, 32px padding. Used for inverted testimonial blocks or highlight cards on otherwise warm-light pages. Rare; one or two per page.
Product Card (with icon) — Default card with a 40×40 icon at top (brick-red or near-black line icon), a 24px / 600 h3 title, 16px / 400 body in #4a4746 secondary, and a brick-red text-link CTA at the bottom (Learn more →).
Inputs / Forms
Text Input — #ffffff fill, near-black text at 16px / 400 Inter, 1px border at rgba(24, 23, 23, 0.22), 8px radius, 44px height, 10×12px padding. Placeholder at #a39e9b faint warm grey. On focus: border shifts to brick-red #d04841 and a 3px translucent brick-red ring appears (0 0 0 3px rgba(208, 72, 65, 0.20)).
Select — Same shape as text-input with a chevron at right (16px) at tertiary-text colour.
Search — Text-input shape with a leading magnifier icon; used in docs and the customer directory.
Badges, Tags, Pills
Highlight Badge — rgba(208, 72, 65, 0.10) soft-red wash, deep-red text (#9e332e) at 13px / 600, 9999px pill radius, 4×12px padding. Use case: Most popular (on the Premium pricing tier), New, Beta. The deep-red text keeps AA contrast against the soft wash.
Neutral Tag — rgba(24, 23, 23, 0.06) neutral warm wash, secondary-text colour at 13px / 500, pill or 4px radius, 4×10px padding. Use case: category labels, region tags, integration names.
Status Dot Pill — Live-status indicator with a 6px circle dot (#2f7d52 green for operational, #d04841 for incident) + a 13px / 500 Inter label. Used in the footer system-status and on dashboard surfaces.
Navigation
Top Nav — rgba(249, 247, 246, 0.85) translucent warm-canvas fill with backdrop-filter: blur(12px) saturate(160%), 64px height, 1px bottom hairline at rgba(24, 23, 23, 0.08). Wordmark left in Inter ~18px / 600 near-black. Center: nav links (Platform, Solutions, Customers, Community, Partnerships, Pricing) at 16px / 500 with mega-menu dropdowns. Right: ghost Log in + dark secondary Contact sales + primary brick-red Get started (or Start connecting devices).
Footer — #f9f7f6 warm canvas (or a near-black #181717 inversion variant), multi-column link grid (Platform, Solutions, Company, Support, Legal, Social) in Inter 14px / 400 secondary-text. Wordmark + system-status dot pill + region/locale selector at the bottom.
5. Layout Principles
Spacing System
- Base unit: 4px
- Scale:
0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 - Section padding (vertical): 96px for major marketing bands; 48–64px between sub-sections; 24–32px between content blocks and paragraphs
- Card internal padding: 24px on default cards; 32px on dark testimonial cards
- Inter-card gutters: 24px between cards in 2-up / 3-up grids; 16px in dense 4-up grids
Grid & Container
- Single canonical max width: 1280px for all marketing sections — moderate, editorial, not the 1400px dense-data sprawl of Vercel
- 12-column grid with 24px gutters
- Reading column caps at 720px even inside the 1280px container — line length calibrated for ~70 characters
- Hero treatment: warm-canvas full-bleed band, headline left-aligned (sometimes centered), dual-CTA pair (brick-red primary + dark secondary), customer-logo strip beneath
Whitespace Philosophy
Tailscale leans editorial-generous rather than dashboard-dense. Sections breathe with 96px vertical padding; product cards have room around them; the 720px reading column keeps long-form security explanations comfortable. The warmth of the canvas does part of the whitespace work — a warm off-white feels softer and more open than a clinical white, so the page can carry density without feeling cramped. The whitespace says “this is considered, this is calm, you have time to read.”
Section Cadence
A typical Tailscale page runs:
- Hero — warm
#f9f7f6canvas, 48px / 500 h1 (“The best secure connectivity platform for the AI era”), 18px / 400 body deck, dual CTA (brick-red Start connecting devices + dark Contact sales) - Customer Logo Strip — “30,000 businesses choose Tailscale”, monochrome logos (Cohere, Duolingo, Hugging Face, Microsoft, Nvidia) on the warm canvas
- Product Grid — pure-white cards in 2-up / 3-up (Business VPN, Privileged Access, Securing AI / Aperture, Infrastructure Access), each with icon + h3 + body + text-link
- Feature / Value Band — warm-grey
#efeae7stripe with a centered explanation and supporting visual - Code / Config Band —
#ffffffband with a mono CLI block (tailscale up) and prose introducing the example - Developer Testimonials — quote cards (some on the dark
#232222band) with X/Twitter pull-quotes - Closing CTA — near-black
#181717inversion band with white headline + a single brick-red primary CTA - Footer — multi-column link grid in 14px / 400 secondary, system-status dot pill at the bottom
The alternation is brightness-and-warmth-based (warm canvas → white → warm-grey → near-black) rather than colour-based.
6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Decorative dividers, indicator marks inside chips |
| Small | 4px | Tag chips, small inline chips |
| Comfortable | 8px | Inputs, secondary/ghost buttons, code chips |
| Relaxed | 12px | Cards (default), dropdowns, modals |
| Featured | 16px | Primary CTA, dark testimonial cards, hero panels |
| Pill | 9999px | Highlight badges, status pills, chips |
Tailscale’s signature shape is the 16px primary-CTA radius paired with the 8px secondary. The radius difference is a deliberate grammar: the friendlier, larger 16px corner lives on the warm brick-red primary action (the human, self-serve path), while the tighter 8px corner lives on the dark secondary (the enterprise path). Cards and inputs sit at the modern 12px / 8px consensus. The 9999px pill is reserved for small badges and status pills, never for buttons — Tailscale’s CTAs are soft-cornered rectangles, not full pills, which keeps them reading as buttons-with-warmth rather than consumer-app pills.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 — Flat | no shadow, warm canvas bg | Page canvas, body sections, warm-grey stripes |
| 1 — Hairline | 1px rgba(24, 23, 23, 0.12) border | Flat tiles, tag groups, inline blocks |
| 2 — Card | 1px border + rgba(24, 23, 23, 0.06) 0 1px 3px, 0 8px 24px -6px | Default product / feature cards |
| 3 — Elevated | rgba(24, 23, 23, 0.08) 0 4px 12px, 0 16px 32px -8px | Dropdowns, hover-lifted cards, mega-menus |
| 4 — Popover | rgba(24, 23, 23, 0.14) 0 12px 32px -8px | Command menus, tooltips, popovers |
| 5 — Modal | scrim rgba(24, 23, 23, 0.45) + rgba(24, 23, 23, 0.20) 0 24px 64px -16px | Sign-up dialog, confirmation modals |
Shadow Philosophy
Tailscale uses soft, warm-toned shadows built from rgba(24, 23, 23, …) rather than pure black, so they sit harmoniously on the warm #f9f7f6 canvas. The card shadow is dual-layer (a tight 1–3px ambient + a wide, soft 24px diffusion) at 4–6% opacity — present enough to give product tiles a friendly, resting-on-the-surface lift, but never the heavy drama of consumer-product shadows. The brand sits between Vercel’s near-invisible 4% (too clinical for Tailscale’s warmth) and the heavy consumer lift (too soft for an infrastructure tool).
The hairline border rgba(24, 23, 23, 0.12) does much of the elevation work in tandem with the canvas-vs-card brightness contrast (#f9f7f6 canvas vs #ffffff card). Cards lift via border + brightness + soft warm shadow together. Heavy shadows (popover, modal) are reserved for true overlay UI where the element must read as floating above the page. The warmth in the shadow colour is the micro-detail that keeps the elevation system coherent with the rest of the palette.
8. Interaction & Motion
Easing Curves
- Standard:
cubic-bezier(0.4, 0, 0.2, 1)— Material-style; default for hover, focus, colour transitions - Emphasized:
cubic-bezier(0.2, 0, 0, 1)— punchier exit; modal entry, toast slide-in - Out-Soft:
cubic-bezier(0.0, 0, 0.2, 1)— gentle settle; dropdown reveal, scroll-reveal
Duration Buckets
| Bucket | Value | Use |
|---|---|---|
| Fast | 150ms | Link underline grow, focus ring fade-in |
| Standard | 240ms | Button hover deepen, card border deepen |
| Slow | 320ms | Scroll-reveal fade-and-rise, dropdown reveal |
Per-Component Recipes
- Brick-red link hover: colour deepens
#d04841→#b83d37and a 1px underline grows from 0 to full width over 150ms ease-standard. - Primary CTA hover: bg deepens
#d04841→#b83d37over 240ms standard, with a subtle 1px upward lift. Pressed state goes#9e332e. - Secondary CTA hover: bg deepens
#232222→#181717over 240ms. - Ghost button hover: bg fills
transparent→rgba(24, 23, 23, 0.04)and border deepens over 240ms. - Card hover: border deepens + shadow intensifies (the elevated tier) over 240ms, with a minimal 2px lift on interactive product cards.
- Scroll-reveal: marketing-page sections fade in with a 12px upward rise over 320ms ease-out-soft when entering the viewport at ~80% threshold. One-shot per section.
- Mega-menu reveal: dropdown fades + drops 8px over 240ms ease-out-soft; closes instantly on blur.
- Modal entry: backdrop scrim fades in over 200ms; modal content fades + scales from 0.97 to 1.0 over 320ms ease-emphasized.
- Toast slide-in: from top-right with 12px translate-down + opacity 0→1 over 320ms ease-emphasized; auto-dismisses after 5s.
Page Transitions
Page-to-page navigation uses a soft cross-fade with the sticky header held static. Smooth-scroll for anchor links uses ease-emphasized. The motion register is calm and unhurried — matching the brand’s engineering-calm voice; nothing bounces or overshoots aggressively.
Reduced Motion
Respects prefers-reduced-motion: reduce. All translate and scale transforms suppress entirely — replaced with instant render or opacity-only fades. Durations halve. Scroll-reveal becomes static on-mount (no rise). Modal scale-in becomes instant. Link-hover underline appears instantly rather than growing. The brand experience stays visually consistent under reduced motion — nothing breaks or disappears.
9. Accessibility & A11y
Contrast Pairs
| Pair | Ratio | Level |
|---|---|---|
#181717 text on #f9f7f6 canvas | 15.9 | AAA at all sizes |
#181717 text on #ffffff card | 17.0 | AAA at all sizes |
#4a4746 secondary on #f9f7f6 | 8.6 | AAA at body sizes |
#736f6d tertiary on #f9f7f6 | 4.7 | AA at body sizes |
#a39e9b faint on #f9f7f6 | 2.4 | Fails AA at body — used only for placeholder/disabled |
#ffffff text on #d04841 brick-red CTA | 4.6 | AA at all sizes / AAA at large |
#ffffff text on #232222 dark CTA | 15.1 | AAA at all sizes |
#d04841 link on #f9f7f6 canvas | 4.5 | AA at body / AAA at large; reinforced with hover-underline |
#9e332e badge text on rgba(208,72,65,0.10) wash | 6.8 | AA at body sizes |
#f5f2f0 text on #181717 inversion band | 15.2 | AAA at all sizes |
The brand link colour #d04841 sits at ~4.5:1 against the warm canvas — passing WCAG AA at body sizes. Tailscale reinforces the link affordance with a hover-underline so colour-blind users can identify links by behaviour, not colour alone. White-on-brick-red (#ffffff on #d04841) sits at ~4.6:1 — AA for the 16px / 500 button text and AAA at the larger sizes; the primary CTA never drops below 16px so the ratio always holds.
Focus Indicators
Focus ring is 3px solid rgba(208, 72, 65, 0.20) translucent brick-red with 2px outline-offset — the warm accent doubling as the focus colour. The ring appears on every focusable element (buttons, links, inputs, cards-as-links). On inputs, focus also shifts the border to solid #d04841. The brick-red ring is unmistakable against the warm canvas and ties the focus system to the brand colour.
ARIA Patterns
- Top nav:
<nav aria-label="Primary">landmark with a skip-link to<main>. Mega-menu dropdowns usearia-haspopup="true" aria-expanded. - Product grid:
<section aria-label="Platform">with<article>cards; each labelled viaaria-labelledbypointing to the card heading. - Pricing table: proper
<table>semantics with<th scope="col">for tiers and<th scope="row">for features; the “Most popular” badge announced as part of the tier heading. - Code blocks:
<pre><code role="region" aria-label="Tailscale CLI example" tabindex="0">— focusable and language-labelled. - Modal:
role="dialog" aria-modal="true" aria-labelledbywith a focus trap and Esc-to-close. - Toast notifications:
aria-live="polite"for non-critical,aria-live="assertive"for errors. - System-status indicator:
aria-live="polite"with descriptive text (“All systems operational”).
Keyboard Navigation
- Tab order: skip-link → wordmark → primary nav → search → auth CTAs → main content (document order) → footer
- Arrow keys navigate inside mega-menu dropdowns and the pricing tier toggles
Esccloses modals, dropdowns, and the mobile nav sheet- Code blocks are focusable (
tabindex="0") so keyboard users can scroll into them - The primary brick-red CTA is always reachable and is the first interactive element in the hero’s tab order
Screen Reader Hints
- Uppercase eyebrows use
text-transform: uppercase(CSS) so screen readers announce natural-case - Decorative illustrations and the brick-red flourish glyphs carry
aria-hidden="true" - The brand wordmark uses
aria-label="Tailscale" - IP addresses and CIDR ranges in mono blocks announce digit-by-digit; the slashed-zero (
zerofeature) is purely visual - Pricing values announce with currency and period (“eight US dollars per user per month”)
Reduced Motion
All transitions degrade to opacity-only or instant. Scroll-reveal rise suppresses (static on-mount). Modal scale-in becomes instant. Link-hover underline appears instantly. The brand experience preserves full visual consistency under reduced motion.
10. Responsive Behavior
Breakpoints
| Name | Width | Key Changes |
|---|---|---|
| Mobile | <640px | Top nav collapses to logo + CTA + hamburger; hero h1 drops 48→32px; cards 1-up; CTA pair stacks vertically; logo strip wraps to 2-up |
| Tablet | 640–1024px | Top nav keeps inline links (no mega-menu hover); hero h1 at 40px; cards 2-up; logo strip 3-up |
| Desktop | 1024–1280px | Full nav with mega-menu; hero h1 at 48px; cards 3-up; full layouts |
| Wide | 1280px+ | Content width caps at 1280; gutters absorb the remainder |
Touch Targets
- Buttons: 48px height across the board — comfortably above the 44px Apple HIG minimum
- Inputs: 44px height
- Tag chips: 28px visual height with padding for a 44px effective tap area
- Top nav links: 44×44px minimum tap area
- Product cards: full-card tap target when the card is a link
Collapsing Strategy
- Top nav at <1024px: primary nav links collapse into a hamburger sheet; mega-menus become accordion sections inside the sheet
- Hero CTA pair at <640px: stacks vertically (brick-red primary above, dark secondary below)
- Product card grid: 3 → 2 → 1 columns
- Customer logo strip: 5 → 3 → 2 across; logos maintain aspect ratio
- Pricing cards at <1024px: swipe-able horizontal scroll with snap points, or stack vertically with the “Most popular” tier first
- Code blocks: gain horizontal scroll on overflow rather than wrapping CLI commands
Image Behavior
Customer logos use SVG with currentColor so they inherit the secondary-text colour (monochrome on the marketing surface). Product screenshots use aspect-ratio to prevent layout shift. Marketing illustrations use srcset 1x/2x for retina. Below-fold images lazy-load; the hero is eager.
Container Queries
Used inside product cards: when a card crosses ~320px width, an inline icon-and-title layout switches from stacked to side-by-side. This lets the same product card render compactly in a dense 3-up grid and expansively as a single featured tile.
11. Content & Voice
Tone
Approachable-technical, calm, credibility-first. Tailscale writes like a trusted infrastructure engineer who happens to be warm — confident in the technical claims (“Zero Trust identity-based connectivity platform that replaces your legacy VPN, SASE, and PAM”) but never cold or jargon-walled. Headlines are declarative statements (“The best secure connectivity platform for the AI era”); subheads explain capability in plain terms; product copy uses real technical vocabulary (mesh, exit node, ACL, WireGuard, Zero Trust) without translating it into consumer-speak, but always with enough framing that a non-specialist can follow. The voice sits between Linear’s calm restraint and a senior engineer explaining why this is genuinely simpler than the legacy alternative.
Microcopy Patterns
- Button verbs: Start connecting devices, Get started, Contact sales, Talk to an expert, Read the docs, See pricing. Outcome-focused and concrete — “Start connecting devices” describes the literal first action, not a generic “Sign up”.
- Error messages: specific and accountable — “Couldn’t reach this node. Check that
tailscaledis running and the device is online.” Includes the exact technical detail and the next step. - Success confirmations: brief and declarative — “Device connected.” / “Exit node enabled.” No exclamation.
- Empty states: instruction-led with the exact command — “No devices yet. Run
tailscale upon a machine to add it to your tailnet.” - Field labels: single-word where possible — Email, Tailnet, Device name, Tags.
- Tooltips: explain technical concepts inline (e.g. ephemeral nodes, ACL tags) without breaking the reading flow.
Empty States
Empty states follow the brand’s instruction-led convention: name the state, give the next step, include the exact command or action. “No devices in this tailnet yet — run tailscale up to add your first.” The tone is helpful-engineer, not apologetic.
CTA Verb Conventions
- Primary (brick-red): Start connecting devices, Get started, Try Tailscale free
- Secondary (dark): Contact sales, Talk to an expert, Book a demo
- Tertiary text-link: See pricing, Read the docs, View case study, Browse use cases
- Avoided: Click here, Submit, Buy now, exclamation-heavy enthusiasm. Tailscale uses concrete, outcome-describing verbs and product/feature names directly.
The verbs match the approachable-technical voice — concrete, warm, never marketing-template.
12. Dark Mode & Theming
Light-default, with intentional near-black inversion bands. Tailscale’s marketing site is built on the warm #f9f7f6 canvas and does not ship a full site-wide dark theme toggle on the marketing surface — the page is light-default and respects prefers-color-scheme only at the CSS-variable level for embedded UI. Instead, the brand uses near-black inversion bands within the light page as a deliberate compositional device: a #181717 (or #232222) section appears for testimonials and the closing CTA, inverting text to #f5f2f0 near-white while the brick-red accent stays unchanged.
Inversion-band token swap:
- band bg:
#f9f7f6→#181717(near-black, warm-leaning) - dark card bg:
#ffffff→#232222 - text:
#181717→#f5f2f0(near-white) - text-secondary:
#4a4746→#a39e9b - brand:
#d04841(unchanged — brick-red passes contrast on both warm-light and near-black grounds) - border:
rgba(24, 23, 23, 0.12)→rgba(255, 255, 255, 0.08) - primary CTA: stays brick-red
#d04841on the dark band — the warm accent reads strongly against near-black
The product dashboard (login.tailscale.com) ships its own system-aware dark mode; the marketing surface uses inversion as accent rather than a full theme. The brick-red accent is the constant across both grounds — its contrast holds on warm-light and near-black, which is why the band-inversion device works without a second accent.
13. Lineage & Influences
Tailscale’s design DNA traces three lineages. First, the warm-minimal developer-product polish that Stripe pioneered and Linear and Vercel refined — type-disciplined, single-accent, editorial-spaced — but Tailscale ports it onto a warmer canvas and picks a warm accent where its peers stay cool. Second, the off-white “intentional, not default” surface philosophy shared by Notion, Mintlify, and Vercel: a near-white canvas that signals “a person designed this” rather than “this is an unstyled browser page”. Tailscale’s #f9f7f6 is the warmest reading of that idea in the dev-tool space. Third, the engineering-credibility-first posture inherited from WireGuard, the protocol Tailscale is built on — the copy leads with technical truth and trusts the reader, never wrapping the product in marketing fluff.
The defining decision is the warm brick-red accent in a category that defaults to navy and blue. Every legacy VPN / SASE / Zero-Trust vendor reaches for a cool, “secure” blue; Tailscale’s #d04841 is a deliberate counter-positioning — a warm, human, slightly-earthy red that makes the brand instantly distinguishable on a category landing page full of blue shields. The red is applied with single-accent discipline (it does all the colour work) borrowed from Linear and Vercel, but its warmth is entirely Tailscale’s own.
The second considered decision is the two-tier CTA grammar — warm brick-red as the dominant primary, dark near-black as the supporting secondary, with a deliberate radius difference (16px friendly primary vs 8px tighter secondary). This inverts the more common “neutral primary, colour secondary” arrangement that Vercel uses, and it encodes the brand’s product thesis: the warm, self-serve path is the headline; the enterprise/sales path is the quieter twin.
What Tailscale rejects: the clinical #ffffff canvas of legacy networking vendors, navy/blue brand accents (the category default), the shield-and-lock visual cliché, multi-colour gradient flourishes (Stripe-era / Vercel-era signal), shouty 700–800 hero weights, and jargon-walled enterprise-legalese copy. The brand keeps the warmth of consumer design and the credibility of infrastructure tooling in the same frame.
Influences:
- Inter (Rasmus Andersson) — The full type identity; Inter set at restrained weights for both display and body. The engineering-calm register depends on the typeface, not on colour. https://rsms.me/inter/
- Stripe — Developer-product-as-magazine polish; the warm-light, type-disciplined, single-accent register descends from Stripe’s marketing era. https://stripe.com
- Linear — Adjacent dev-tool peer; the calm, low-shout headline weight and the human-technical voice share Linear’s restraint. https://linear.app
- Vercel — The off-white “intentional, not
#ffffff” canvas philosophy and near-black-on-near-white type discipline — Tailscale warms the same idea. https://vercel.com - Notion — Warm off-white surface as a deliberate signal of approachability over the clinical white of legacy enterprise software. https://notion.so
- WireGuard — The protocol Tailscale builds on; the engineering-credibility-first, no-marketing-fluff posture shapes the tone of the product copy. https://www.wireguard.com
14. Do’s and Don’ts
Do
- Do use warm off-white
#f9f7f6for the canvas — a hair of cream, deliberately not clinical#ffffff. The warmth is the brand’s first signal. - Do use near-black
#181717for text — warm-leaning, at ~9% lightness, 15.9:1 on the canvas. - Do make the brick-red
#d04841the primary CTA fill — the warm colour is the dominant action. - Do use the dark
#232222for the secondary CTA — the supporting enterprise/sales path. - Do keep the radius difference: 16px on the friendly brick-red primary, 8px on the tighter dark secondary.
- Do set headlines in Inter at a restrained 500 weight (h1 at 48px / 500) — calm confidence, not a marketing shout.
- Do practise single-accent discipline — brick-red does all the colour work; warm greys carry hierarchy.
- Do use soft warm-toned shadows (
rgba(24, 23, 23, …)at 4–6%) so they sit on the warm canvas. - Do alternate sections by brightness-and-warmth (canvas → white → warm-grey → near-black), not by colour.
- Do use near-black inversion bands for testimonials and the closing CTA — the brick-red accent holds on both grounds.
- Do keep the brick-red accent constant across light and inversion-band grounds.
- Do write approachable-technical copy — real terms (mesh, ACL, Zero Trust, WireGuard) with enough framing to follow.
Don’t
- Don’t use clinical
#fffffffor the page canvas. The warm off-white is the entry ticket; cold white collapses the brand into the networking-category default. - Don’t reach for navy or blue accents. Every legacy VPN vendor uses blue — the brick-red is the counter-positioning.
- Don’t introduce a second accent hue. The system is single-accent brick-red + warm-grey neutrals.
- Don’t make the dark button the primary and the colour the secondary. Tailscale inverts that: warm colour is dominant.
- Don’t push hero weight to 700–800. The 500-weight h1 is the brand’s calm-confidence signal.
- Don’t introduce a serif or a second sans. Inter is the entire system; mono is system-stack for code only.
- Don’t use pure-black
#000000shadows. Warm-tonedrgba(24, 23, 23, …)shadows keep the palette coherent. - Don’t widen the reading column beyond 720px. ~70-character line length even on the 1280px page.
- Don’t use the shield-and-lock security cliché or stock “cybersecurity” visuals. The warmth is the differentiator.
- Don’t wall the copy in enterprise-legalese or jargon. Approachable-technical means real terms with framing.
- Don’t use exclamation-heavy enthusiasm. The voice is calm engineering-credibility.
- Don’t make CTAs full 9999px pills. Tailscale’s buttons are soft-cornered rectangles (16px / 8px); the pill is for badges only.
15. Agent Prompt Guide
Quick Color Reference
Canvas: #f9f7f6 (warm off-white — NEVER #ffffff)
Pure White: #ffffff (card surface only)
Bg Warm Stripe: #efeae7
Text: #181717 (warm near-black)
Text Secondary: #4a4746
Text Tertiary: #736f6d
Brand Brick-Red: #d04841 (primary CTA fill, links, accents)
Brand Hover: #b83d37
CTA Secondary BG: #232222 (dark — supporting action)
Inversion Band: #181717 (testimonial / closing-CTA band)
Border: rgba(24, 23, 23, 0.12)
Focus Ring: rgba(208, 72, 65, 0.20) 0 0 0 3px
Example Component Prompts
-
“Create a Tailscale-style hero: warm off-white
#f9f7f6canvas, 48px / 500 Inter h1 with-0.018emtracking in warm near-black#181717(‘The best secure connectivity platform for the AI era’), 18px / 400 Inter body deck at 1.55 line-height, dual CTA pair below — primary brick-red button (#d04841fill, white text 16px / 500, 16px radius, 48px height, label ‘Start connecting devices’) and secondary dark button (#232222fill, white text 16px / 500, 8px radius, 48px height, label ‘Contact sales’). Customer-logo strip beneath in monochrome#4a4746.” -
“Design a Tailscale product card:
#ffffffpure-white fill on a warm#f9f7f6canvas, 12px radius, 1pxrgba(24, 23, 23, 0.12)hairline border, 24px padding, soft warm shadowrgba(24, 23, 23, 0.06) 0 1px 3px, rgba(24, 23, 23, 0.04) 0 8px 24px -6px. Inside: 40×40 line icon in#d04841, 24px / 600 Inter h3 heading, 16px / 400 Inter body in#4a4746, brick-red text-link ‘Learn more →’ at the bottom. Hover: shadow intensifies, border deepens, 2px lift.” -
“Build a Tailscale pricing card row: four flat white cards (Personal, Standard, Premium, Enterprise) at 12px radius with
rgba(24, 23, 23, 0.12)borders on the warm canvas. The Premium tier carries a ‘Most popular’ badge (rgba(208, 72, 65, 0.10)soft-red wash,#9e332etext, 13px / 600, 9999px pill). Tier name in 20px / 600, price in Inter 32px / 700 with tabular numerals, feature list with brick-red checkmarks, brick-red primary CTA ‘Get started’ (16px radius) — Enterprise uses dark#232222‘Contact sales’ (8px radius).” -
“Render a Tailscale top nav: 64px height,
rgba(249, 247, 246, 0.85)translucent warm-canvas fill withbackdrop-filter: blur(12px) saturate(160%), 1px bottom hairlinergba(24, 23, 23, 0.08). Wordmark left in Inter 18px / 600 near-black. Center nav links (Platform, Solutions, Customers, Community, Partnerships, Pricing) in 16px / 500 with mega-menu dropdowns. Right: ghost ‘Log in’ + dark secondary ‘Contact sales’ (#232222, 8px radius) + primary brick-red ‘Get started’ (#d04841, 16px radius).” -
“Compose a Tailscale closing-CTA band: full-bleed near-black
#181717inversion band, centered white headline in Inter 32px / 600 (#f5f2f0), 18px / 400 supporting line in#a39e9b, single brick-red primary CTA ‘Start connecting devices’ (#d04841fill, white text, 16px radius, 48px height). The brick-red accent stays unchanged on the dark ground.” -
“Build a Tailscale code band:
#ffffffband on the warm page, centered mono CLI block at 720px reading width in the system monospace stack with slashed-zero (zero) enabled, 14px / 400 / 1.6 line-height, showingtailscale up. Above the block: an uppercase eyebrow ‘GET CONNECTED’ in Inter 13px / 600 / 0.02em tracking in#4a4746, then a 32px / 600 h2 and a 16px / 400 body paragraph introducing the command.”
Iteration Guide
- Check the canvas value. If it’s
#ffffffor any cool grey, you’ve drifted into the networking-category default. Tailscale is warm off-white#f9f7f6— the warmth is the brand’s first and most important signal. - Make the accent red, not blue. If your accent is navy or primary-blue, you’ve reverted to the category cliché. Tailscale’s accent is brick-red
#d04841— a warm, human counter-positioning. - Put the colour on the primary CTA. If the brick-red is on the secondary button and a dark/neutral button is primary, flip them. Tailscale’s warm colour is the dominant action; the dark
#232222is the supporting twin. - Keep the radius asymmetry. 16px on the friendly brick-red primary, 8px on the tighter dark secondary. Equal radii lose the brand’s CTA grammar.
- Drop the hero weight to 500. If your h1 is 700–800, it’s too loud. Tailscale’s calm 48px / 500 Inter h1 is the confidence signal.
- Stay single-accent. Brick-red does all the colour work; let warm greys carry hierarchy. A second accent hue breaks the discipline — even success can lean on the inversion band instead of a green.
- Warm your shadows. Use
rgba(24, 23, 23, …)notrgba(0, 0, 0, …). Pure-black shadows read clinical against the warm canvas. - Use inversion, not a colour band. When a section needs energy, reach for the near-black
#181717inversion band with the brick-red accent intact — not a coloured background.
Theme-toggle audit: score=2, signals=[prefers-color-scheme-css]
Drop tailscale into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add tailscale npx agentkit init --design tailscale