light · editorial · sans · serif · warm · soft · structured

Kagi

A premium search engine dressed in warm cream and Plex — the indie answer to ad-funded search.

By webdesignhot · kagi.com
$ npx design-md add kagi
Learn more about the CLI
Compare to…
try on →
1440 × 900
mobile · 390 × 844
Tokens design.md/v1.5
  • bg #fffbf5
  • bg-soft #fff6e8
  • surface #fbf2e2
  • surface-strong #f4e8ce
  • surface-hover #fff0d8
  • surface-elevated #fffefa
  • text AAA · 14.9 #2b2417
  • text-strong #1c170d
  • text-medium #3a3120
  • text-muted #6b5d47
  • text-soft #8a7a5e
  • text-faint — · 2.7 #a99a7d
  • on-brand #1c170d
  • on-cta #1c170d
  • brand — · 1.6 #ffb87a
  • brand-hover #f3a45f
  • brand-active #e89348
  • brand-deep #c97a3b
  • brand-soft #ffe5c8
  • brand-faint #fff4e3
  • brand-glow rgba(255, 184, 122, 0.32)
  • accent #7d6ce0
  • accent-hover #6b5acc
  • accent-soft #e8e3ff
  • link #c97a3b
  • link-hover #a55d24
  • selected-bg #fbf2e2
  • disabled-bg #f4e8ce
  • disabled-text #a99a7d
  • border — · 1.3 rgba(0, 0, 0, 0.10)
  • border-strong — · 1.5 rgba(0, 0, 0, 0.18)
  • border-soft rgba(0, 0, 0, 0.08)
  • border-warm rgba(201, 122, 59, 0.20)
  • border-focus #c97a3b
  • success-bg #e0ebd0
  • success-text #3d5a47
  • warning-bg #fde8c7
  • warning-text #7a5e1f
  • danger-bg #f7d8d2
  • danger-text #8a3a3a
  • info-bg #e8e3ff
  • info-text #3a3a6a
  • shadow-rgb 43, 36, 23
  • shadow-warm 201, 122, 59
Typography
Ship faster than ever.
display-hero "IBM Plex Sans" 80px w600 -0.025em
Ship faster than ever.
display "IBM Plex Sans" 64px w600 -0.02em
Ship faster than ever.
h1 "IBM Plex Sans" 56px w600 -0.02em
Built for teams that ship.
h2 "IBM Plex Sans" 40px w600 -0.015em
The quick brown fox jumps over the lazy dog.
quote-large "IBM Plex Serif" 32px w500
A complete kit
h3 "IBM Plex Sans" 24px w600 0
The quick brown fox jumps over the lazy dog.
quote-pull "IBM Plex Serif" 22px w400
The quick brown fox jumps over the lazy dog.
h4 "IBM Plex Sans" 20px w600
The quick brown fox jumps over the lazy dog.
body-large "IBM Plex Sans" 19px w400
The quick brown fox jumps over the lazy dog.
h5 "IBM Plex Sans" 18px w500
The quick brown fox jumps over the lazy dog.
body "IBM Plex Sans" 17px w400
The quick brown fox jumps over the lazy dog.
body-small "IBM Plex Sans" 15px w400
OUR DESIGN SYSTEM
label-cta "IBM Plex Sans" 15px w600
OUR DESIGN SYSTEM
caption "IBM Plex Sans" 14px w400
npx design-md add linear
code "IBM Plex Mono" 14px w400
OUR DESIGN SYSTEM
caption-tabular "IBM Plex Mono" 13px w500
OUR DESIGN SYSTEM
label "IBM Plex Sans" 13px w500
The quick brown fox jumps over the lazy dog.
eyebrow "IBM Plex Mono" 12px w500 0.06em
Spacing
  • step-0 1px
  • step-1 2px
  • step-2 4px
  • step-3 6px
  • step-4 8px
  • step-5 12px
  • step-6 16px
  • step-7 20px
  • step-8 24px
  • step-9 32px
  • step-10 48px
  • step-11 64px
  • step-12 80px
  • step-13 96px
  • step-14 128px
  • step-15 160px
Radius
  • micro 4px
  • sm 6px
  • md 8px
  • lg 12px
  • card 16px
  • xl 20px
  • button 9999px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Lineage & influences

Kagi sells a paid search engine, so the site has to look unlike every other search page on the internet. The strategy is editorial: a warm cream canvas (`#fffbf5`) borrowed from independent magazines, a single sun-baked orange (`#ffb87a`) doing all the action work, and IBM Plex — both Sans and Serif — carrying the entire type system. CTAs are pill-shaped and use dark text on warm orange — Kagi never does white-on-orange, which preserves the paper-and-ink feel and (incidentally) hits AAA contrast where white-on-orange would fail. The posture is closer to Are.na or Readwise than to Bing — a deliberate stance that the search bar deserves the same care as a well-made magazine cover.

  • Entire type system — Sans for UI, Serif for editorial accents, Mono for code/tags. The trifecta is the brand
  • Cream-canvas + warm-neutral aesthetic positioning paid software as a craft object
  • Warm-paper CTA discipline — dark text on coloured pills, no inverted white labels
  • Editorial register applied to a paid product; manifesto-grade marketing
  • Editorial whitespace; serif pull-quotes; paper-paced rhythm
  • IBM Plex ecosystem; serif-meets-sans pairing for editorial tech publishing
  • Adjacent register: warm-cream cousin, premium-feel paid product
Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Kagi
tagline: 'A premium search engine dressed in warm cream and Plex — the indie answer to ad-funded search.'
author: webdesignhot
source_url: https://kagi.com
spec: design.md/v1.5
quality: curated
featured: false
categories: [saas, ai]
tags: [light, editorial, sans, serif, warm, soft, structured]
preview_swatch: ['#fffbf5', '#ffb87a', '#2b2417']
related: [you-com, perplexity, raycast]
description: 'Kagi''s site argues for paid search by looking nothing like a search engine. The canvas is a warm cream `#fffbf5`, the brand colour is a sun-baked orange `#ffb87a`, the body is set in IBM Plex Sans, and pull-quotes drop into IBM Plex Serif — a typographic pairing that reads more like a small magazine than a product page. Where Google argues for "free" with a clinical white sans-only interface, Kagi argues for "paid" with an editorial warm-cream layout and serif pull-quotes. The visual logic is: *you''re paying for this, so it should look like something worth paying for*. Pill CTAs are fully rounded with dark text on warm orange — never white-on-orange — preserving the paper-and-ink feel. The result is a brand that reads as Are.na meets Readwise meets a thoughtful magazine cover, an aesthetic posture deliberately positioned against ad-funded utility search.'

colors:
  # Primary
  bg: '#fffbf5'                          # warm cream canvas — defining surface
  bg-soft: '#fff6e8'                     # secondary cream stripe
  surface: '#fbf2e2'                     # card / panel base, half-step warmer
  surface-strong: '#f4e8ce'              # hover tone, deeper warm
  surface-hover: '#fff0d8'               # interactive hover wash
  surface-elevated: '#fffefa'             # rare lifted panel almost-white-cream
  text: '#2b2417'                        # near-black with warm cast — body default
  text-strong: '#1c170d'                 # display copy, deepest warm-black
  text-medium: '#3a3120'                 # secondary heading
  text-muted: '#6b5d47'                  # secondary copy / metadata in warm grey
  text-soft: '#8a7a5e'                   # supporting copy
  text-faint: '#a99a7d'                  # helper text, microcopy
  on-brand: '#1c170d'                    # dark text on warm orange — never white
  on-cta: '#1c170d'                      # dark label on orange pill

  # Brand & Accent
  brand: '#ffb87a'                       # signature sun-baked orange
  brand-hover: '#f3a45f'                 # pressed state for orange pills
  brand-active: '#e89348'                # deeply pressed
  brand-deep: '#c97a3b'                  # accent on light surfaces
  brand-soft: '#ffe5c8'                  # tonal pill background
  brand-faint: '#fff4e3'                 # quietest orange tint, near-bg
  brand-glow: 'rgba(255, 184, 122, 0.32)' # focus glow

  # Secondary accent
  accent: '#7d6ce0'                      # lavender used in marketing modules
  accent-hover: '#6b5acc'
  accent-soft: '#e8e3ff'                 # lavender tint for illustrations only

  # Interactive
  link: '#c97a3b'                        # deep brand-orange for inline links
  link-hover: '#a55d24'                  # darker pressed link
  selected-bg: '#fbf2e2'                 # selected nav item / row
  disabled-bg: '#f4e8ce'                 # disabled control fill
  disabled-text: '#a99a7d'               # disabled label

  # Borders
  border: 'rgba(0, 0, 0, 0.10)'          # 10% black hairline (default)
  border-strong: 'rgba(0, 0, 0, 0.18)'   # emphasized rule
  border-soft: 'rgba(0, 0, 0, 0.08)'     # quietest division
  border-warm: 'rgba(201, 122, 59, 0.20)' # rare brand-tinted hairline
  border-focus: '#c97a3b'                # focus-ring deep-brand

  # Semantic
  success-bg: '#e0ebd0'                  # warm cactus-green tint (not Tailwind green)
  success-text: '#3d5a47'
  warning-bg: '#fde8c7'                  # cream-warning tint
  warning-text: '#7a5e1f'
  danger-bg: '#f7d8d2'                   # warm coral
  danger-text: '#8a3a3a'
  info-bg: '#e8e3ff'                     # lavender info
  info-text: '#3a3a6a'

  # Shadow tints
  shadow-rgb: '43, 36, 23'               # warm-brown tinted shadow base
  shadow-warm: '201, 122, 59'            # rare brand-warm focus glow

typography:
  display:
    family: '"IBM Plex Sans", -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [400, 500, 600, 700]
    opentype-features: ['ss01', 'liga', 'kern']
  body:
    family: '"IBM Plex Sans", -apple-system, "system-ui", "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [400, 500, 600]
    opentype-features: ['kern', 'onum']
  serif:
    family: '"IBM Plex Serif", Georgia, "Times New Roman", serif'
    weights: [400, 500, 600]
    opentype-features: ['liga', 'onum', 'kern']
  mono:
    family: '"IBM Plex Mono", Menlo, Consolas, monospace'
    weights: [400, 500]
    opentype-features: ['tnum', 'zero']
  scale:
    display-hero:    { size: 80, weight: 600, lineHeight: 1.02, tracking: '-0.025em', family: display, opentype: 'ss01' }
    display:         { size: 64, weight: 600, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h1:              { size: 56, weight: 600, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h2:              { size: 40, weight: 600, lineHeight: 1.1,  tracking: '-0.015em', family: display }
    h3:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '0',        family: display }
    h4:              { size: 20, weight: 600, lineHeight: 1.3,  family: display }
    h5:              { size: 18, weight: 500, lineHeight: 1.35, family: display }
    eyebrow:         { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0.06em',   family: mono, transform: uppercase }
    body-large:      { size: 19, weight: 400, lineHeight: 1.55, family: body }
    body:            { size: 17, weight: 400, lineHeight: 1.55, family: body }
    body-small:      { size: 15, weight: 400, lineHeight: 1.5,  family: body }
    caption:         { size: 14, weight: 400, lineHeight: 1.4,  family: body }
    caption-tabular: { size: 13, weight: 500, lineHeight: 1.4,  family: mono, opentype: 'tnum' }
    label:           { size: 13, weight: 500, lineHeight: 1.3,  family: body }
    label-cta:       { size: 15, weight: 600, lineHeight: 1.2,  family: body }
    quote-pull:      { size: 22, weight: 400, lineHeight: 1.4,  family: serif, style: italic }
    quote-large:     { size: 32, weight: 500, lineHeight: 1.3,  family: serif, style: italic }
    code:            { size: 14, weight: 400, lineHeight: 1.55, family: mono, opentype: 'tnum zero' }

radius:
  micro: 4
  sm: 6
  md: 8
  lg: 12
  card: 16
  xl: 20
  button: 9999                           # Kagi favours fully-rounded pill CTAs
  pill: 9999

spacing:
  base: 4
  scale: [1, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 80, 96, 128, 160]

layout:
  page-width: 1200
  prose-width: 680
  hero-prose-width: 720
  site-gutter: 'clamp(24px, 5vw, 64px)'
  header-height: 64
  grid-columns: 12
  section-rhythm: '96-160px'

components:
  button-primary:
    background: '#ffb87a'
    text: '#1c170d'
    padding: '12px 24px'
    radius: 9999
    border: 'none'
    font: 'IBM Plex Sans 600 / 15px'
    hover-bg: '#f3a45f'
    active-bg: '#e89348'
    use: 'Pill-shaped warm orange — primary action across the site, dark text never white'
  button-secondary:
    background: 'transparent'
    text: '#2b2417'
    padding: '12px 24px'
    radius: 9999
    border: '1px solid rgba(0, 0, 0, 0.10)'
    font: 'IBM Plex Sans 600 / 15px'
    hover-bg: '#fbf2e2'
    use: 'Cream outlined pill — identical radius to primary, hairline border'
  button-ghost:
    background: 'transparent'
    text: '#2b2417'
    padding: '8px 16px'
    radius: 9999
    border: 'none'
    font: 'IBM Plex Sans 500 / 14px'
    hover-bg: 'rgba(0, 0, 0, 0.05)'
    use: 'Quiet third action — nav links, inline ghost buttons; pill radius preserved'
  button-deep:
    background: '#1c170d'
    text: '#fffbf5'
    padding: '12px 24px'
    radius: 9999
    font: 'IBM Plex Sans 600 / 15px'
    hover-bg: '#3a3120'
    use: 'Rare deep CTA — used on dark-band hero or pricing emphasis; cream label on warm-black'
  card:
    background: '#fbf2e2'
    border: '1px solid rgba(0, 0, 0, 0.10)'
    radius: 16
    padding: '24px'
    use: 'Default warm-cream panel — feature card, pricing tier, testimonial'
  card-cream:
    background: '#fffefa'
    border: '1px solid rgba(0, 0, 0, 0.08)'
    radius: 16
    padding: '32px'
    use: 'Lifted card on the warm cream bg — rare, used for hero pricing'
  pull-quote:
    background: 'transparent'
    text: '#1c170d'
    padding: '0'
    border-left: '3px solid #ffb87a'
    indent: '32px'
    font: 'IBM Plex Serif 400 / 22px italic / 1.4 line-height'
    use: 'Editorial pull-quote — Plex Serif italic, indented from body grid, brand-orange left rule'
  input:
    background: '#fffefa'
    border: '1px solid rgba(0, 0, 0, 0.18)'
    radius: 12
    padding: '12px 16px'
    font: 'IBM Plex Sans 400 / 17px'
    placeholder-color: '#a99a7d'
    focus-ring: '0 0 0 2px #c97a3b'
    use: 'Search input on signup form, settings'
  badge-tag:
    background: '#fbf2e2'
    text: '#6b5d47'
    padding: '4px 10px'
    radius: 9999
    font: 'IBM Plex Mono 500 / 12px'
    use: 'Editorial tag — uses Plex Mono for the spec-stamp feel'
  badge-warm:
    background: '#ffe5c8'
    text: '#a55d24'
    padding: '4px 10px'
    radius: 9999
    font: 'IBM Plex Sans 500 / 12px'
    use: 'Status pill — Plus / Family / Pro tier indicator'
  nav-link:
    background: 'transparent'
    text: '#2b2417'
    padding: '8px 12px'
    font: 'IBM Plex Sans 500 / 15px'
    hover-text: '#c97a3b'
    use: 'Top nav links — quiet warm-black, brand-deep on hover'
  testimonial-card:
    background: '#fbf2e2'
    border: '1px solid rgba(0, 0, 0, 0.10)'
    radius: 16
    padding: '32px'
    use: 'Editorial testimonial — uses Plex Serif italic for the quote, Plex Sans for the attribution'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  ease-out: 'cubic-bezier(0.16, 1, 0.3, 1)'
  ease-editorial: 'cubic-bezier(0.32, 0.72, 0, 1)'
  duration-instant: 80
  duration-fast: 120
  duration-standard: 220
  duration-slow: 360
  duration-page: 480
  reduced-motion: 'respects prefers-reduced-motion: reduce — translate transforms become opacity-only, durations halved, illustration parallax disabled'

breakpoints:
  mobile: 640
  tablet: 1024
  desktop: 1280
  wide: 1440

shadows:
  none: 'none'
  ambient: 'rgba(43, 36, 23, 0.04) 0 1px 3px'
  standard: 'rgba(43, 36, 23, 0.06) 0 4px 12px'
  elevated: 'rgba(43, 36, 23, 0.08) 0 12px 32px -8px, rgba(43, 36, 23, 0.04) 0 4px 8px'
  warm: 'rgba(255, 184, 122, 0.20) 0 16px 40px -16px'
  modal: 'rgba(43, 36, 23, 0.18) 0 24px 48px -12px'
  ring: '0 0 0 2px #c97a3b'
  ring-offset: '0 0 0 2px #fffbf5, 0 0 0 4px #c97a3b'

accessibility:
  contrast-text-on-bg: 12.4              # #2b2417 on #fffbf5 — AAA
  contrast-text-strong-on-bg: 15.1       # #1c170d on #fffbf5 — AAA
  contrast-text-on-brand: 10.8           # #1c170d on #ffb87a — AAA
  contrast-text-muted-on-bg: 5.4         # #6b5d47 on #fffbf5 — AA at body
  contrast-link-on-bg: 5.0               # #c97a3b on #fffbf5 — AA
  focus-ring: '2px solid #c97a3b with 2px cream offset'
  reduced-motion-honored: true
  keyboard-nav: 'visible focus on every interactive surface; tab order matches reading order; pull-quote markup uses <blockquote> with <cite> attribution'
  prose-line-length: 'capped at 680px (~64 characters of Plex Sans 17px) for editorial readability'
  aria-patterns: 'pricing tiers use role=group with aria-labelledby; testimonial cards use proper <blockquote> + <cite> markup; nav uses role=navigation with aria-label; pill CTAs use button semantics with descriptive labels'

dark-mode: optional                      # in-product Kagi search supports dark; marketing surface is light-only with warm-cream as canvas

lineage:
  summary: 'Kagi sells a paid search engine, so the site has to look unlike every other search page on the internet. The strategy is editorial: a warm cream canvas (`#fffbf5`) borrowed from independent magazines, a single sun-baked orange (`#ffb87a`) doing all the action work, and IBM Plex — both Sans and Serif — carrying the entire type system. CTAs are pill-shaped and use dark text on warm orange — Kagi never does white-on-orange, which preserves the paper-and-ink feel and (incidentally) hits AAA contrast where white-on-orange would fail. The posture is closer to Are.na or Readwise than to Bing — a deliberate stance that the search bar deserves the same care as a well-made magazine cover.'
  influences:
    - name: IBM Plex
      role: 'Entire type system — Sans for UI, Serif for editorial accents, Mono for code/tags. The trifecta is the brand'
      url: https://www.ibm.com/plex
    - name: Are.na
      role: 'Cream-canvas + warm-neutral aesthetic positioning paid software as a craft object'
      url: https://www.are.na
    - name: Readwise / Reader
      role: 'Warm-paper CTA discipline — dark text on coloured pills, no inverted white labels'
      url: https://readwise.io
    - name: The Browser
      role: 'Editorial register applied to a paid product; manifesto-grade marketing'
      url: https://thebrowser.com
    - name: MIT Technology Review
      role: 'Editorial whitespace; serif pull-quotes; paper-paced rhythm'
      url: https://www.technologyreview.com
    - name: Stripe Press
      role: 'IBM Plex ecosystem; serif-meets-sans pairing for editorial tech publishing'
      url: https://press.stripe.com
    - name: Raycast
      role: 'Adjacent register: warm-cream cousin, premium-feel paid product'
      url: https://raycast.com
---

## 1. Visual Theme & Atmosphere

Kagi's marketing site is **a manifesto against ad-funded search dressed as a small magazine**. The canvas is a warm cream `#fffbf5` — not white, not beige, but the colour of unbleached book stock — and every other surface tones up or down from there in a single warm-neutral ladder. The brand colour is a sun-baked orange `#ffb87a` that appears almost exclusively on pill-shaped CTAs, and IBM Plex Sans + Plex Serif carry the entire typographic load.

Where Google argues for "free" with a clinical white sans-only interface, Kagi argues for "paid" with an editorial warm-cream layout and serif pull-quotes. The visual logic is: *you're paying for this, so it should look like something worth paying for*. Every chromatic decision reinforces that posture — warm cream over bleached white, sun-baked orange over corporate blue, hand-set Plex Serif italic for pull-quotes, fully-rounded pill CTAs (not the modern 8–12px square-rounded default).

The most consequential decision is **dark text on warm orange**. Where every modern SaaS pairs white text with a coloured CTA, Kagi insists on `#1c170d` warm-black on `#ffb87a` orange — never white. This single typographic-meets-chromatic rule preserves the paper-and-ink feel: the page reads as ink-on-paper rather than chrome-on-glow. The reverse pairing (white on orange) is doctrinally rejected — see §14.

The Plex pairing is the typographic argument. IBM Plex Sans for UI body and headlines (a designed-by-IBM open-source family with a slightly architectural feel), IBM Plex Serif for editorial moments — pull-quotes, taglines, longform intros — and IBM Plex Mono for the rare code block or eyebrow tag. Three faces from one designer, one foundry, one type system. The completeness of the Plex trifecta is what gives Kagi its single typographic identity rather than the usual three-foundry collage.

Atmospheric vocabulary: *warm-cream-canvas, sun-baked-orange, Plex-Sans-Plex-Serif-pairing, pill-CTA-with-dark-text, editorial-magazine, paper-and-ink, indie-publication, paid-search-as-craft-object, Are.na-cousin, Readwise-cousin, anti-ad-funded-utility.*

**Key Characteristics**
- Warm cream `#fffbf5` canvas — the colour of unbleached book stock
- Sun-baked orange `#ffb87a` reserved for pill CTAs only
- **Dark text on orange** (`#1c170d`) — never white
- IBM Plex Sans + Plex Serif typographic pairing
- Plex Serif italic pull-quotes — the editorial differentiator
- Fully-rounded pill CTAs (radius 9999) — Kagi never squares the buttons
- 16px card radius on warm-cream panels
- 10% black hairlines instead of coloured borders
- Tonal layering for depth — `#fffbf5 → #fff6e8 → #fbf2e2 → #f4e8ce`
- Plex Mono eyebrow tags — the "specifications" feel
- Lavender `#7d6ce0` rare illustration accent — never a CTA fill
- Magazine-paced rhythm (96–160px section gutters)

## 2. Color Palette & Roles

### Primary

- **bg** `#fffbf5` — warm cream canvas; the page's defining surface, never substituted for `#ffffff`.
- **text** `#2b2417` — near-black with warm cast; body default.
- **bg-soft** `#fff6e8` — secondary cream stripe for alternating sections.
- **surface** `#fbf2e2` — card / panel base, half-step warmer than bg.
- **text-strong** `#1c170d` — display copy, deepest warm-black; also the on-brand label colour.

### Brand & Accent (orange + lavender)

- **brand** `#ffb87a` — signature sun-baked orange; pill CTAs, hover-link underline.
- **brand-hover** `#f3a45f` — pressed pill state.
- **brand-active** `#e89348` — deeply pressed.
- **brand-deep** `#c97a3b` — accent text on light surfaces; inline link colour.
- **brand-soft** `#ffe5c8` — tonal pill background, status indicators.
- **brand-faint** `#fff4e3` — quietest orange tint, rare promotional band.
- **accent** `#7d6ce0` — lavender used sparingly in secondary marketing modules and illustrations only — **never on a CTA**.
- **accent-soft** `#e8e3ff` — lavender illustration tint.

### Interactive

- **link** `#c97a3b` — deep brand-orange; underlined.
- **link-hover** `#a55d24` — darker pressed.
- **selected-bg** `#fbf2e2` — selected nav, selected row.
- **disabled-bg** `#f4e8ce` — disabled control fill.
- **disabled-text** `#a99a7d` — disabled label, warm grey.
- **focus-ring** `#c97a3b` — 2px solid deep-brand with 2px cream offset.

### Neutral Scale (warm grayscale)

- **warm-black** `#1c170d` — display copy, deepest.
- **warm-text** `#2b2417` — body default.
- **warm-medium** `#3a3120` — secondary heading.
- **warm-muted** `#6b5d47` — captions, metadata in warm grey.
- **warm-soft** `#8a7a5e` — supporting copy.
- **warm-faint** `#a99a7d` — helper, microcopy.
- **warm-line** `#d4c8b0` — strong divider rule.

### Surface & Borders

- **surface-0 (page)** — `#fffbf5` warm cream.
- **surface-1 (panel)** — `#fff6e8` cream stripe.
- **surface-2 (card)** — `#fbf2e2` warm card base.
- **surface-3 (hover)** — `#f4e8ce` deeper warm.
- **surface-elevated (rare)** — `#fffefa` near-white-cream.
- **border** `rgba(0, 0, 0, 0.10)` — 10% black hairline (default).
- **border-strong** `rgba(0, 0, 0, 0.18)` — emphasized rule.
- **border-soft** `rgba(0, 0, 0, 0.08)` — quietest division.
- **border-warm** `rgba(201, 122, 59, 0.20)` — rare brand-tinted hairline (used on the orange pull-quote bar).

### Shadow Colors

Kagi uses **warm-brown tinted** shadows at very low opacity. The marketing surface uses tonal layering for 95% of depth — `#fffbf5 → #fff6e8 → #fbf2e2 → #f4e8ce` — and a single 10% black hairline. When a real shadow is needed, it's `rgba(43, 36, 23, ...)` (the warm-text RGB) at 0.04–0.18 opacity. The rare `warm` shadow uses the brand-orange RGB for an accent glow under hero illustrations.

### Semantic

- **success** — `#e0ebd0` / `#3d5a47`. Warm-cactus green, not Tailwind-default.
- **warning** — `#fde8c7` / `#7a5e1f`. Cream-warning, sits adjacent to brand.
- **danger** — `#f7d8d2` / `#8a3a3a`. Warm coral, never pure red.
- **info** — `#e8e3ff` / `#3a3a6a`. Lavender pair — the only place lavender appears in chrome.

The semantic palette is **all desaturated warm tones**, never Tailwind-default (which would be too saturated against the cream canvas).

## 3. Typography Rules

### Font Family

- **Display & Body**: **IBM Plex Sans** at weights 400 / 500 / 600 / 700. Plex Sans is a designed-by-IBM open-source family with a slightly architectural feel — slightly more contrast than Inter, slightly more warmth than Söhne. It's what gives Kagi the "considered" rather than "generic SaaS" cadence. Fallback: `-apple-system → system-ui → Segoe UI → Helvetica → Arial → sans-serif`.
- **Editorial Serif**: **IBM Plex Serif** at weights 400 / 500 / 600. Used exclusively for pull-quotes, taglines, and rare longform intros. Italic is the dominant style. Fallback: `Georgia → Times New Roman → serif`.
- **Mono**: **IBM Plex Mono** at weights 400 / 500. Used for eyebrow tags, code blocks, and the rare specification badge. Fallback: `Menlo → Consolas → monospace`.
- **OpenType features**: `kern` always; `ss01` on display (cleaner alt-glyphs); `onum` (old-style figures) on body Plex Sans for editorial cadence; `tnum + zero` on Plex Mono for legible numerics.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | OT Features | Notes |
|---|---|---|---|---|---|---|---|
| display-hero | Plex Sans | 80 | 600 | 1.02 | -0.025em | ss01 | Rare hero — annual report / manifesto pages |
| display | Plex Sans | 64 | 600 | 1.05 | -0.02em | — | Section openers |
| h1 | Plex Sans | 56 | 600 | 1.05 | -0.02em | — | Standard hero |
| h2 | Plex Sans | 40 | 600 | 1.1 | -0.015em | — | Section heading |
| h3 | Plex Sans | 24 | 600 | 1.25 | normal | — | Subsection |
| h4 | Plex Sans | 20 | 600 | 1.3 | normal | — | Card heading |
| h5 | Plex Sans | 18 | 500 | 1.35 | normal | — | Inline subheading |
| eyebrow | Plex Mono | 12 | 500 | 1.4 | 0.06em | uppercase | Section label / tag — the spec-stamp |
| body-large | Plex Sans | 19 | 400 | 1.55 | normal | onum | Lede |
| body | Plex Sans | 17 | 400 | 1.55 | normal | onum | Default body — slightly larger than 16px web default |
| body-small | Plex Sans | 15 | 400 | 1.5 | normal | — | Secondary copy |
| caption | Plex Sans | 14 | 400 | 1.4 | normal | — | Helper, image caption |
| caption-tabular | Plex Mono | 13 | 500 | 1.4 | normal | tnum | Spec-row data |
| label | Plex Sans | 13 | 500 | 1.3 | normal | — | Form labels |
| label-cta | Plex Sans | 15 | 600 | 1.2 | normal | — | Button text |
| quote-pull | Plex Serif italic | 22 | 400 | 1.4 | normal | onum | Editorial pull-quote — the brand differentiator |
| quote-large | Plex Serif italic | 32 | 500 | 1.3 | normal | onum | Hero-scale pull-quote |
| code | Plex Mono | 14 | 400 | 1.55 | normal | tnum zero | Inline + block code |

### Principles

- **Plex Sans + Plex Serif duet is the brand.** The Sans handles UI; the Serif handles editorial moments. Three Plex faces from one designer = single typographic identity.
- **Body sized at 17px / 1.55 line-height.** Slightly larger than the 16px web default — designed for the long marketing essays Kagi publishes.
- **Headlines compress at `-0.02em` to `-0.025em`.** Display only; body holds at normal tracking.
- **Plex Serif italic for pull-quotes only.** Roman serif is rare; italic is the dominant register.
- **Old-style figures (`onum`) on body.** Gives numerics the editorial, non-tabular cadence of well-set magazine prose.
- **Plex Mono for eyebrow + code.** Eyebrow uppercase at 0.06em tracking — the "specifications" feel without being clinical.
- **600 is the heading weight, never 700.** 700 is reserved for display-hero only.
- **Modular scale of 1.25× from body 17px.** 17 → 21.25 → 26.6 → 33 → 41.5 → 52 → 65… simplified to 17/20/24/40/56/64/80 in practice.

## 4. Component Stylings

### Buttons

**Primary pill (orange, dark text)** — `#ffb87a` bg, `#1c170d` text, **9999 radius** (fully rounded), Plex Sans 600 / 15px, padding `12px 24px`. Hover deepens to `#f3a45f`; active to `#e89348`. The signature CTA — "Try Kagi", "Get started", "Subscribe". **Text is dark, never white** — see §14.

**Secondary pill (cream outlined)** — transparent bg, `#2b2417` text, `1px rgba(0, 0, 0, 0.10)` border, 9999 radius identical to primary, Plex Sans 600 / 15px. Hover wash `#fbf2e2`.

**Ghost pill** — transparent, `#2b2417` text, no border, 9999 radius preserved, `8px 16px` padding. Hover wash `rgba(0, 0, 0, 0.05)`. Used for nav and inline ghost buttons.

**Deep pill (rare)** — `#1c170d` bg, `#fffbf5` text, 9999 radius. Hover `#3a3120`. Reserved for dark-band hero or pricing emphasis — at most once per page.

### Cards

**Default card** — `#fbf2e2` warm-cream bg, `1px rgba(0, 0, 0, 0.10)` border, 16px radius, `24px` padding, no shadow. Used for feature cards, pricing tiers, testimonials.

**Lifted cream card (rare)** — `#fffefa` near-white-cream bg, `1px rgba(0, 0, 0, 0.08)` border, 16px radius, `32px` padding. Used for hero pricing or featured testimonial.

**Testimonial card** — `#fbf2e2` bg, `1px rgba(0, 0, 0, 0.10)` border, 16px radius, `32px` padding. Quote in Plex Serif italic 22px; attribution in Plex Sans 500 14px below.

### Pull-quote (the editorial signature)

**Pull-quote** — transparent bg, `#1c170d` text, `3px solid #ffb87a` left border, `32px` left indent, Plex Serif italic 22px / 1.4 line-height. Indented from body grid; usually breaks up dense feature copy.

### Badges, Tags, Pills

**Editorial tag** — `#fbf2e2` bg, `#6b5d47` text, **Plex Mono** 500 / 12px, pill radius. The mono gives the spec-stamp feel that distinguishes Kagi tags from generic SaaS badges.

**Status pill (warm)** — `#ffe5c8` bg, `#a55d24` text, Plex Sans 500 / 12px, pill radius. Used for plan tiers: `Plus`, `Family`, `Pro`.

### Inputs & Forms

**Default input** — `#fffefa` bg, `1px rgba(0, 0, 0, 0.18)` border, 12px radius, `12px 16px` padding, Plex Sans 400 / 17px, `#a99a7d` placeholder. Focus ring `0 0 0 2px #c97a3b` with 2px cream offset.

**Form labels** — Plex Sans 500 / 14px, `#2b2417`, `4px` margin-bottom from input.

**Helper text** — Plex Sans 400 / 14px, `#6b5d47`, `4px` margin-top from input.

**Error state** — border `#f7d8d2`; helper text flips to `#8a3a3a`.

### Navigation

**Top nav** — 64px header height, `#fffbf5` bg matching page (no fill until scroll), no border. Wordmark left in Plex Sans 600. Nav links right at Plex Sans 500 / 15px / `#2b2417`. Hover deepens link to `#c97a3b`. Right cluster: ghost "Sign in" + primary orange pill "Try Kagi".

**Footer nav** — Plex Sans 400 / 14px / `#6b5d47`, multi-column grid. Footer typography uses a touch more leading to read as paper-paged.

### Modal

**Modal** — `#fffefa` panel, 16px radius, modal shadow `rgba(43, 36, 23, 0.18) 0 24px 48px -12px`, `40px` padding. Backdrop `rgba(43, 36, 23, 0.5)`.

### Tooltips

**Tooltip** — `#1c170d` bg, `#fffbf5` text, 8px radius, Plex Sans 400 / 13px, `8px 12px` padding, `220ms` fade.

### Toasts

**Toast** — `#fffefa` bg, `1px rgba(0, 0, 0, 0.10)` border, 12px radius, ambient warm shadow, `12px 16px` padding. Slide-up from bottom-right.

## 5. Layout Principles

### Spacing System

Base unit **4px**. Scale: `1, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 80, 96, 128, 160`. Section padding regularly hits 96–160px between modules — magazine-paced rhythm. Card interiors are generous (24–32px) — paper-grade breathing room.

### Grid & Container

- **Page max-width**: 1200px, centred, `clamp(24px, 5vw, 64px)` site gutter.
- **Hero prose-width**: 720px max.
- **Marketing prose-width**: 680px (~64 characters at Plex Sans 17px).
- **Grid columns**: 12, 24px gutter — but used flexibly. Editorial layouts often run 2-up asymmetric (5/7) or 3-up symmetric.
- **Section padding**: 96–160px between modules.

### Whitespace Philosophy

Sections breathe. Vertical padding regularly hits 96–160px between modules; this is the magazine-paced rhythm rather than the dashboard-density of competitor sites. Within sections: 24–48px between groups. Type sizes step in stable 1.25× ratios from 17px body up through 24/32/40/56/80, mirroring an editorial modular scale.

### Section Cadence

The page alternates **`#fffbf5` warm-cream**, **`#fff6e8` cream-stripe**, and (rarely) `#1c170d` warm-black bands. The dark band is for emphasis — pricing reveal, manifesto closing — not default rhythm. Most sections stay in the cream-on-cream register.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|---|---|---|
| Micro | 4px | Inline tags (rare), focus inner-stroke |
| Small | 6px | Quietest dense chips |
| Standard | 8px | Tooltip, dense form chips |
| Comfortable | 12px | Inputs, dropdowns |
| Card | 16px | Default warm-cream cards, testimonial cards |
| Large | 20px | Modal, hero shells |
| Pill | 9999px | **All buttons** — Kagi's signature |

The defining radius decision is the **pill button**. Where every modern SaaS lands at 8–12px on buttons, Kagi runs **fully rounded pills** for primary, secondary, and ghost. The pill radius is part of the brand fingerprint as much as the cream canvas is. Cards hold at 16px (paper-grade soft). Hero shells at 20px (rare). Pills at 9999.

## 7. Depth & Elevation

| Level | Treatment | Use |
|---|---|---|
| 0 (flat) | No shadow, no border | Page bg |
| 1 (hairline) | `1px rgba(0, 0, 0, 0.10)` border | Default cards |
| 2 (tonal) | `#fbf2e2` bg lift on `#fffbf5`, no shadow | Default card depth |
| 3 (deeper tonal) | `#f4e8ce` bg on cream | Hover state, deepest tonal |
| 4 (ambient) | `rgba(43, 36, 23, 0.06) 0 4px 12px` | Toast, light hover |
| 5 (modal) | `rgba(43, 36, 23, 0.18) 0 24px 48px -12px` | Modal |
| Special | `rgba(255, 184, 122, 0.20) 0 16px 40px -16px` | Rare warm-glow under hero illustration |

### Shadow Philosophy

Kagi's depth language is **tonal layering plus a 10% black hairline, almost never blur**. Cards lift through tone and border, not shadow — every surface looks like a different stock weight, not a different elevation. This is what gives Kagi its paper-and-ink feel. When a real shadow is needed (modal, tooltip), it's **warm-brown tinted** (`rgba(43, 36, 23, ...)`) — never neutral black, never coloured. The rare `warm` shadow uses the brand-orange RGB for an editorial accent glow.

## 8. Interaction & Motion

### Easing curves

- **Standard** — `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover, focus.
- **Emphasized** — `cubic-bezier(0.2, 0, 0, 1)` — incoming elements, modals.
- **Out** — `cubic-bezier(0.16, 1, 0.3, 1)` — overshoot-free decelerate.
- **Editorial** — `cubic-bezier(0.32, 0.72, 0, 1)` — section reveal, scroll-triggered illustration parallax.

### Duration buckets

- **Instant** — 80ms — focus ring.
- **Fast** — 120ms — hover bg shift.
- **Standard** — 220ms — default transition (slightly slower than Cartesia's 200ms — paper-paced).
- **Slow** — 360ms — modal opens, card hover lift.
- **Page** — 480ms — between-route transition.

### Per-component micro-states

- **Pill hover** — bg shifts `#ffb87a → #f3a45f` over `120ms ease-standard`. No translate, no scale — the page is paper-static.
- **Pill active** — bg drops one notch darker; faint inset shadow (`inset 0 1px 2px rgba(0, 0, 0, 0.08)`).
- **Card hover** — bg lifts from `#fbf2e2 → #f4e8ce` over `220ms ease-standard`. No translate.
- **Link hover** — colour shift `#c97a3b → #a55d24` over `120ms`; underline thickness can grow from 1px to 2px.
- **Input focus** — focus-ring fades in `80ms`; border colour swaps to `#c97a3b`.
- **Pull-quote scroll-in** — fades up 8px from below, `editorial` easing, `360ms`. Reduced-motion: opacity-only.
- **Modal** — backdrop fades 0 → 0.5 over `220ms`; modal scales `0.96 → 1` simultaneously over `360ms ease-emphasized`.
- **Illustration parallax** — rare, tied to scroll; disabled under reduced-motion.

### Page transitions

Marketing pages use SPA-style fade-through between routes at `480ms`. Section anchors use `scroll-behavior: smooth` over `360ms`.

### Reduced-motion strategy

`prefers-reduced-motion: reduce` is fully honoured. All translate transforms become opacity fades. Illustration parallax disables entirely. Smooth scroll disables. Pull-quote scroll-in becomes a static fade.

## 9. Accessibility & A11y

### Contrast pairs (computed)

| Pair | Ratio | WCAG |
|---|---|---|
| `#2b2417` on `#fffbf5` (body) | 12.4:1 | AAA |
| `#1c170d` on `#fffbf5` (display) | 15.1:1 | AAA |
| `#1c170d` on `#ffb87a` (CTA) | 10.8:1 | AAA |
| `#6b5d47` on `#fffbf5` (muted) | 5.4:1 | AA at body |
| `#c97a3b` on `#fffbf5` (link) | 5.0:1 | AA |
| `#a55d24` on `#ffe5c8` (status pill) | 5.5:1 | AA |
| `#3d5a47` on `#e0ebd0` (success) | 6.5:1 | AAA |

Note: the `#1c170d` on `#ffb87a` ratio of 10.8:1 *demands* dark text on orange — a `#ffffff` on `#ffb87a` pairing would only hit 1.9:1, well below AA. The brand's dark-text-on-orange rule is therefore an accessibility decision as much as an aesthetic one.

### Focus indicators

**2px solid `#c97a3b`** (deep brand-orange) with **2px cream offset** on every interactive surface. The deep-brand colour is visually distinct from the lighter `#ffb87a` brand fill, so focus state cannot be confused with hover.

### ARIA patterns

- **Pull-quote** — uses proper `<blockquote>` markup with `<cite>` for attribution. Screen readers announce the quote and source.
- **Pricing tiers** — `role="group"` with `aria-labelledby` referencing tier name; price values use `aria-label` for screen-reader speech ("seven dollars per month").
- **Nav** — `<nav>` with `aria-label="Primary navigation"`.
- **Modal** — `role="dialog"` + `aria-modal="true"` + `aria-labelledby` + `aria-describedby`.
- **Search input** — `role="combobox"` if predictive, with `aria-expanded` + `aria-controls`.
- **Testimonial** — `<blockquote>` + `<cite>` proper semantics.

### Keyboard navigation

- Tab order follows reading order — header, hero CTA, pricing tiers, testimonials, footer.
- ESC dismisses modals.
- Pill buttons render as proper `<button>` elements.
- Skip-to-content link on first Tab.

### Screen reader hints

- Brand-orange decorative SVGs use `aria-hidden="true"`.
- Pull-quote attribution wraps in `<cite>` — screen reader announces "quote by [name]".
- Pricing values include `aria-label` for natural speech.
- Plex Mono spec tags include `aria-label` describing the metric in human language.

### Reduced motion

Honoured globally. See §8.

## 10. Responsive Behavior

### Breakpoints

| Name | Min-width | Notes |
|---|---|---|
| mobile | 0 | Single column, 24px gutter, hero at 36px |
| tablet | 640px | 2-up feature grid, hero at 48px |
| desktop | 1024px | 3-up grid, hero at 56px |
| wide | 1280px | Full 12-column grid, hero at 64px |
| max | 1440px | Container caps at 1200px, gutter expands |

### Touch targets

All pill CTAs meet **44×44px minimum**. Primary pill at `12px 24px` padding renders ~44px tall. Plex Sans body at 17px is comfortable for touch reading.

### Collapsing strategy

- **Hero** — single-column on mobile (copy → primary pill → secondary pill stacked).
- **Feature grid** — 3-up desktop → 2-up tablet → 1-up mobile.
- **Pricing tiers** — 3-up desktop → 1-up mobile (with horizontal scroll on tablet as fallback).
- **Pull-quote** — full-width on mobile with reduced indent (16px instead of 32px).
- **Top nav** — links collapse into a hamburger drawer at <1024px; primary pill stays visible.
- **Testimonial card** — keeps Plex Serif italic at 22px on mobile (no shrink) but reduces padding to 24px.

### Image behaviour

- Editorial illustrations use SVG with WebP raster fallback.
- `loading="lazy"` below the fold.
- `aspect-ratio` to prevent CLS.
- Hero illustration centre-aligns and caps at 480px on mobile.

### Container queries

Used on the testimonial card — at `@container (max-width: 480px)` the avatar moves from inline-with-attribution to above-the-quote.

## 11. Content & Voice

### Tone

**Editorial, considered, manifesto-grade.** Kagi speaks the way an indie magazine speaks — long sentences, considered word choice, occasional first-person plural ("we believe…"), pull-quotes that earn their italic. The tone is closer to The Browser, Are.na's editorial, or Readwise's Reader announcements than to typical SaaS marketing.

The brand frequently writes in **manifesto register** — long-form essays arguing for paid search, against ad-funded utility, in favour of user-aligned product. The marketing site is essentially a publication; the search product is the artefact the publication advocates for.

### Microcopy patterns

- **Button verbs** — "Try Kagi", "Get started", "Subscribe", "See plans", "Read the manifesto", "Compare". Concrete, slightly editorial.
- **Error messages** — `[Field]: [problem]. [Resolution].` Example: "Email: please enter a valid address."
- **Success confirmations** — "Saved", "Updated", "Sent" — minimal, paper-paced.
- **Empty states** — "No bookmarks yet. [Save your first search →]"
- **Pricing copy** — "$10/month for 300 searches" — direct, no obfuscation. Kagi's pricing transparency is part of the brand.

### Pull-quote conventions

Pull-quotes are **first-person testimonials** or **journalist excerpts** — set in Plex Serif italic 22–32px with attribution below in Plex Sans 14px. Always indented from the body grid with a brand-orange left rule. Used to break up dense feature copy or to anchor a section change.

### CTA verb conventions

The brand uses **specific, slightly editorial** verbs:

1. **Try Kagi** — top hero CTA, the canonical conversion phrase.
2. **Get started** — secondary, sign-up flow.
3. **Subscribe** — pricing CTA (Kagi runs subscription tiers).
4. **Compare** — for the "vs Google / vs Bing" features.
5. **Read the manifesto** — for the editorial entry path.
6. **See plans** — for pricing curiosity.

Avoided: *Sign up* (generic), *Discover*, *Unlock*, *Upgrade* (sales-y), *Free trial* (Kagi has a limited-search free tier but doesn't lead with it).

### Empty states

- Empty bookmarks: "No bookmarks yet. Save your first search to keep it close."
- Empty search history: "Your search history will appear here. We never sell it."
- Empty plans: "Choose a plan that fits how you search."

### Tone anchors

- Reference the user as a **reader** when discussing search results — Kagi's product treats search as reading.
- Use first-person plural ("we believe", "we made") for manifesto register.
- Cite sources for any claim about competitors (Google ads, search bias).
- Avoid superlatives. Kagi's strongest claim is "premium" and "user-funded".
- Reject technical-bro register. The voice is editorial, not engineering.

## 12. Dark Mode & Theming

The marketing surface is **light-only** (warm cream `#fffbf5` is the canvas; there's no dark variant on `kagi.com` marketing). The **in-product Kagi search** ships its own dark theme that flips the cream to a warm-dark `#1c170d` with `#fffbf5` text — preserving the warm-paper register inverted.

### In-product dark theme tokens (search UI)

```yaml
colors-dark:
  bg: '#1c170d'                    # warm-near-black
  bg-soft: '#241e12'               # warmer dark stripe
  surface: '#2e2618'               # card / panel base
  surface-strong: '#3a3120'        # hover deeper
  text: '#fffbf5'                  # cream label
  text-muted: '#c4b9a0'            # warm-grey muted
  text-soft: '#a99a7d'              # supporting copy
  brand: '#ffb87a'                 # orange holds across themes
  brand-soft: '#3a2e1c'            # warm-brown tonal pill bg
  link: '#ffb87a'                  # orange link in dark
  border: 'rgba(255, 251, 245, 0.12)'
  border-strong: 'rgba(255, 251, 245, 0.20)'
```

The dark theme **preserves the orange brand colour** — `#ffb87a` reads as "warm sun" in both light cream and dark warm-brown. Primary pills become `#ffb87a` with `#1c170d` text — same dark-on-orange rule, holding across themes.

The marketing surface holds **light** because the manifesto register reads stronger on cream paper; dark is reserved for the search product where users spend hours reading results.

## 13. Lineage & Influences

Kagi sells a paid search engine, so the site has to look unlike every other search page on the internet. The strategy is **editorial**: a warm cream canvas (`#fffbf5`) borrowed from independent magazines, a single sun-baked orange (`#ffb87a`) doing all the action work, and IBM Plex — both Sans and Serif — carrying the entire type system. Plex is a designed-by-IBM open-source family with a slightly architectural feel; pairing the sans with the serif gives Kagi an indie-publication tone that reads as the opposite of Google's blue-sans-only utilitarianism.

CTAs are pill-shaped and use **dark text on warm orange** — Kagi never does white-on-orange, which preserves the paper-and-ink feel and (incidentally) hits AAA contrast where white-on-orange would fail. Lavender (`#7d6ce0`) makes brief appearances in secondary marketing modules, mostly as illustration accent — never as CTA. The overall posture is closer to **Are.na** or **Readwise** than to **Bing** — a deliberate stance that the search bar deserves the same care as a well-made magazine cover.

The brand also rejects two adjacent registers. Kagi is *not* the developer-API register (no benchmark plots, no JetBrains Mono code on marketing — Plex Mono only, and only for tags), and it is *not* the consumer-utility register (no clinical white, no blue-link convention). The market position — paid premium search for users who care — demands the editorial-magazine register.

**Named influences**:
- **IBM Plex** ([https://www.ibm.com/plex](https://www.ibm.com/plex)) — Entire type system: Sans for UI, Serif for editorial accents, Mono for code/tags. The trifecta is the brand.
- **Are.na** ([https://www.are.na](https://www.are.na)) — Cream-canvas + warm-neutral aesthetic positioning paid software as a craft object.
- **Readwise / Reader** ([https://readwise.io](https://readwise.io)) — Warm-paper CTA discipline — dark text on coloured pills, no inverted white labels.
- **The Browser** — Editorial register applied to a paid product; manifesto-grade marketing.
- **MIT Technology Review** — Editorial whitespace; serif pull-quotes; paper-paced rhythm.
- **Stripe Press** — IBM Plex ecosystem; serif-meets-sans pairing for editorial tech publishing.
- **Raycast** ([https://raycast.com](https://raycast.com)) — Adjacent register: warm-cream cousin, premium-feel paid product.

## 14. Do's and Don'ts

### Do

- **Keep the canvas warm cream (`#fffbf5`).** Pure white reads as a generic SaaS template and breaks the magazine metaphor.
- **Use dark text on the orange CTA** — `#1c170d` on `#ffb87a`. White text on warm orange is an accessibility miss (1.9:1 contrast) and an aesthetic miss.
- **Reach for IBM Plex Serif for editorial moments** (pull-quotes, taglines, longform intros). It's the differentiator from every other Plex Sans site.
- **Use IBM Plex Mono for eyebrow tags**, not Plex Sans. The mono uppercase eyebrow is the spec-stamp signature.
- **Pill-radius (9999) every button** — primary, secondary, ghost. The pill is the brand fingerprint.
- **Set body at 17px / 1.55 line-height with `onum`.** Old-style figures + larger body = editorial cadence.
- **Use tonal layering for depth**, not blur. Cream → cream-stripe → warm card → deeper hover.
- **Set focus-ring as 2px `#c97a3b` with 2px cream offset.** Deep-brand orange is the accessibility colour.
- **Use 10% black hairlines for borders.** Coloured borders break the paper register.
- **Honour `prefers-reduced-motion`** — illustration parallax and pull-quote scroll-in disable when set.
- **Write CTAs with slightly editorial verbs** ("Try", "Read", "Subscribe").

### Don't

- **Don't introduce a second action colour.** Lavender `#7d6ce0` is illustration-only, never a CTA.
- **Don't apply shadows to cards.** Depth is tonal layering plus a 10% black hairline, not blur.
- **Don't square the buttons.** Kagi's pill CTAs are part of the brand fingerprint as much as the cream canvas is.
- **Don't use white text on the orange pill.** Dark text always — both an aesthetic and accessibility rule.
- **Don't substitute Inter or Söhne for Plex.** The Plex trifecta (Sans + Serif + Mono) is the type identity.
- **Don't drop the Plex Serif italic from pull-quotes.** Roman serif is rare; italic is the editorial register.
- **Don't write CTAs in tech-bro voice** ("Unlock", "Supercharge", "Get started free"). The voice is editorial.
- **Don't use Tailwind-default semantic colours.** Reds and greens must be desaturated to read warm against cream.
- **Don't set body at 16px.** 17px is the brand's editorial cadence.
- **Don't compress body tracking.** Negative tracking is display-only.
- **Don't add a second saturated brand colour.** Orange + cream + warm-text is the entire palette — adding teal or blue collapses the magazine metaphor.
- **Don't pure-white any surface.** Even the lifted card uses `#fffefa` (near-white-cream), never `#ffffff`.

## 15. Agent Prompt Guide

### Quick Color Reference

```
bg:           #fffbf5
bg-soft:      #fff6e8
surface:      #fbf2e2
text:         #2b2417
text-strong:  #1c170d
text-muted:   #6b5d47
brand:        #ffb87a
brand-deep:   #c97a3b
on-brand:     #1c170d   # dark text on orange — never white
border:       rgba(0, 0, 0, 0.10)
focus-ring:   #c97a3b
```

### Example Component Prompts

1. *"Create a Kagi-style hero: warm cream `#fffbf5` canvas, headline in IBM Plex Sans 600 / 56px / -0.02em tracking / `#1c170d`. Lede in IBM Plex Sans 400 / 19px / 1.55 line-height / `#2b2417` capped at 720px width. Primary CTA 'Try Kagi' as a fully-rounded `#ffb87a` orange pill with `#1c170d` dark text (NEVER white) at 12px 24px padding / Plex Sans 600 / 15px. Secondary CTA 'Read the manifesto' as a transparent pill with `1px rgba(0, 0, 0, 0.10)` border / dark text / same pill radius."*

2. *"Design a Kagi-style pull-quote: transparent bg, `3px solid #ffb87a` left border, `32px` left indent, IBM Plex Serif italic 22px / 1.4 line-height / `#1c170d`. Below the quote, attribution in Plex Sans 500 / 14px / `#6b5d47` — '— Author Name, Publication'. Wrap in proper `<blockquote>` + `<cite>` markup for screen readers."*

3. *"Build a Kagi-style pricing card: `#fbf2e2` warm-cream bg, `1px rgba(0, 0, 0, 0.10)` border, 16px radius, 32px padding, no shadow. Tier name in Plex Sans 600 / 24px / `#1c170d`. Price in Plex Sans 600 / 56px with `onum` figures / `#1c170d`, then '/month' in Plex Sans 400 / 17px / `#6b5d47`. Feature list in Plex Sans 400 / 17px / 1.55 line-height. CTA at the bottom: 'Subscribe' as a fully-rounded orange pill (dark text). Optional plan badge: warm `#ffe5c8` bg / `#a55d24` text / pill radius."*

4. *"Create a Kagi-style nav bar: 64px height, `#fffbf5` bg matching page, no border (until scroll). Wordmark left in Plex Sans 600 / 18px / `#1c170d`. Nav links right in Plex Sans 500 / 15px / `#2b2417`, hover deepens to `#c97a3b`. Right cluster: ghost 'Sign in' button + primary `#ffb87a` orange pill 'Try Kagi' with dark text."*

5. *"Build a Kagi-style testimonial card: `#fbf2e2` bg, `1px rgba(0, 0, 0, 0.10)` border, 16px radius, 32px padding. Quote in Plex Serif italic 22px / 1.4 line-height / `#1c170d` (no quotation marks — let the type and indent carry the convention). Attribution row below: avatar circle (40px) + name in Plex Sans 600 / 15px + role in Plex Sans 400 / 14px / `#6b5d47`."*

6. *"Design a Kagi-style eyebrow tag: `#fbf2e2` bg, `#6b5d47` text, IBM Plex Mono 500 / 12px / uppercase / 0.06em tracking, pill radius (9999), 4px 10px padding. Use for section labels like 'PRIVACY', 'PRICING', 'MANIFESTO'."*

### Iteration Guide

1. **Replace pure white with `#fffbf5` everywhere.** If your bg is `#ffffff`, you've lost the magazine register.
2. **Verify all buttons are pill radius (9999).** Square or 8px-rounded buttons break the brand fingerprint.
3. **Confirm dark text on orange CTAs.** White-on-orange is doctrinally rejected and fails accessibility.
4. **Switch any pull-quote from sans to Plex Serif italic.** The serif italic is the editorial differentiator.
5. **Replace eyebrows in Plex Sans with Plex Mono.** The mono uppercase is the spec-stamp signature.
6. **Audit body type — set at 17px, not 16px,** with `onum` for old-style figures.
7. **Strip any drop shadows from cards.** Replace with tonal layering and 10% black hairlines.
8. **Replace any introduced second saturated colour with neutral warm-brown or lavender illustration accent.**
Prose

1. Visual Theme & Atmosphere

Kagi’s marketing site is a manifesto against ad-funded search dressed as a small magazine. The canvas is a warm cream #fffbf5 — not white, not beige, but the colour of unbleached book stock — and every other surface tones up or down from there in a single warm-neutral ladder. The brand colour is a sun-baked orange #ffb87a that appears almost exclusively on pill-shaped CTAs, and IBM Plex Sans + Plex Serif carry the entire typographic load.

Where Google argues for “free” with a clinical white sans-only interface, Kagi argues for “paid” with an editorial warm-cream layout and serif pull-quotes. The visual logic is: you’re paying for this, so it should look like something worth paying for. Every chromatic decision reinforces that posture — warm cream over bleached white, sun-baked orange over corporate blue, hand-set Plex Serif italic for pull-quotes, fully-rounded pill CTAs (not the modern 8–12px square-rounded default).

The most consequential decision is dark text on warm orange. Where every modern SaaS pairs white text with a coloured CTA, Kagi insists on #1c170d warm-black on #ffb87a orange — never white. This single typographic-meets-chromatic rule preserves the paper-and-ink feel: the page reads as ink-on-paper rather than chrome-on-glow. The reverse pairing (white on orange) is doctrinally rejected — see §14.

The Plex pairing is the typographic argument. IBM Plex Sans for UI body and headlines (a designed-by-IBM open-source family with a slightly architectural feel), IBM Plex Serif for editorial moments — pull-quotes, taglines, longform intros — and IBM Plex Mono for the rare code block or eyebrow tag. Three faces from one designer, one foundry, one type system. The completeness of the Plex trifecta is what gives Kagi its single typographic identity rather than the usual three-foundry collage.

Atmospheric vocabulary: warm-cream-canvas, sun-baked-orange, Plex-Sans-Plex-Serif-pairing, pill-CTA-with-dark-text, editorial-magazine, paper-and-ink, indie-publication, paid-search-as-craft-object, Are.na-cousin, Readwise-cousin, anti-ad-funded-utility.

Key Characteristics

  • Warm cream #fffbf5 canvas — the colour of unbleached book stock
  • Sun-baked orange #ffb87a reserved for pill CTAs only
  • Dark text on orange (#1c170d) — never white
  • IBM Plex Sans + Plex Serif typographic pairing
  • Plex Serif italic pull-quotes — the editorial differentiator
  • Fully-rounded pill CTAs (radius 9999) — Kagi never squares the buttons
  • 16px card radius on warm-cream panels
  • 10% black hairlines instead of coloured borders
  • Tonal layering for depth — #fffbf5 → #fff6e8 → #fbf2e2 → #f4e8ce
  • Plex Mono eyebrow tags — the “specifications” feel
  • Lavender #7d6ce0 rare illustration accent — never a CTA fill
  • Magazine-paced rhythm (96–160px section gutters)

2. Color Palette & Roles

Primary

  • bg #fffbf5 — warm cream canvas; the page’s defining surface, never substituted for #ffffff.
  • text #2b2417 — near-black with warm cast; body default.
  • bg-soft #fff6e8 — secondary cream stripe for alternating sections.
  • surface #fbf2e2 — card / panel base, half-step warmer than bg.
  • text-strong #1c170d — display copy, deepest warm-black; also the on-brand label colour.

Brand & Accent (orange + lavender)

  • brand #ffb87a — signature sun-baked orange; pill CTAs, hover-link underline.
  • brand-hover #f3a45f — pressed pill state.
  • brand-active #e89348 — deeply pressed.
  • brand-deep #c97a3b — accent text on light surfaces; inline link colour.
  • brand-soft #ffe5c8 — tonal pill background, status indicators.
  • brand-faint #fff4e3 — quietest orange tint, rare promotional band.
  • accent #7d6ce0 — lavender used sparingly in secondary marketing modules and illustrations only — never on a CTA.
  • accent-soft #e8e3ff — lavender illustration tint.

Interactive

  • link #c97a3b — deep brand-orange; underlined.
  • link-hover #a55d24 — darker pressed.
  • selected-bg #fbf2e2 — selected nav, selected row.
  • disabled-bg #f4e8ce — disabled control fill.
  • disabled-text #a99a7d — disabled label, warm grey.
  • focus-ring #c97a3b — 2px solid deep-brand with 2px cream offset.

Neutral Scale (warm grayscale)

  • warm-black #1c170d — display copy, deepest.
  • warm-text #2b2417 — body default.
  • warm-medium #3a3120 — secondary heading.
  • warm-muted #6b5d47 — captions, metadata in warm grey.
  • warm-soft #8a7a5e — supporting copy.
  • warm-faint #a99a7d — helper, microcopy.
  • warm-line #d4c8b0 — strong divider rule.

Surface & Borders

  • surface-0 (page)#fffbf5 warm cream.
  • surface-1 (panel)#fff6e8 cream stripe.
  • surface-2 (card)#fbf2e2 warm card base.
  • surface-3 (hover)#f4e8ce deeper warm.
  • surface-elevated (rare)#fffefa near-white-cream.
  • border rgba(0, 0, 0, 0.10) — 10% black hairline (default).
  • border-strong rgba(0, 0, 0, 0.18) — emphasized rule.
  • border-soft rgba(0, 0, 0, 0.08) — quietest division.
  • border-warm rgba(201, 122, 59, 0.20) — rare brand-tinted hairline (used on the orange pull-quote bar).

Shadow Colors

Kagi uses warm-brown tinted shadows at very low opacity. The marketing surface uses tonal layering for 95% of depth — #fffbf5 → #fff6e8 → #fbf2e2 → #f4e8ce — and a single 10% black hairline. When a real shadow is needed, it’s rgba(43, 36, 23, ...) (the warm-text RGB) at 0.04–0.18 opacity. The rare warm shadow uses the brand-orange RGB for an accent glow under hero illustrations.

Semantic

  • success#e0ebd0 / #3d5a47. Warm-cactus green, not Tailwind-default.
  • warning#fde8c7 / #7a5e1f. Cream-warning, sits adjacent to brand.
  • danger#f7d8d2 / #8a3a3a. Warm coral, never pure red.
  • info#e8e3ff / #3a3a6a. Lavender pair — the only place lavender appears in chrome.

The semantic palette is all desaturated warm tones, never Tailwind-default (which would be too saturated against the cream canvas).

3. Typography Rules

Font Family

  • Display & Body: IBM Plex Sans at weights 400 / 500 / 600 / 700. Plex Sans is a designed-by-IBM open-source family with a slightly architectural feel — slightly more contrast than Inter, slightly more warmth than Söhne. It’s what gives Kagi the “considered” rather than “generic SaaS” cadence. Fallback: -apple-system → system-ui → Segoe UI → Helvetica → Arial → sans-serif.
  • Editorial Serif: IBM Plex Serif at weights 400 / 500 / 600. Used exclusively for pull-quotes, taglines, and rare longform intros. Italic is the dominant style. Fallback: Georgia → Times New Roman → serif.
  • Mono: IBM Plex Mono at weights 400 / 500. Used for eyebrow tags, code blocks, and the rare specification badge. Fallback: Menlo → Consolas → monospace.
  • OpenType features: kern always; ss01 on display (cleaner alt-glyphs); onum (old-style figures) on body Plex Sans for editorial cadence; tnum + zero on Plex Mono for legible numerics.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingOT FeaturesNotes
display-heroPlex Sans806001.02-0.025emss01Rare hero — annual report / manifesto pages
displayPlex Sans646001.05-0.02emSection openers
h1Plex Sans566001.05-0.02emStandard hero
h2Plex Sans406001.1-0.015emSection heading
h3Plex Sans246001.25normalSubsection
h4Plex Sans206001.3normalCard heading
h5Plex Sans185001.35normalInline subheading
eyebrowPlex Mono125001.40.06emuppercaseSection label / tag — the spec-stamp
body-largePlex Sans194001.55normalonumLede
bodyPlex Sans174001.55normalonumDefault body — slightly larger than 16px web default
body-smallPlex Sans154001.5normalSecondary copy
captionPlex Sans144001.4normalHelper, image caption
caption-tabularPlex Mono135001.4normaltnumSpec-row data
labelPlex Sans135001.3normalForm labels
label-ctaPlex Sans156001.2normalButton text
quote-pullPlex Serif italic224001.4normalonumEditorial pull-quote — the brand differentiator
quote-largePlex Serif italic325001.3normalonumHero-scale pull-quote
codePlex Mono144001.55normaltnum zeroInline + block code

Principles

  • Plex Sans + Plex Serif duet is the brand. The Sans handles UI; the Serif handles editorial moments. Three Plex faces from one designer = single typographic identity.
  • Body sized at 17px / 1.55 line-height. Slightly larger than the 16px web default — designed for the long marketing essays Kagi publishes.
  • Headlines compress at -0.02em to -0.025em. Display only; body holds at normal tracking.
  • Plex Serif italic for pull-quotes only. Roman serif is rare; italic is the dominant register.
  • Old-style figures (onum) on body. Gives numerics the editorial, non-tabular cadence of well-set magazine prose.
  • Plex Mono for eyebrow + code. Eyebrow uppercase at 0.06em tracking — the “specifications” feel without being clinical.
  • 600 is the heading weight, never 700. 700 is reserved for display-hero only.
  • Modular scale of 1.25× from body 17px. 17 → 21.25 → 26.6 → 33 → 41.5 → 52 → 65… simplified to 17/20/24/40/56/64/80 in practice.

4. Component Stylings

Buttons

Primary pill (orange, dark text)#ffb87a bg, #1c170d text, 9999 radius (fully rounded), Plex Sans 600 / 15px, padding 12px 24px. Hover deepens to #f3a45f; active to #e89348. The signature CTA — “Try Kagi”, “Get started”, “Subscribe”. Text is dark, never white — see §14.

Secondary pill (cream outlined) — transparent bg, #2b2417 text, 1px rgba(0, 0, 0, 0.10) border, 9999 radius identical to primary, Plex Sans 600 / 15px. Hover wash #fbf2e2.

Ghost pill — transparent, #2b2417 text, no border, 9999 radius preserved, 8px 16px padding. Hover wash rgba(0, 0, 0, 0.05). Used for nav and inline ghost buttons.

Deep pill (rare)#1c170d bg, #fffbf5 text, 9999 radius. Hover #3a3120. Reserved for dark-band hero or pricing emphasis — at most once per page.

Cards

Default card#fbf2e2 warm-cream bg, 1px rgba(0, 0, 0, 0.10) border, 16px radius, 24px padding, no shadow. Used for feature cards, pricing tiers, testimonials.

Lifted cream card (rare)#fffefa near-white-cream bg, 1px rgba(0, 0, 0, 0.08) border, 16px radius, 32px padding. Used for hero pricing or featured testimonial.

Testimonial card#fbf2e2 bg, 1px rgba(0, 0, 0, 0.10) border, 16px radius, 32px padding. Quote in Plex Serif italic 22px; attribution in Plex Sans 500 14px below.

Pull-quote (the editorial signature)

Pull-quote — transparent bg, #1c170d text, 3px solid #ffb87a left border, 32px left indent, Plex Serif italic 22px / 1.4 line-height. Indented from body grid; usually breaks up dense feature copy.

Badges, Tags, Pills

Editorial tag#fbf2e2 bg, #6b5d47 text, Plex Mono 500 / 12px, pill radius. The mono gives the spec-stamp feel that distinguishes Kagi tags from generic SaaS badges.

Status pill (warm)#ffe5c8 bg, #a55d24 text, Plex Sans 500 / 12px, pill radius. Used for plan tiers: Plus, Family, Pro.

Inputs & Forms

Default input#fffefa bg, 1px rgba(0, 0, 0, 0.18) border, 12px radius, 12px 16px padding, Plex Sans 400 / 17px, #a99a7d placeholder. Focus ring 0 0 0 2px #c97a3b with 2px cream offset.

Form labels — Plex Sans 500 / 14px, #2b2417, 4px margin-bottom from input.

Helper text — Plex Sans 400 / 14px, #6b5d47, 4px margin-top from input.

Error state — border #f7d8d2; helper text flips to #8a3a3a.

Top nav — 64px header height, #fffbf5 bg matching page (no fill until scroll), no border. Wordmark left in Plex Sans 600. Nav links right at Plex Sans 500 / 15px / #2b2417. Hover deepens link to #c97a3b. Right cluster: ghost “Sign in” + primary orange pill “Try Kagi”.

Footer nav — Plex Sans 400 / 14px / #6b5d47, multi-column grid. Footer typography uses a touch more leading to read as paper-paged.

Modal#fffefa panel, 16px radius, modal shadow rgba(43, 36, 23, 0.18) 0 24px 48px -12px, 40px padding. Backdrop rgba(43, 36, 23, 0.5).

Tooltips

Tooltip#1c170d bg, #fffbf5 text, 8px radius, Plex Sans 400 / 13px, 8px 12px padding, 220ms fade.

Toasts

Toast#fffefa bg, 1px rgba(0, 0, 0, 0.10) border, 12px radius, ambient warm shadow, 12px 16px padding. Slide-up from bottom-right.

5. Layout Principles

Spacing System

Base unit 4px. Scale: 1, 2, 4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 80, 96, 128, 160. Section padding regularly hits 96–160px between modules — magazine-paced rhythm. Card interiors are generous (24–32px) — paper-grade breathing room.

Grid & Container

  • Page max-width: 1200px, centred, clamp(24px, 5vw, 64px) site gutter.
  • Hero prose-width: 720px max.
  • Marketing prose-width: 680px (~64 characters at Plex Sans 17px).
  • Grid columns: 12, 24px gutter — but used flexibly. Editorial layouts often run 2-up asymmetric (5/7) or 3-up symmetric.
  • Section padding: 96–160px between modules.

Whitespace Philosophy

Sections breathe. Vertical padding regularly hits 96–160px between modules; this is the magazine-paced rhythm rather than the dashboard-density of competitor sites. Within sections: 24–48px between groups. Type sizes step in stable 1.25× ratios from 17px body up through 24/32/40/56/80, mirroring an editorial modular scale.

Section Cadence

The page alternates #fffbf5 warm-cream, #fff6e8 cream-stripe, and (rarely) #1c170d warm-black bands. The dark band is for emphasis — pricing reveal, manifesto closing — not default rhythm. Most sections stay in the cream-on-cream register.

6. Shapes & Radius Scale

TierValueUse
Micro4pxInline tags (rare), focus inner-stroke
Small6pxQuietest dense chips
Standard8pxTooltip, dense form chips
Comfortable12pxInputs, dropdowns
Card16pxDefault warm-cream cards, testimonial cards
Large20pxModal, hero shells
Pill9999pxAll buttons — Kagi’s signature

The defining radius decision is the pill button. Where every modern SaaS lands at 8–12px on buttons, Kagi runs fully rounded pills for primary, secondary, and ghost. The pill radius is part of the brand fingerprint as much as the cream canvas is. Cards hold at 16px (paper-grade soft). Hero shells at 20px (rare). Pills at 9999.

7. Depth & Elevation

LevelTreatmentUse
0 (flat)No shadow, no borderPage bg
1 (hairline)1px rgba(0, 0, 0, 0.10) borderDefault cards
2 (tonal)#fbf2e2 bg lift on #fffbf5, no shadowDefault card depth
3 (deeper tonal)#f4e8ce bg on creamHover state, deepest tonal
4 (ambient)rgba(43, 36, 23, 0.06) 0 4px 12pxToast, light hover
5 (modal)rgba(43, 36, 23, 0.18) 0 24px 48px -12pxModal
Specialrgba(255, 184, 122, 0.20) 0 16px 40px -16pxRare warm-glow under hero illustration

Shadow Philosophy

Kagi’s depth language is tonal layering plus a 10% black hairline, almost never blur. Cards lift through tone and border, not shadow — every surface looks like a different stock weight, not a different elevation. This is what gives Kagi its paper-and-ink feel. When a real shadow is needed (modal, tooltip), it’s warm-brown tinted (rgba(43, 36, 23, ...)) — never neutral black, never coloured. The rare warm shadow uses the brand-orange RGB for an editorial accent glow.

8. Interaction & Motion

Easing curves

  • Standardcubic-bezier(0.4, 0, 0.2, 1) — default for hover, focus.
  • Emphasizedcubic-bezier(0.2, 0, 0, 1) — incoming elements, modals.
  • Outcubic-bezier(0.16, 1, 0.3, 1) — overshoot-free decelerate.
  • Editorialcubic-bezier(0.32, 0.72, 0, 1) — section reveal, scroll-triggered illustration parallax.

Duration buckets

  • Instant — 80ms — focus ring.
  • Fast — 120ms — hover bg shift.
  • Standard — 220ms — default transition (slightly slower than Cartesia’s 200ms — paper-paced).
  • Slow — 360ms — modal opens, card hover lift.
  • Page — 480ms — between-route transition.

Per-component micro-states

  • Pill hover — bg shifts #ffb87a → #f3a45f over 120ms ease-standard. No translate, no scale — the page is paper-static.
  • Pill active — bg drops one notch darker; faint inset shadow (inset 0 1px 2px rgba(0, 0, 0, 0.08)).
  • Card hover — bg lifts from #fbf2e2 → #f4e8ce over 220ms ease-standard. No translate.
  • Link hover — colour shift #c97a3b → #a55d24 over 120ms; underline thickness can grow from 1px to 2px.
  • Input focus — focus-ring fades in 80ms; border colour swaps to #c97a3b.
  • Pull-quote scroll-in — fades up 8px from below, editorial easing, 360ms. Reduced-motion: opacity-only.
  • Modal — backdrop fades 0 → 0.5 over 220ms; modal scales 0.96 → 1 simultaneously over 360ms ease-emphasized.
  • Illustration parallax — rare, tied to scroll; disabled under reduced-motion.

Page transitions

Marketing pages use SPA-style fade-through between routes at 480ms. Section anchors use scroll-behavior: smooth over 360ms.

Reduced-motion strategy

prefers-reduced-motion: reduce is fully honoured. All translate transforms become opacity fades. Illustration parallax disables entirely. Smooth scroll disables. Pull-quote scroll-in becomes a static fade.

9. Accessibility & A11y

Contrast pairs (computed)

PairRatioWCAG
#2b2417 on #fffbf5 (body)12.4:1AAA
#1c170d on #fffbf5 (display)15.1:1AAA
#1c170d on #ffb87a (CTA)10.8:1AAA
#6b5d47 on #fffbf5 (muted)5.4:1AA at body
#c97a3b on #fffbf5 (link)5.0:1AA
#a55d24 on #ffe5c8 (status pill)5.5:1AA
#3d5a47 on #e0ebd0 (success)6.5:1AAA

Note: the #1c170d on #ffb87a ratio of 10.8:1 demands dark text on orange — a #ffffff on #ffb87a pairing would only hit 1.9:1, well below AA. The brand’s dark-text-on-orange rule is therefore an accessibility decision as much as an aesthetic one.

Focus indicators

2px solid #c97a3b (deep brand-orange) with 2px cream offset on every interactive surface. The deep-brand colour is visually distinct from the lighter #ffb87a brand fill, so focus state cannot be confused with hover.

ARIA patterns

  • Pull-quote — uses proper <blockquote> markup with <cite> for attribution. Screen readers announce the quote and source.
  • Pricing tiersrole="group" with aria-labelledby referencing tier name; price values use aria-label for screen-reader speech (“seven dollars per month”).
  • Nav<nav> with aria-label="Primary navigation".
  • Modalrole="dialog" + aria-modal="true" + aria-labelledby + aria-describedby.
  • Search inputrole="combobox" if predictive, with aria-expanded + aria-controls.
  • Testimonial<blockquote> + <cite> proper semantics.

Keyboard navigation

  • Tab order follows reading order — header, hero CTA, pricing tiers, testimonials, footer.
  • ESC dismisses modals.
  • Pill buttons render as proper <button> elements.
  • Skip-to-content link on first Tab.

Screen reader hints

  • Brand-orange decorative SVGs use aria-hidden="true".
  • Pull-quote attribution wraps in <cite> — screen reader announces “quote by [name]”.
  • Pricing values include aria-label for natural speech.
  • Plex Mono spec tags include aria-label describing the metric in human language.

Reduced motion

Honoured globally. See §8.

10. Responsive Behavior

Breakpoints

NameMin-widthNotes
mobile0Single column, 24px gutter, hero at 36px
tablet640px2-up feature grid, hero at 48px
desktop1024px3-up grid, hero at 56px
wide1280pxFull 12-column grid, hero at 64px
max1440pxContainer caps at 1200px, gutter expands

Touch targets

All pill CTAs meet 44×44px minimum. Primary pill at 12px 24px padding renders ~44px tall. Plex Sans body at 17px is comfortable for touch reading.

Collapsing strategy

  • Hero — single-column on mobile (copy → primary pill → secondary pill stacked).
  • Feature grid — 3-up desktop → 2-up tablet → 1-up mobile.
  • Pricing tiers — 3-up desktop → 1-up mobile (with horizontal scroll on tablet as fallback).
  • Pull-quote — full-width on mobile with reduced indent (16px instead of 32px).
  • Top nav — links collapse into a hamburger drawer at <1024px; primary pill stays visible.
  • Testimonial card — keeps Plex Serif italic at 22px on mobile (no shrink) but reduces padding to 24px.

Image behaviour

  • Editorial illustrations use SVG with WebP raster fallback.
  • loading="lazy" below the fold.
  • aspect-ratio to prevent CLS.
  • Hero illustration centre-aligns and caps at 480px on mobile.

Container queries

Used on the testimonial card — at @container (max-width: 480px) the avatar moves from inline-with-attribution to above-the-quote.

11. Content & Voice

Tone

Editorial, considered, manifesto-grade. Kagi speaks the way an indie magazine speaks — long sentences, considered word choice, occasional first-person plural (“we believe…”), pull-quotes that earn their italic. The tone is closer to The Browser, Are.na’s editorial, or Readwise’s Reader announcements than to typical SaaS marketing.

The brand frequently writes in manifesto register — long-form essays arguing for paid search, against ad-funded utility, in favour of user-aligned product. The marketing site is essentially a publication; the search product is the artefact the publication advocates for.

Microcopy patterns

  • Button verbs — “Try Kagi”, “Get started”, “Subscribe”, “See plans”, “Read the manifesto”, “Compare”. Concrete, slightly editorial.
  • Error messages[Field]: [problem]. [Resolution]. Example: “Email: please enter a valid address.”
  • Success confirmations — “Saved”, “Updated”, “Sent” — minimal, paper-paced.
  • Empty states — “No bookmarks yet. [Save your first search →]”
  • Pricing copy — “$10/month for 300 searches” — direct, no obfuscation. Kagi’s pricing transparency is part of the brand.

Pull-quote conventions

Pull-quotes are first-person testimonials or journalist excerpts — set in Plex Serif italic 22–32px with attribution below in Plex Sans 14px. Always indented from the body grid with a brand-orange left rule. Used to break up dense feature copy or to anchor a section change.

CTA verb conventions

The brand uses specific, slightly editorial verbs:

  1. Try Kagi — top hero CTA, the canonical conversion phrase.
  2. Get started — secondary, sign-up flow.
  3. Subscribe — pricing CTA (Kagi runs subscription tiers).
  4. Compare — for the “vs Google / vs Bing” features.
  5. Read the manifesto — for the editorial entry path.
  6. See plans — for pricing curiosity.

Avoided: Sign up (generic), Discover, Unlock, Upgrade (sales-y), Free trial (Kagi has a limited-search free tier but doesn’t lead with it).

Empty states

  • Empty bookmarks: “No bookmarks yet. Save your first search to keep it close.”
  • Empty search history: “Your search history will appear here. We never sell it.”
  • Empty plans: “Choose a plan that fits how you search.”

Tone anchors

  • Reference the user as a reader when discussing search results — Kagi’s product treats search as reading.
  • Use first-person plural (“we believe”, “we made”) for manifesto register.
  • Cite sources for any claim about competitors (Google ads, search bias).
  • Avoid superlatives. Kagi’s strongest claim is “premium” and “user-funded”.
  • Reject technical-bro register. The voice is editorial, not engineering.

12. Dark Mode & Theming

The marketing surface is light-only (warm cream #fffbf5 is the canvas; there’s no dark variant on kagi.com marketing). The in-product Kagi search ships its own dark theme that flips the cream to a warm-dark #1c170d with #fffbf5 text — preserving the warm-paper register inverted.

In-product dark theme tokens (search UI)

colors-dark:
  bg: '#1c170d'                    # warm-near-black
  bg-soft: '#241e12'               # warmer dark stripe
  surface: '#2e2618'               # card / panel base
  surface-strong: '#3a3120'        # hover deeper
  text: '#fffbf5'                  # cream label
  text-muted: '#c4b9a0'            # warm-grey muted
  text-soft: '#a99a7d'              # supporting copy
  brand: '#ffb87a'                 # orange holds across themes
  brand-soft: '#3a2e1c'            # warm-brown tonal pill bg
  link: '#ffb87a'                  # orange link in dark
  border: 'rgba(255, 251, 245, 0.12)'
  border-strong: 'rgba(255, 251, 245, 0.20)'

The dark theme preserves the orange brand colour#ffb87a reads as “warm sun” in both light cream and dark warm-brown. Primary pills become #ffb87a with #1c170d text — same dark-on-orange rule, holding across themes.

The marketing surface holds light because the manifesto register reads stronger on cream paper; dark is reserved for the search product where users spend hours reading results.

13. Lineage & Influences

Kagi sells a paid search engine, so the site has to look unlike every other search page on the internet. The strategy is editorial: a warm cream canvas (#fffbf5) borrowed from independent magazines, a single sun-baked orange (#ffb87a) doing all the action work, and IBM Plex — both Sans and Serif — carrying the entire type system. Plex is a designed-by-IBM open-source family with a slightly architectural feel; pairing the sans with the serif gives Kagi an indie-publication tone that reads as the opposite of Google’s blue-sans-only utilitarianism.

CTAs are pill-shaped and use dark text on warm orange — Kagi never does white-on-orange, which preserves the paper-and-ink feel and (incidentally) hits AAA contrast where white-on-orange would fail. Lavender (#7d6ce0) makes brief appearances in secondary marketing modules, mostly as illustration accent — never as CTA. The overall posture is closer to Are.na or Readwise than to Bing — a deliberate stance that the search bar deserves the same care as a well-made magazine cover.

The brand also rejects two adjacent registers. Kagi is not the developer-API register (no benchmark plots, no JetBrains Mono code on marketing — Plex Mono only, and only for tags), and it is not the consumer-utility register (no clinical white, no blue-link convention). The market position — paid premium search for users who care — demands the editorial-magazine register.

Named influences:

  • IBM Plex (https://www.ibm.com/plex) — Entire type system: Sans for UI, Serif for editorial accents, Mono for code/tags. The trifecta is the brand.
  • Are.na (https://www.are.na) — Cream-canvas + warm-neutral aesthetic positioning paid software as a craft object.
  • Readwise / Reader (https://readwise.io) — Warm-paper CTA discipline — dark text on coloured pills, no inverted white labels.
  • The Browser — Editorial register applied to a paid product; manifesto-grade marketing.
  • MIT Technology Review — Editorial whitespace; serif pull-quotes; paper-paced rhythm.
  • Stripe Press — IBM Plex ecosystem; serif-meets-sans pairing for editorial tech publishing.
  • Raycast (https://raycast.com) — Adjacent register: warm-cream cousin, premium-feel paid product.

14. Do’s and Don’ts

Do

  • Keep the canvas warm cream (#fffbf5). Pure white reads as a generic SaaS template and breaks the magazine metaphor.
  • Use dark text on the orange CTA#1c170d on #ffb87a. White text on warm orange is an accessibility miss (1.9:1 contrast) and an aesthetic miss.
  • Reach for IBM Plex Serif for editorial moments (pull-quotes, taglines, longform intros). It’s the differentiator from every other Plex Sans site.
  • Use IBM Plex Mono for eyebrow tags, not Plex Sans. The mono uppercase eyebrow is the spec-stamp signature.
  • Pill-radius (9999) every button — primary, secondary, ghost. The pill is the brand fingerprint.
  • Set body at 17px / 1.55 line-height with onum. Old-style figures + larger body = editorial cadence.
  • Use tonal layering for depth, not blur. Cream → cream-stripe → warm card → deeper hover.
  • Set focus-ring as 2px #c97a3b with 2px cream offset. Deep-brand orange is the accessibility colour.
  • Use 10% black hairlines for borders. Coloured borders break the paper register.
  • Honour prefers-reduced-motion — illustration parallax and pull-quote scroll-in disable when set.
  • Write CTAs with slightly editorial verbs (“Try”, “Read”, “Subscribe”).

Don’t

  • Don’t introduce a second action colour. Lavender #7d6ce0 is illustration-only, never a CTA.
  • Don’t apply shadows to cards. Depth is tonal layering plus a 10% black hairline, not blur.
  • Don’t square the buttons. Kagi’s pill CTAs are part of the brand fingerprint as much as the cream canvas is.
  • Don’t use white text on the orange pill. Dark text always — both an aesthetic and accessibility rule.
  • Don’t substitute Inter or Söhne for Plex. The Plex trifecta (Sans + Serif + Mono) is the type identity.
  • Don’t drop the Plex Serif italic from pull-quotes. Roman serif is rare; italic is the editorial register.
  • Don’t write CTAs in tech-bro voice (“Unlock”, “Supercharge”, “Get started free”). The voice is editorial.
  • Don’t use Tailwind-default semantic colours. Reds and greens must be desaturated to read warm against cream.
  • Don’t set body at 16px. 17px is the brand’s editorial cadence.
  • Don’t compress body tracking. Negative tracking is display-only.
  • Don’t add a second saturated brand colour. Orange + cream + warm-text is the entire palette — adding teal or blue collapses the magazine metaphor.
  • Don’t pure-white any surface. Even the lifted card uses #fffefa (near-white-cream), never #ffffff.

15. Agent Prompt Guide

Quick Color Reference

bg:           #fffbf5
bg-soft:      #fff6e8
surface:      #fbf2e2
text:         #2b2417
text-strong:  #1c170d
text-muted:   #6b5d47
brand:        #ffb87a
brand-deep:   #c97a3b
on-brand:     #1c170d   # dark text on orange — never white
border:       rgba(0, 0, 0, 0.10)
focus-ring:   #c97a3b

Example Component Prompts

  1. “Create a Kagi-style hero: warm cream #fffbf5 canvas, headline in IBM Plex Sans 600 / 56px / -0.02em tracking / #1c170d. Lede in IBM Plex Sans 400 / 19px / 1.55 line-height / #2b2417 capped at 720px width. Primary CTA ‘Try Kagi’ as a fully-rounded #ffb87a orange pill with #1c170d dark text (NEVER white) at 12px 24px padding / Plex Sans 600 / 15px. Secondary CTA ‘Read the manifesto’ as a transparent pill with 1px rgba(0, 0, 0, 0.10) border / dark text / same pill radius.”

  2. “Design a Kagi-style pull-quote: transparent bg, 3px solid #ffb87a left border, 32px left indent, IBM Plex Serif italic 22px / 1.4 line-height / #1c170d. Below the quote, attribution in Plex Sans 500 / 14px / #6b5d47 — ’— Author Name, Publication’. Wrap in proper <blockquote> + <cite> markup for screen readers.”

  3. “Build a Kagi-style pricing card: #fbf2e2 warm-cream bg, 1px rgba(0, 0, 0, 0.10) border, 16px radius, 32px padding, no shadow. Tier name in Plex Sans 600 / 24px / #1c170d. Price in Plex Sans 600 / 56px with onum figures / #1c170d, then ‘/month’ in Plex Sans 400 / 17px / #6b5d47. Feature list in Plex Sans 400 / 17px / 1.55 line-height. CTA at the bottom: ‘Subscribe’ as a fully-rounded orange pill (dark text). Optional plan badge: warm #ffe5c8 bg / #a55d24 text / pill radius.”

  4. “Create a Kagi-style nav bar: 64px height, #fffbf5 bg matching page, no border (until scroll). Wordmark left in Plex Sans 600 / 18px / #1c170d. Nav links right in Plex Sans 500 / 15px / #2b2417, hover deepens to #c97a3b. Right cluster: ghost ‘Sign in’ button + primary #ffb87a orange pill ‘Try Kagi’ with dark text.”

  5. “Build a Kagi-style testimonial card: #fbf2e2 bg, 1px rgba(0, 0, 0, 0.10) border, 16px radius, 32px padding. Quote in Plex Serif italic 22px / 1.4 line-height / #1c170d (no quotation marks — let the type and indent carry the convention). Attribution row below: avatar circle (40px) + name in Plex Sans 600 / 15px + role in Plex Sans 400 / 14px / #6b5d47.”

  6. “Design a Kagi-style eyebrow tag: #fbf2e2 bg, #6b5d47 text, IBM Plex Mono 500 / 12px / uppercase / 0.06em tracking, pill radius (9999), 4px 10px padding. Use for section labels like ‘PRIVACY’, ‘PRICING’, ‘MANIFESTO’.”

Iteration Guide

  1. Replace pure white with #fffbf5 everywhere. If your bg is #ffffff, you’ve lost the magazine register.
  2. Verify all buttons are pill radius (9999). Square or 8px-rounded buttons break the brand fingerprint.
  3. Confirm dark text on orange CTAs. White-on-orange is doctrinally rejected and fails accessibility.
  4. Switch any pull-quote from sans to Plex Serif italic. The serif italic is the editorial differentiator.
  5. Replace eyebrows in Plex Sans with Plex Mono. The mono uppercase is the spec-stamp signature.
  6. Audit body type — set at 17px, not 16px, with onum for old-style figures.
  7. Strip any drop shadows from cards. Replace with tonal layering and 10% black hairlines.
  8. Replace any introduced second saturated colour with neutral warm-brown or lavender illustration accent.
Ship with this

Drop kagi into your project, then ship the actual sections in an afternoon.

1 · install design
npx design-md add kagi
2 · ship landing page
npx agentkit init --design kagi
How AgentKit reads DESIGN.md
You might also like