DESIGN.md inspired by Buttondown
Indie newsletter software in heavy 900-weight Auto Pro — electric `#0069ff` pill CTAs and soft-yellow highlights on a pure-white canvas.
Compare to…
- bg
#ffffff - surface
#fafafa - surface-2
#f4f4f5 - surface-3
#e9e9eb - text AAA · 21.0
#000000 - text-strong
#000000 - text-muted
#525252 - text-soft
#737373 - text-faint — · 2.5
#a3a3a3 - brand AA · 4.7
#0069ff - brand-hover
#0052cc - brand-active
#0043a8 - brand-soft
#e6f0ff - on-brand
#ffffff - accent
#fef08a - accent-soft
#fefce8 - highlight
#fef08a - border — · 1.3
#e5e5e5 - border-strong — · 1.5
#d4d4d4 - link
#0069ff - success
#15803d - success-bg
#dcfce7 - warning
#b45309 - warning-bg
#fef3c7 - danger
#dc2626 - danger-bg
#fee2e2 - info
#0069ff - info-bg
#e6f0ff
- 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
- step-10 128px
- none
0px - micro
2px - sm
4px - md
8px - lg
12px - xl
16px - xxl
24px - 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 → accent
- muted → text-muted
- border → border
- ring → —
Buttondown's marketing system is the indie-web "small software" aesthetic in its purest form: a pure-white `#ffffff` canvas, plain black `#000000` body, and exactly one accent — electric blue `#0069ff` — doing every piece of brand work. The headline carries the personality. Auto Pro (a contemporary grotesk) runs at 96px / 900 weight, heavier than nearly any peer, set tight and type-forward so the page reads like a confident manifesto rather than a SaaS landing template. The one piece of warmth is the soft-yellow `#fef08a` highlighter sweep under key phrases — a direct quotation of marking up a printed newsletter with a highlighter pen. The primary action is a full-pill (`9999px`) blue button with opinionated copy ("Join your last newsletter"). Where beehiiv shouts about money in black-on-yellow and Substack leans literary-serif, Buttondown leans maker-first: calm space, one accent, heavy type. The lineage runs through Swiss/International-Typographic restraint (Müller-Brockmann grids, minimal palette), the indie-web small-software movement (one-person products, opinionated defaults), and the everyday highlighter-on-paper warmth of a personal newsletter.
- Swiss grid discipline — restraint, single accent, type-as-system.
- Direct rival; Buttondown positions as the indie, maker-first alternative.
- The clean electric-blue-on-white SaaS register Buttondown adapts and simplifies.
- Contemporary grotesk display lineage (Auto Pro sits in this neo-grotesk family).
- The `#fef08a` highlight is Tailwind''s yellow-200 — the utility-CSS color vocabulary it draws from.
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: Buttondown
tagline: 'Indie newsletter software in heavy 900-weight Auto Pro — electric `#0069ff` pill CTAs and soft-yellow highlights on a pure-white canvas.'
updated_at: 2026-05-28T23:12:41.909Z
published_at: 2026-05-28T23:12:41.909Z
author: webdesignhot
source_url: https://buttondown.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [saas]
tags: [light, minimal, sans, creator, newsletter]
preview_swatch: ['#ffffff', '#0069ff', '#fef08a']
related: [beehiiv, substack, ghost]
description: 'Buttondown is newsletter software built for independents, and its marketing surface reads exactly that way — pure white `#ffffff` canvas, plain black `#000000` body, and a single electric blue `#0069ff` that does all the brand work. The headline voice is the loudest thing on the page: Auto Pro set at 96px / 900 weight, heavy and type-forward, with soft-yellow `#fef08a` swept under key phrases like a highlighter on a printout. The primary action is a full-pill (`9999px`) blue button that reads "Join your last newsletter" — opinionated copy from an opinionated product. Where beehiiv shouts about money in black-on-yellow and Substack frames itself around the literary, Buttondown frames itself around the maker: calm white space, one confident accent, and type heavy enough to carry the personality without a second hue. The lineage runs through Swiss-grid restraint, the indie-web "small software" aesthetic, and the highlighter-on-paper warmth of a personal newsletter.'
# 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
accent: accent
muted: text-muted
border: border
colors:
bg: '#ffffff' # primary white marketing canvas
surface: '#fafafa' # near-white card / nested panel
surface-2: '#f4f4f5' # second-level neutral
surface-3: '#e9e9eb' # third-level neutral
text: '#000000' # plain black body — no opacity tilt
text-strong: '#000000' # display headlines stay pure black
text-muted: '#525252' # captions, meta, secondary copy
text-soft: '#737373' # tertiary — timestamps, micro-copy
text-faint: '#a3a3a3' # disabled / placeholder
brand: '#0069ff' # electric blue — the single accent
brand-hover: '#0052cc' # blue pressed a step darker
brand-active: '#0043a8' # deepest pressed blue
brand-soft: '#e6f0ff' # palest blue tint for selection / wash
on-brand: '#ffffff' # white text on the blue pill
accent: '#fef08a' # soft-yellow highlighter sweep
accent-soft: '#fefce8' # palest yellow wash
highlight: '#fef08a' # alias — text-highlight role
border: '#e5e5e5' # 1px hairline divider / input border
border-strong: '#d4d4d4' # heavier divider on hover
link: '#0069ff' # inline links take the brand blue
success: '#15803d' # editorial green
success-bg: '#dcfce7'
warning: '#b45309' # warm amber (not the brand yellow)
warning-bg: '#fef3c7'
danger: '#dc2626' # brick red
danger-bg: '#fee2e2'
info: '#0069ff' # info reuses the brand blue
info-bg: '#e6f0ff'
typography:
display:
family: '"Auto Pro", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif'
weights: [700, 800, 900]
opentype-features: ['kern', 'liga']
body:
family: '"Auto Pro", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif'
weights: [400, 500, 600, 700]
opentype-features: ['kern', 'liga']
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace'
weights: [400, 500]
scale:
display-hero: { size: 96, weight: 900, lineHeight: 1.0, tracking: '-0.03em', family: display }
display-lg: { size: 72, weight: 900, lineHeight: 1.02, tracking: '-0.028em', family: display }
display: { size: 56, weight: 800, lineHeight: 1.05, tracking: '-0.024em', family: display }
h1: { size: 44, weight: 800, lineHeight: 1.1, tracking: '-0.02em', family: display }
h2: { size: 32, weight: 800, lineHeight: 1.15, tracking: '-0.016em', family: display }
h3: { size: 24, weight: 700, lineHeight: 1.25, tracking: '-0.01em', family: display }
h4: { size: 20, weight: 700, lineHeight: 1.3, tracking: '-0.005em', family: body }
h5: { size: 17, weight: 700, lineHeight: 1.35, tracking: '0', family: body }
body-lg: { size: 18, weight: 400, lineHeight: 1.6, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.6, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
lead: { size: 20, weight: 500, lineHeight: 1.55, tracking: '0', family: body }
label: { size: 13, weight: 600, lineHeight: 1.4, tracking: '0.01em', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
code-inline: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: mono }
code: { size: 14, weight: 400, lineHeight: 1.6, tracking: '0', family: mono }
radius:
none: 0
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
xxl: 24
pill: 9999
spacing:
base: 4
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]
layout:
page-width: 1280
prose-width: 720
header-height: 64
hero-padding-y: 96
section-padding-y: 96
card-padding: 24
components:
button-primary:
backgroundColor: brand
textColor: on-brand
radius: pill
padding: '12px 24px'
font: { family: body, weight: 600, size: 16 }
hover: { backgroundColor: brand-hover, transform: 'translateY(-1px)' }
use: 'The electric-blue full-pill CTA — Buttondown''s canonical action'
button-secondary:
backgroundColor: bg
textColor: text
border: border-strong
radius: pill
padding: '12px 24px'
font: { family: body, weight: 600, size: 16 }
hover: { backgroundColor: surface }
use: 'Outlined pill — secondary action beside the blue primary'
button-ghost:
backgroundColor: transparent
textColor: text
radius: md
padding: '10px 16px'
font: { family: body, weight: 600, size: 16 }
hover: { backgroundColor: surface }
use: 'Bare text button — tertiary nav / inline actions'
button-link:
backgroundColor: transparent
textColor: brand
radius: 0
padding: '0'
font: { family: body, weight: 600, size: 16 }
hover: { textColor: brand-hover, textDecoration: underline }
use: 'Inline blue text link with hover underline'
card:
backgroundColor: bg
border: border
borderWidth: 1
radius: lg
padding: 24
shadow: 'rgba(0,0,0,0.04) 0 1px 3px'
use: 'Quiet hairline card — 1px border, whisper shadow'
card-highlight:
backgroundColor: accent-soft
textColor: text
border: border
radius: lg
padding: 24
use: 'Pale-yellow callout card for emphasis blocks'
badge:
backgroundColor: brand-soft
textColor: brand-active
radius: pill
padding: '4px 12px'
font: { family: body, weight: 600, size: 13 }
use: 'Soft-blue pill badge for tags / status'
input:
backgroundColor: bg
border: border
borderWidth: 1
radius: md
padding: '10px 14px'
font: { family: body, weight: 400, size: 16 }
focus: { border: brand, ring: '0 0 0 3px rgba(0,105,255,0.2)' }
use: 'Hairline input; blue focus ring'
highlight:
backgroundColor: accent
textColor: text
padding: '0 2px'
use: 'Soft-yellow text highlight — the highlighter-on-paper sweep'
motion:
ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
ease-decelerate: 'cubic-bezier(0, 0, 0.2, 1)'
duration-instant: 80
duration-fast: 150
duration-standard: 240
duration-slow: 320
hover-lift: 'translateY(-1px)'
page-transition: 'opacity-only, 200ms standard'
reduced-motion: 'respects prefers-reduced-motion: reduce — collapses transforms to opacity-only at 100ms'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
none: 'none'
whisper: 'rgba(0,0,0,0.04) 0 1px 3px' # the only ambient shadow — barely there
raised: 'rgba(0,0,0,0.08) 0 4px 12px' # dropdowns, popovers
overlay: 'rgba(0,0,0,0.12) 0 12px 32px' # modals
ring-brand: '0 0 0 3px rgba(0,105,255,0.2)' # focus ring
accessibility:
contrast-text-on-bg: 21.0 # AAA — black on white
contrast-on-brand-on-brand: 4.7 # AA — white on #0069ff blue
contrast-text-on-accent: 18.05 # AAA — black on #fef08a yellow
contrast-brand-on-bg: 4.7 # AA — blue link on white
contrast-muted-on-bg: 7.81 # AAA — #525252 muted on white
focus-ring: '3px rgba(0,105,255,0.2) ring with 2px brand-blue border'
reduced-motion-honored: true
keyboard-trap-free: true
min-touch-target: 44
dark-mode: none
lineage:
summary: |
Buttondown's marketing system is the indie-web "small software" aesthetic in
its purest form: a pure-white `#ffffff` canvas, plain black `#000000` body,
and exactly one accent — electric blue `#0069ff` — doing every piece of brand
work. The headline carries the personality. Auto Pro (a contemporary grotesk)
runs at 96px / 900 weight, heavier than nearly any peer, set tight and
type-forward so the page reads like a confident manifesto rather than a SaaS
landing template. The one piece of warmth is the soft-yellow `#fef08a`
highlighter sweep under key phrases — a direct quotation of marking up a
printed newsletter with a highlighter pen. The primary action is a full-pill
(`9999px`) blue button with opinionated copy ("Join your last newsletter").
Where beehiiv shouts about money in black-on-yellow and Substack leans
literary-serif, Buttondown leans maker-first: calm space, one accent, heavy
type. The lineage runs through Swiss/International-Typographic restraint
(Müller-Brockmann grids, minimal palette), the indie-web small-software
movement (one-person products, opinionated defaults), and the everyday
highlighter-on-paper warmth of a personal newsletter.
influences:
- name: Josef Müller-Brockmann
role: Swiss grid discipline — restraint, single accent, type-as-system.
url: https://en.wikipedia.org/wiki/Josef_M%C3%BCller-Brockmann
- name: Substack
role: Direct rival; Buttondown positions as the indie, maker-first alternative.
url: https://substack.com
- name: Stripe
role: The clean electric-blue-on-white SaaS register Buttondown adapts and simplifies.
url: https://stripe.com
- name: Pangram Pangram
role: Contemporary grotesk display lineage (Auto Pro sits in this neo-grotesk family).
url: https://pangrampangram.com
- name: Tailwind CSS
role: The `#fef08a` highlight is Tailwind''s yellow-200 — the utility-CSS color vocabulary it draws from.
url: https://tailwindcss.com
---
## 1. Visual Theme & Atmosphere
Buttondown's site looks like software made by one opinionated person who cares about typography — which is exactly what it is. The canvas is pure white `#ffffff`, the body is plain black `#000000`, and the entire brand identity rides on a single electric blue `#0069ff`. There is no second hue, no gradient field, no atmospheric wash. The restraint is deliberate: by spending the whole color budget on one confident blue, the page reads as intentional rather than under-designed.
The loudest element on the page is the type. The hero headline is set in Auto Pro at 96px / 900 weight — heavier than almost any newsletter competitor, and heavier than the 700–800 weights you see on Substack, Ghost, or Kit. That 900-weight display register is the personality. It compresses the headline into a dense, declarative block that reads like a manifesto rather than a marketing banner, and it lets the page get away with almost no other decoration. When type is this confident, you don't need illustration to carry the mood.
The one piece of warmth in the system is the soft-yellow highlight `#fef08a`, swept under key phrases the way someone marks up a printed newsletter with a highlighter pen. It's the same yellow as Tailwind's `yellow-200`, and Buttondown uses it sparingly — never as a fill, never as a band, only as a thin sweep behind a word or two of black text. That single gesture does enormous work: it signals "personal, handmade, paper-adjacent" in a way the electric blue cannot, and it pulls the otherwise clinical white-and-blue palette back toward the human.
The primary action is a full-pill blue button — `9999px` radius, white text, opinionated copy. The canonical CTA reads "Join your last newsletter," which is both a tagline and a button at once. That blending of voice and action is the whole product in miniature: opinionated software that tells you what it thinks, in a button you actually click. Everywhere else the radius ladder is moderate (cards at 12px, inputs at 8px), so the full-pill CTA stands out as the single most-rounded element on the page — the action pressure-point.
The atmosphere is calm-confident. There's generous white space around the hero (96px+ vertical padding), quiet hairline cards with a 1px `#e5e5e5` border and at most a whisper of shadow, and abrupt-but-gentle section transitions on the same white canvas. Where beehiiv cycles aggressively between yellow and black bands for tabloid impact, Buttondown stays on white and lets the heavy type and the single blue accent carry the entire visual load. The result feels less like a SaaS funnel and more like a well-set personal website that happens to sell software.
**Key Characteristics**
- Pure white `#ffffff` canvas with plain black `#000000` body — zero warmth in the neutrals
- A single brand accent: electric blue `#0069ff` (rgb 0,105,255) does all the work, no second hue
- Auto Pro display at 96px / 900 weight — heavier than nearly every newsletter peer
- Soft-yellow `#fef08a` highlighter sweep under key phrases — the one note of warmth
- Full-pill (`9999px`) blue CTA with opinionated copy ("Join your last newsletter")
- Moderate radius ladder (cards 12px, inputs 8px) against the full-pill action
- Quiet hairline cards: 1px `#e5e5e5` border, whisper shadow at most
- Generous hero white space (96px+ vertical) — calm, not crowded
- Type-forward identity: the headline carries personality, not illustration
- Indie / maker register — opinionated defaults, single-author software energy
## 2. Color Palette & Roles
### Primary (Canvas & Text)
- **bg** (`#ffffff`): the primary marketing canvas; full pure white, no warmth — sourced live from the production `body` background.
- **text** (`#000000`): plain black body and headlines; no opacity tilt — sourced live from production `body` and `h1` color.
- **text-strong** (`#000000`): display headlines hold pure black at all weights.
### Brand
- **brand** (`#0069ff`): the electric blue (rgb 0,105,255) — the single accent that carries the brand; sourced live from the primary CTA background.
- **brand-hover** (`#0052cc`): blue pressed one step darker for hover.
- **brand-active** (`#0043a8`): deepest pressed blue for active / focus-fill.
- **brand-soft** (`#e6f0ff`): palest blue tint for selection backgrounds, badges, and info washes.
- **on-brand** (`#ffffff`): white text on the blue pill — sourced live from the CTA text color.
### Accent (Highlight)
- **accent** (`#fef08a`): the soft-yellow highlighter sweep behind key phrases — sourced live from the highlighted-name span on production. Used only as a thin text highlight, never a fill or band.
- **accent-soft** (`#fefce8`): palest yellow wash for callout-card backgrounds.
- **highlight** (`#fef08a`): alias of `accent` for the text-highlight role.
### Interactive
- **link** (`#0069ff`): inline links take the brand blue, underlined on hover.
- **link-hover** (`#0052cc`): pressed link blue.
- **selected**: `brand-soft` (`#e6f0ff`) fill with `#000000` text.
- **focus-ring**: `0 0 0 3px rgba(0,105,255,0.2)` with a `#0069ff` border.
- **disabled**: `text-faint` (`#a3a3a3`) on `surface` (`#fafafa`).
### Neutral Scale
- **text-muted** (`#525252`): captions, meta, secondary copy — 7.8:1 on white (AAA).
- **text-soft** (`#737373`): tertiary text — timestamps, micro-copy.
- **text-faint** (`#a3a3a3`): disabled state, placeholder text.
- The system keeps neutrals cool-grey and shallow; it never reaches for warm taupe or a deep charcoal-as-brand.
### Surface & Borders
- **surface** (`#fafafa`): near-white nested card panel.
- **surface-2** (`#f4f4f5`): second-tier neutral, table rows.
- **surface-3** (`#e9e9eb`): third-tier neutral, divider areas.
- **border** (`#e5e5e5`): the canonical 1px hairline divider and input border.
- **border-strong** (`#d4d4d4`): heavier divider on hover / outlined buttons.
### Shadow Colors
- **whisper** (`rgba(0,0,0,0.04) 0 1px 3px`): the only ambient shadow — barely perceptible, used on cards.
- **raised** (`rgba(0,0,0,0.08) 0 4px 12px`): dropdowns and popovers.
- **overlay** (`rgba(0,0,0,0.12) 0 12px 32px`): modal dialogs.
Note: Buttondown leans on the 1px hairline border far more than on shadow. Where Stripe builds a soft elevation language, Buttondown keeps shadows to a whisper — the border is the primary edge, the shadow is an afterthought.
### Semantic
- **success** (`#15803d`) on **success-bg** (`#dcfce7`): editorial green.
- **warning** (`#b45309`) on **warning-bg** (`#fef3c7`): warm amber — the system reaches for amber rather than the brand yellow so the highlight role stays unambiguous.
- **danger** (`#dc2626`) on **danger-bg** (`#fee2e2`): brick red.
- **info** (`#0069ff`) on **info-bg** (`#e6f0ff`): info reuses the brand blue rather than introducing a separate info hue.
## 3. Typography Rules
### Font Family
- **Display**: `"Auto Pro"` (a contemporary neo-grotesk) → system-ui → -apple-system → BlinkMacSystemFont → Segoe UI → Helvetica → Arial → sans-serif.
- **Body**: `"Auto Pro"` (the same family carries both roles) → system-ui → -apple-system → BlinkMacSystemFont → Segoe UI → Helvetica → Arial → sans-serif.
- **Mono companion**: ui-monospace → SFMono-Regular → SF Mono → Menlo → Consolas → Liberation Mono → monospace.
- **OpenType features**: `kern` and `liga` on display and body. No tabular-figure or stylistic-set affectation — the personality comes from weight, not feature switches.
Buttondown runs a single typeface across the whole page. Display and body are both Auto Pro; the contrast comes entirely from weight (400 body vs. 900 display) and size, not from a second family. This is a deliberately economical choice that reinforces the single-author, single-system feel.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | Auto Pro | 96 | 900 | 1.0 | -0.03em | the live hero size — heaviest weight on the page |
| display-lg | Auto Pro | 72 | 900 | 1.02 | -0.028em | secondary heroes |
| display | Auto Pro | 56 | 800 | 1.05 | -0.024em | feature-band heads |
| h1 | Auto Pro | 44 | 800 | 1.1 | -0.02em | page / section heads |
| h2 | Auto Pro | 32 | 800 | 1.15 | -0.016em | sub-section heads |
| h3 | Auto Pro | 24 | 700 | 1.25 | -0.01em | card / feature heads |
| h4 | Auto Pro | 20 | 700 | 1.3 | -0.005em | inline emphasis heads |
| h5 | Auto Pro | 17 | 700 | 1.35 | 0 | label-grade heads |
| lead | Auto Pro | 20 | 500 | 1.55 | 0 | hero subhead / intro paragraph |
| body-lg | Auto Pro | 18 | 400 | 1.6 | 0 | hero supporting copy |
| body | Auto Pro | 16 | 400 | 1.6 | 0 | default reading size (live body) |
| body-sm | Auto Pro | 14 | 400 | 1.5 | 0 | secondary copy |
| label | Auto Pro | 13 | 600 | 1.4 | 0.01em | eyebrow, form labels |
| caption | Auto Pro | 12 | 500 | 1.4 | 0.02em | image / chart caption |
| code-inline | mono | 14 | 400 | 1.5 | 0 | inline code |
| code | mono | 14 | 400 | 1.6 | 0 | code block |
### Principles
- **Weight is the hierarchy**: the page jumps from 400 body straight to 900 display. There is no gradual weight ramp; the contrast between plain body and heavy headline is the whole typographic system.
- **900 is the brand**: the hero runs at 900, heavier than the 700–800 register most newsletter platforms use. Drop below 800 at hero scale and the page loses its declarative, manifesto character.
- **Negative tracking at scale**: at 96px the track tightens to `-0.03em` so the heavy letterforms knit into a dense block. Without the negative tracking, 900-weight Auto Pro reads loose and loud rather than confident and compressed.
- **One family, two roles**: Auto Pro carries both display and body. The economy is intentional — it signals single-system, maker-built software, not a multi-typeface marketing department.
- **No serif, no rounded warmth**: the warmth in this system comes from the yellow highlight, not the typeface. Auto Pro is a clean neo-grotesk; keep it that way and let `#fef08a` add the human note.
- **Generous body leading**: body copy sits at 1.6 line-height for comfortable long-form reading — appropriate for a product whose users write and read newsletters all day.
- **The highlight is typographic, not chromatic decoration**: the `#fef08a` sweep behaves like a type treatment (it marks a phrase), so it appears inline within running text, never as a standalone block.
## 4. Component Stylings
### Buttons
**Primary (blue pill)**
- Background: `#0069ff`. Text: `#ffffff` at Auto Pro 600 / 16px. Padding: `12px 24px`. Radius: 9999px (full pill). Border: none.
- Hover: background → `#0052cc`, transform → `translateY(-1px)`, 150ms standard ease. Active: `translateY(0)`, background → `#0043a8`.
- Use: every primary CTA — "Join your last newsletter", "Start writing", "Get started". The canonical Buttondown action.
**Secondary (outlined pill)**
- Background: `#ffffff`. Text: `#000000` at Auto Pro 600 / 16px. Padding: `12px 24px`. Radius: 9999px. Border: `1px solid #d4d4d4`.
- Hover: background → `#fafafa`, border → `#a3a3a3`. Use: secondary action set beside the blue primary (e.g. "See features").
**Ghost (bare text)**
- Background: transparent. Text: `#000000` at Auto Pro 600 / 16px. Padding: `10px 16px`. Radius: 8px. Border: none.
- Hover: background → `#fafafa`. Use: tertiary actions, nav items, low-emphasis buttons.
**Link (inline blue)**
- Background: transparent. Text: `#0069ff` at Auto Pro 600 / 16px. No padding, no radius.
- Hover: color → `#0052cc`, underline appears. Use: inline text links inside running copy.
### Cards
**Standard (hairline)**
- Background: `#ffffff`. Border: `1px solid #e5e5e5`. Radius: 12px. Padding: 24px. Shadow: `rgba(0,0,0,0.04) 0 1px 3px` (whisper).
- Hover: border → `#d4d4d4`, transform → `translateY(-1px)`. Use: feature cards, pricing tiers, content blocks.
**Highlight card (pale-yellow callout)**
- Background: `#fefce8`. Text: `#000000` at Auto Pro 400 / 16px. Border: `1px solid #e5e5e5`. Radius: 12px. Padding: 24px.
- Use: emphasis blocks, "good to know" callouts — the pale-yellow companion to the inline highlight.
**Soft-blue card (info)**
- Background: `#e6f0ff`. Text: `#000000`. Border: none. Radius: 12px. Padding: 24px.
- Use: info / tip blocks where the brand blue should register without the full saturation.
### Badges, Tags, Pills
**Soft-blue badge**
- Background: `#e6f0ff`. Text: `#0043a8` at Auto Pro 600 / 13px. Padding: `4px 12px`. Radius: 9999px.
- Use: "NEW", "BETA", category tags, status markers.
**Yellow-highlight badge**
- Background: `#fef08a`. Text: `#000000` at Auto Pro 600 / 13px. Padding: `4px 12px`. Radius: 9999px.
- Use: rare emphasis tags ("Popular") where the highlighter note is wanted.
### Inputs / Forms
**Text input**
- Background: `#ffffff`. Border: `1px solid #e5e5e5`. Radius: 8px. Padding: `10px 14px`. Font: Auto Pro 400 / 16px.
- Focus: border → `#0069ff`, ring `0 0 0 3px rgba(0,105,255,0.2)`. Placeholder: `#a3a3a3`.
**Newsletter signup input**
- Background: `#ffffff`. Border: `1px solid #e5e5e5`. Radius: 9999px (pill) when paired with the inline blue pill submit, or 8px when stacked. Padding: `12px 18px`. Font: Auto Pro 400 / 16px.
- Pairs with the blue pill submit button — the brand's signature email-capture gesture.
### Navigation
**Top bar**
- Background: `#ffffff` with a `1px solid #e5e5e5` bottom border that appears on scroll. Height: 64px.
- Logo: Buttondown wordmark in Auto Pro 800 / 20px in `#000000`.
- Nav items: Auto Pro 600 / 14px, color `#000000`, hover → `#fafafa` ghost background or underline.
- Primary CTA always visible at top right (blue pill).
### Tooltips, Toasts, Modals
- **Tooltip**: background `#000000`, text `#ffffff` at Auto Pro 500 / 12px, radius 6px, padding `6px 10px`. Shadow: `raised`.
- **Toast**: background `#000000`, text `#ffffff` at Auto Pro 500 / 14px, radius 12px, padding `14px 18px`, `raised` shadow.
- **Modal**: background `#ffffff`, border `1px solid #e5e5e5`, radius 16px, `overlay` shadow. Backdrop: `rgba(0,0,0,0.4)`. Padding: 24px.
## 5. Layout Principles
### Spacing System
Base unit: 4px. Scale: `[0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]`. The system favours medium-large jumps for calm breathing — 24px card padding, 32–48px between stacked elements, 96px between major sections. It is looser than a dense dashboard and tighter than beehiiv's broadsheet 120–160px; the rhythm is "personal-website calm".
### Grid & Container
- **Page width**: 1280px max, centred.
- **Prose width**: 720px for editorial blog, docs, and the newsletter-preview reading column.
- **Hero treatment**: hero copy claims roughly 760–900px horizontal; headline at 96px display-hero; supporting copy at body-lg below; primary blue pill CTA directly under.
- **Feature grid**: 3-column at 1024px+, 2-column at 640–1024px, 1-column below 640px. Card gap: 24px.
### Whitespace Philosophy
Whitespace here is calm-confident, not poster-loud. The hero gets generous vertical room (96px+ top/bottom), but the system never inflates to broadsheet scale. The white canvas itself is the breathing room — because there are no competing bands or colored sections, the page feels open even at moderate padding. The single blue accent and the heavy headline are what punctuate the calm.
### Section Cadence
Sections stay on the white canvas; there is no band-cycling. Cadence comes from the heavy section headers (display / h1 at 800–900 weight), the occasional pale-yellow highlight callout, and the blue CTA repeating at the foot of major sections. Transitions are gentle — a 1px hairline divider or a shift to `#fafafa` surface, never an abrupt color band. The page reads as one continuous document, which suits the maker-first, single-author register.
## 6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| none | 0px | full-bleed dividers, the yellow text-highlight sweep |
| micro | 2px | inline indicators, tiny chips |
| sm | 4px | tight UI primitives, checkboxes |
| md | 8px | inputs, ghost buttons, small surfaces |
| lg | 12px | the canonical card radius |
| xl | 16px | modals, larger feature shells |
| xxl | 24px | hero image / illustration corners |
| pill | 9999px | the canonical CTA pill and all badges |
The radius ladder is moderate-with-a-pill-spike. Most surfaces sit at 8–12px (inputs 8px, cards 12px), and then the primary CTA jumps all the way to a full pill (`9999px`). That gap is intentional: the pill is reserved almost exclusively for the action, so the most-rounded element on the page is always the thing you're meant to click. Badges share the pill shape, reinforcing "pill = interactive / status" as a visual rule.
## 7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | flat, on `#ffffff` or `#fafafa` | body content, default surfaces |
| 1 | `1px solid #e5e5e5` border + whisper shadow (`rgba(0,0,0,0.04) 0 1px 3px`) | the canonical card |
| 2 | `1px solid #d4d4d4` + `translateY(-1px)` on hover | hovered card |
| 3 | `rgba(0,0,0,0.08) 0 4px 12px` shadow | dropdowns, popovers, tooltips |
| 4 | `rgba(0,0,0,0.12) 0 12px 32px` + backdrop | modal dialog |
| 5 | full-pill blue button `translateY(-1px)` on hover | the elevated primary action |
**Shadow Philosophy**: Buttondown treats elevation as mostly a border problem, not a shadow problem. The 1px `#e5e5e5` hairline does the visual separation; the whisper shadow underneath is so faint it reads almost as a border softening rather than true depth. Real shadow appears only on genuinely floating chrome — dropdowns, popovers, modals — where the element must lift off the page. This keeps the marketing surface flat and document-like, in contrast to Stripe's richer soft-shadow elevation language. The blue CTA's `translateY(-1px)` hover is the most expressive depth gesture on the page, and even that is restrained.
## 8. Interaction & Motion
### Easing
- **standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — workhorse Material-style ease for hovers and color shifts.
- **emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — sharper accel/decel for the CTA press and dropdown open.
- **decelerate**: `cubic-bezier(0, 0, 0.2, 1)` — for elements entering from off-canvas.
### Durations
- **instant** (80ms): hover background color shifts on ghost buttons and nav items.
- **fast** (150ms): card hover lift, blue-pill hover, link underline appearance.
- **standard** (240ms): primary CTA press, dropdown open, input focus-ring fade.
- **slow** (320ms): modal open, page-section reveal.
### Per-component micro-states
- **Blue-pill CTA hover**: background → `#0052cc`, `translateY(-1px)`, 150ms standard ease. Active: `translateY(0)`, background → `#0043a8`.
- **Card hover**: border → `#d4d4d4`, `translateY(-1px)` over 150ms; the whisper shadow stays constant.
- **Link hover**: color → `#0052cc`, underline grows in at 150ms.
- **Input focus**: blue ring `0 0 0 3px rgba(0,105,255,0.2)` fades in at 240ms; border switches to `#0069ff`.
- **Highlight reveal**: where the `#fef08a` sweep animates on scroll, it wipes left-to-right over 320ms decelerate (the highlighter-stroke effect), and renders instantly under reduced-motion.
### Page transitions
Buttondown uses opacity-only fades at ~200ms between marketing routes; no slide, no scale. The calm white canvas means route transitions stay quiet — the heavy type and single blue accent carry the visual interest, so motion does not need to.
### Reduced-motion strategy
`prefers-reduced-motion: reduce` is honored: card hover lifts and CTA `translateY` collapse to color-only changes, the highlighter wipe renders as a static fill, and section reveals become instant. Focus rings and color-state changes are preserved — they communicate state, not decoration.
## 9. Accessibility & A11y
### Contrast pairs (computed)
- **text on bg**: `#000000` on `#ffffff` → **21.0:1** (AAA at all sizes) — the maximum possible contrast.
- **on-brand on brand**: `#ffffff` on `#0069ff` → **4.7:1** (AA for normal text and UI components; AAA for large text). The white-on-blue pill clears the 4.5:1 normal-text threshold.
- **text on accent**: `#000000` on `#fef08a` → **18.05:1** (AAA) — black on the soft-yellow highlight is extremely legible.
- **brand link on bg**: `#0069ff` on `#ffffff` → **4.7:1** (AA for normal text). Blue inline links pass; pair with underline for non-color affordance.
- **text-muted on bg**: `#525252` on `#ffffff` → **7.81:1** (AAA at body sizes).
- **brand-active on brand-soft**: `#0043a8` on `#e6f0ff` (badge) → ~7:1 (AAA at badge sizes).
Note: because white-on-blue lands at 4.7:1 (just above the 4.5:1 floor), keep the blue at exactly `#0069ff` and the pill text at full white — lightening the blue or tinting the text would drop the primary CTA below AA. For blue-on-white inline links, the underline is required as a redundant non-color cue.
### Focus indicators
- **Default focus ring**: `3px rgba(0,105,255,0.2)` ring with a `#0069ff` 1–2px border, visible on every neutral surface.
- **On the blue pill**: focus shows a `#ffffff` inner ring plus the offset blue glow for contrast against the saturated background.
- Focus rings are never removed; they are color-adaptive but always present.
### ARIA patterns
- Pricing toggles use `role="radiogroup"` rather than tabs.
- Newsletter-signup input uses `aria-describedby` to associate the field with helper text.
- Modals use `role="dialog"`, `aria-modal="true"`, focus trap, and `Esc` to close.
- The yellow highlight is purely presentational — it carries no semantics and is not announced by screen readers (it wraps existing text, no `aria-label` needed).
### Keyboard nav order
Top bar → hero CTA → feature sections in DOM order → pricing → footer. A skip-to-content link sits at the top of the DOM, visible on focus. Tab order matches visual order throughout the single-canvas layout.
### Screen reader hints
- Icon-only buttons carry an `aria-label` describing the action.
- Decorative dividers and the highlighter sweep carry no announced content.
- Form fields pair `<label>` elements with inputs; placeholder text is never the only label.
### Reduced motion
Honored throughout — see §8.
## 10. Responsive Behavior
### Breakpoints
| Tier | Width | Behavior |
|---|---|---|
| mobile | < 640px | single column, 16px gutter, 48–64px section padding, hero at 40–48px |
| tablet | 640–1024px | 2-column feature grids, 24px gutter, 64px section padding, hero at 56–64px |
| desktop | 1024–1280px | 3-column feature grids, 24px gutter, 96px section padding, hero at 72–96px |
| wide | 1280px+ | container caps at 1280px, hero at full 96px display-hero |
### Touch Targets
Minimum 44×44px on touch devices. The `12px / 24px` button padding clears the threshold. The blue pill CTA on mobile expands to `14px / 28px` for a thumb-friendly tap area, and full-width pill CTAs are common on the narrowest breakpoint.
### Collapsing strategy
- **Top nav**: hamburger menu < 768px; the blue pill CTA stays visible at top right.
- **Hero**: headline scales down from 96px → 40–48px; supporting copy claims full width; any illustration moves below the copy.
- **Feature grid**: 3 → 2 → 1 columns at 1024 / 640.
- **Pricing tiers**: stack vertically < 768px with the recommended tier ordered to the top.
- **Footer**: multi-column → 2-column → 1-column at 1024 / 640.
### Image behavior
Hero illustrations and newsletter mockups use a fixed `aspect-ratio` lock with `object-fit: contain` so the product UI never crops awkwardly. Below 640px the mockup fills container width with its aspect ratio maintained.
### Container queries
Used inside the newsletter-preview and dashboard mockups — the preview component switches between condensed and expanded reading layouts based on container width rather than viewport width.
## 11. Content & Voice
### Tone
Buttondown's tone is **opinionated-indie**: first-person, plainspoken, and unafraid to have a point of view. It writes like a maker talking to other makers — "newsletter software for people like you" — rather than a marketing department talking to a funnel. Headlines are confident and slightly wry; the canonical CTA, "Join your last newsletter," is half-tagline, half-button, and entirely in character. The copy assumes the reader is smart and skips the hard-sell.
### Microcopy patterns
- **Button verbs**: "Start writing", "Join your last newsletter", "Get started", "See pricing", "Read the docs". Action-forward but never breathless; no exclamation-point hype.
- **Error messages**: pattern is "[What happened]. [What to do]." e.g. "That email is already subscribed. Try signing in instead."
- **Success confirmations**: short and human. "Sent. Your subscribers have it now." rather than a generic success banner.
### Empty states
Empty states are warm and instructional, framing the absence as a starting point. "No subscribers yet — share your signup page" with a copy-link button as the primary action. "Nothing scheduled. Write your first issue whenever you're ready." The voice never scolds; it nudges.
### CTA verb conventions
- **Primary marketing CTA**: "Join your last newsletter" or "Start writing" — opinionated, on-brand phrasing.
- **Secondary**: "See pricing", "Read the docs", "See features".
- **Newsletter signup**: "Subscribe" — plain, often with a subscriber count nearby for social proof.
- **Sales / contact**: "Talk to us" rather than "Talk to sales" — the indie register avoids enterprise vocabulary.
## 12. Dark Mode & Theming
Buttondown's marketing surface is **light-only** — there is no dark variant on the production landing page, and the system does not follow `prefers-color-scheme: dark`. The white canvas is integral to the identity: the highlighter-on-paper metaphor and the electric-blue-on-white contrast only read correctly on a white ground.
The product application (the dashboard where users write and send newsletters) does offer a separate dark theme controlled by user preference, but it is a distinct system from the marketing site and is not described by these marketing tokens. If you build a dark variant of a Buttondown-styled component, preserve these rules:
- Keep the blue near `#0069ff` (it may lift slightly, e.g. `#3b82f6`, for legibility on a dark ground, but it stays in the same electric-blue family).
- The `#fef08a` highlight either drops opacity to ~18% as a wash or is replaced by a subtler underline on dark — full-saturation yellow on black drifts toward beehiiv's territory and breaks the calm register.
- Body text inverts to `#ffffff` / `#e5e5e5`; surfaces step through `#0a0a0a` → `#1a1a1a`; the 1px hairline border becomes a `#262626` ring.
- The flat, shadow-light elevation doctrine carries over — depth stays understated.
For the marketing surface specifically: **do not add a dark mode**. Light-only is the correct, intentional state.
## 13. Lineage & Influences
Buttondown's visual lineage runs through three traditions: Swiss / International-Typographic restraint, the indie-web "small software" movement, and the everyday warmth of marking up paper with a highlighter. From the Swiss grid it inherits the discipline of a minimal palette and type-as-system — one accent color, a strict grid, and headlines doing the structural work that decoration does elsewhere. The single electric blue against pure white is a direct descendant of that "one signal color on white" philosophy, the same logic that runs through Müller-Brockmann's poster work and, more recently, Stripe's clean electric-blue SaaS register.
The indie-web influence is the personality. Buttondown is software with a maker's voice — opinionated defaults, plainspoken copy, a CTA that doubles as a tagline. That register descends from the small-software / one-person-product culture of the indie web, where the product's point of view is a feature, not a liability. It is positioned deliberately against Substack's larger, more literary-corporate framing: where Substack is a platform, Buttondown is a tool made by someone who uses it.
The third note — the soft-yellow `#fef08a` highlight — is the human warmth, and it is a literal quotation. It's the color of a highlighter pen on a printed page, and it's also Tailwind's `yellow-200`, signaling the utility-CSS vocabulary the site is built from. That single gesture pulls the otherwise clinical blue-and-white palette back toward the personal and the handmade, which is exactly the brand promise: real software for real people who write newsletters.
**Named influences**
- **Josef Müller-Brockmann** ([wikipedia.org](https://en.wikipedia.org/wiki/Josef_M%C3%BCller-Brockmann)) — Swiss grid discipline: restraint, a single accent, type-as-system.
- **Substack** ([substack.com](https://substack.com)) — the direct rival Buttondown positions against as the indie, maker-first alternative.
- **Stripe** ([stripe.com](https://stripe.com)) — the clean electric-blue-on-white SaaS register Buttondown adapts and simplifies.
- **Pangram Pangram** ([pangrampangram.com](https://pangrampangram.com)) — contemporary grotesk display lineage; Auto Pro sits in this neo-grotesk family.
- **Tailwind CSS** ([tailwindcss.com](https://tailwindcss.com)) — the `#fef08a` highlight is Tailwind's `yellow-200`; the utility-CSS color vocabulary the site draws from.
## 14. Do's and Don'ts
**Do**
- Keep the canvas pure white `#ffffff` and the body plain black `#000000` — the contrast is the foundation, and it scores a perfect 21:1.
- Spend the entire color budget on one electric blue `#0069ff`; resist adding a second brand hue.
- Run hero headlines in Auto Pro at 900 weight; the heavy display register is the personality.
- Tighten tracking to about `-0.03em` at 96px so the heavy letterforms knit into a confident block.
- Use the `#fef08a` highlight as a thin inline sweep under key phrases — like a highlighter on paper, never as a fill or band.
- Make the primary CTA a full-pill (`9999px`) blue button; reserve the pill shape for actions and badges.
- Keep cards quiet: 1px `#e5e5e5` border, 12px radius, a whisper shadow at most.
- Use black on the yellow highlight (18:1) and white on the blue pill (4.7:1) — both clear their thresholds.
- Write opinionated, plainspoken copy in the first person; let the CTA carry voice ("Join your last newsletter").
- Keep the layout on a single white canvas; cadence comes from heavy headers and the repeating blue CTA, not color bands.
**Don't**
- Don't introduce a second accent hue; the system is white + black + one blue, and the yellow is a highlight role, not a brand color.
- Don't drop the display weight below 800 at hero scale; below that the page loses its declarative voice.
- Don't lighten the blue below `#0069ff` or tint the pill text — white-on-blue is at 4.7:1 and any drift fails AA.
- Don't turn the `#fef08a` yellow into a fill, a band, or a button background; it is a thin text-highlight sweep only.
- Don't add a dark mode to the marketing surface; light-only is the intentional, correct state.
- Don't pile on shadows — the 1px hairline border carries elevation; reserve real shadow for floating chrome.
- Don't make every button a pill; the pill is reserved for the primary action and badges, so it stays meaningful.
- Don't use color alone for links; pair the blue with an underline for a non-color affordance.
- Don't inflate spacing to broadsheet scale (120px+); the rhythm is personal-website calm, around 96px sections.
- Don't switch to a second typeface for body; Auto Pro carries both display and body — the single family is the system.
## 15. Agent Prompt Guide
### Quick Color Reference
```
bg: #ffffff
text: #000000
brand: #0069ff
brand-hover: #0052cc
on-brand: #ffffff
accent (highlight): #fef08a
brand-soft: #e6f0ff
text-muted: #525252
border: #e5e5e5
surface: #fafafa
```
### Example Component Prompts
1. "Create a hero in the Buttondown style: pure white `#ffffff` background, Auto Pro headline at 96px / 900 weight in `#000000` with `-0.03em` tracking, one key phrase swept in soft-yellow `#fef08a` highlight, supporting copy at Auto Pro 18px / 400 in `#000000`, and a primary full-pill CTA (`#0069ff` background, `#ffffff` text at Auto Pro 600 / 16px, `12px 24px` padding, `9999px` radius)."
2. "Design a feature card in the Buttondown style: `#ffffff` background, `1px solid #e5e5e5` border, 12px radius, 24px padding, whisper shadow (`rgba(0,0,0,0.04) 0 1px 3px`), Auto Pro 700 / 24px H3 title in `#000000`, body at Auto Pro 400 / 16px. Hover: border → `#d4d4d4`, `translateY(-1px)`."
3. "Render a newsletter-signup form in the Buttondown style: pill-shaped input at `9999px` radius with `1px solid #e5e5e5` border and white fill, Auto Pro 400 / 16px with placeholder `#a3a3a3`, paired with a `#0069ff` full-pill submit button (`#ffffff` text, Auto Pro 600 / 16px). Focus ring on the input: `0 0 0 3px rgba(0,105,255,0.2)` with a `#0069ff` border."
4. "Create a callout block in the Buttondown style: pale-yellow `#fefce8` background, `1px solid #e5e5e5` border, 12px radius, 24px padding, Auto Pro 400 / 16px body in `#000000`, with one key phrase wrapped in a `#fef08a` highlighter sweep."
5. "Design a pricing tier card in the Buttondown style: `#ffffff` background, `1px solid #e5e5e5` border, 12px radius, 24px padding, tier name at Auto Pro 700 / 20px, price at Auto Pro 900 / 56px in `#000000`, feature list at Auto Pro 400 / 16px with `#0069ff` checkmarks, and a primary blue full-pill CTA at the bottom."
6. "Build a top navigation bar in the Buttondown style: white `#ffffff` background with a `1px solid #e5e5e5` bottom border on scroll, 64px height, Auto Pro 800 / 20px wordmark in `#000000`, nav items at Auto Pro 600 / 14px in `#000000` with `#fafafa` ghost hover, and a `#0069ff` full-pill CTA pinned to the top right."
### Iteration Guide
1. **Start with the constraint**: confirm white canvas, black body, and exactly one blue accent. If a second brand hue has crept in, remove it — the discipline is the brand.
2. **Verify the type weight**: hero headlines should hit 96px at 900 weight with about `-0.03em` tracking. If the headline reads merely competent, bump the weight to 900 and tighten the track.
3. **Place the highlight surgically**: the `#fef08a` sweep belongs under one or two key phrases, inline in running text. If it has become a fill or a band, you've drifted toward beehiiv.
4. **Check the CTA shape**: the primary action should be a full-pill (`9999px`) blue button. Rectangular or lightly-rounded buttons read as secondary.
5. **Audit the contrast**: keep blue at exactly `#0069ff` with full white pill text (4.7:1, just above AA). Lightening either side fails the threshold. Black-on-yellow and black-on-white are both fine.
6. **Keep elevation flat**: cards should use a 1px `#e5e5e5` border with at most a whisper shadow. If you see a soft drop shadow on a card, replace it with the hairline border.
7. **Mind the calm**: the layout stays on one white canvas with ~96px section rhythm — no color bands, no broadsheet 120px+ inflation. Cadence comes from heavy headers and the repeating blue CTA.
8. **Match the voice**: copy should be first-person, opinionated, and plainspoken ("newsletter software for people like you"). If it reads like enterprise marketing, rewrite it toward the maker register.
---
*Theme-toggle audit: score=2, signals=[tailwind-dark-class] — product app has dark mode; marketing surface is light-only.*
1. Visual Theme & Atmosphere
Buttondown’s site looks like software made by one opinionated person who cares about typography — which is exactly what it is. The canvas is pure white #ffffff, the body is plain black #000000, and the entire brand identity rides on a single electric blue #0069ff. There is no second hue, no gradient field, no atmospheric wash. The restraint is deliberate: by spending the whole color budget on one confident blue, the page reads as intentional rather than under-designed.
The loudest element on the page is the type. The hero headline is set in Auto Pro at 96px / 900 weight — heavier than almost any newsletter competitor, and heavier than the 700–800 weights you see on Substack, Ghost, or Kit. That 900-weight display register is the personality. It compresses the headline into a dense, declarative block that reads like a manifesto rather than a marketing banner, and it lets the page get away with almost no other decoration. When type is this confident, you don’t need illustration to carry the mood.
The one piece of warmth in the system is the soft-yellow highlight #fef08a, swept under key phrases the way someone marks up a printed newsletter with a highlighter pen. It’s the same yellow as Tailwind’s yellow-200, and Buttondown uses it sparingly — never as a fill, never as a band, only as a thin sweep behind a word or two of black text. That single gesture does enormous work: it signals “personal, handmade, paper-adjacent” in a way the electric blue cannot, and it pulls the otherwise clinical white-and-blue palette back toward the human.
The primary action is a full-pill blue button — 9999px radius, white text, opinionated copy. The canonical CTA reads “Join your last newsletter,” which is both a tagline and a button at once. That blending of voice and action is the whole product in miniature: opinionated software that tells you what it thinks, in a button you actually click. Everywhere else the radius ladder is moderate (cards at 12px, inputs at 8px), so the full-pill CTA stands out as the single most-rounded element on the page — the action pressure-point.
The atmosphere is calm-confident. There’s generous white space around the hero (96px+ vertical padding), quiet hairline cards with a 1px #e5e5e5 border and at most a whisper of shadow, and abrupt-but-gentle section transitions on the same white canvas. Where beehiiv cycles aggressively between yellow and black bands for tabloid impact, Buttondown stays on white and lets the heavy type and the single blue accent carry the entire visual load. The result feels less like a SaaS funnel and more like a well-set personal website that happens to sell software.
Key Characteristics
- Pure white
#ffffffcanvas with plain black#000000body — zero warmth in the neutrals - A single brand accent: electric blue
#0069ff(rgb 0,105,255) does all the work, no second hue - Auto Pro display at 96px / 900 weight — heavier than nearly every newsletter peer
- Soft-yellow
#fef08ahighlighter sweep under key phrases — the one note of warmth - Full-pill (
9999px) blue CTA with opinionated copy (“Join your last newsletter”) - Moderate radius ladder (cards 12px, inputs 8px) against the full-pill action
- Quiet hairline cards: 1px
#e5e5e5border, whisper shadow at most - Generous hero white space (96px+ vertical) — calm, not crowded
- Type-forward identity: the headline carries personality, not illustration
- Indie / maker register — opinionated defaults, single-author software energy
2. Color Palette & Roles
Primary (Canvas & Text)
- bg (
#ffffff): the primary marketing canvas; full pure white, no warmth — sourced live from the productionbodybackground. - text (
#000000): plain black body and headlines; no opacity tilt — sourced live from productionbodyandh1color. - text-strong (
#000000): display headlines hold pure black at all weights.
Brand
- brand (
#0069ff): the electric blue (rgb 0,105,255) — the single accent that carries the brand; sourced live from the primary CTA background. - brand-hover (
#0052cc): blue pressed one step darker for hover. - brand-active (
#0043a8): deepest pressed blue for active / focus-fill. - brand-soft (
#e6f0ff): palest blue tint for selection backgrounds, badges, and info washes. - on-brand (
#ffffff): white text on the blue pill — sourced live from the CTA text color.
Accent (Highlight)
- accent (
#fef08a): the soft-yellow highlighter sweep behind key phrases — sourced live from the highlighted-name span on production. Used only as a thin text highlight, never a fill or band. - accent-soft (
#fefce8): palest yellow wash for callout-card backgrounds. - highlight (
#fef08a): alias ofaccentfor the text-highlight role.
Interactive
- link (
#0069ff): inline links take the brand blue, underlined on hover. - link-hover (
#0052cc): pressed link blue. - selected:
brand-soft(#e6f0ff) fill with#000000text. - focus-ring:
0 0 0 3px rgba(0,105,255,0.2)with a#0069ffborder. - disabled:
text-faint(#a3a3a3) onsurface(#fafafa).
Neutral Scale
- text-muted (
#525252): captions, meta, secondary copy — 7.8:1 on white (AAA). - text-soft (
#737373): tertiary text — timestamps, micro-copy. - text-faint (
#a3a3a3): disabled state, placeholder text. - The system keeps neutrals cool-grey and shallow; it never reaches for warm taupe or a deep charcoal-as-brand.
Surface & Borders
- surface (
#fafafa): near-white nested card panel. - surface-2 (
#f4f4f5): second-tier neutral, table rows. - surface-3 (
#e9e9eb): third-tier neutral, divider areas. - border (
#e5e5e5): the canonical 1px hairline divider and input border. - border-strong (
#d4d4d4): heavier divider on hover / outlined buttons.
Shadow Colors
- whisper (
rgba(0,0,0,0.04) 0 1px 3px): the only ambient shadow — barely perceptible, used on cards. - raised (
rgba(0,0,0,0.08) 0 4px 12px): dropdowns and popovers. - overlay (
rgba(0,0,0,0.12) 0 12px 32px): modal dialogs.
Note: Buttondown leans on the 1px hairline border far more than on shadow. Where Stripe builds a soft elevation language, Buttondown keeps shadows to a whisper — the border is the primary edge, the shadow is an afterthought.
Semantic
- success (
#15803d) on success-bg (#dcfce7): editorial green. - warning (
#b45309) on warning-bg (#fef3c7): warm amber — the system reaches for amber rather than the brand yellow so the highlight role stays unambiguous. - danger (
#dc2626) on danger-bg (#fee2e2): brick red. - info (
#0069ff) on info-bg (#e6f0ff): info reuses the brand blue rather than introducing a separate info hue.
3. Typography Rules
Font Family
- Display:
"Auto Pro"(a contemporary neo-grotesk) → system-ui → -apple-system → BlinkMacSystemFont → Segoe UI → Helvetica → Arial → sans-serif. - Body:
"Auto Pro"(the same family carries both roles) → system-ui → -apple-system → BlinkMacSystemFont → Segoe UI → Helvetica → Arial → sans-serif. - Mono companion: ui-monospace → SFMono-Regular → SF Mono → Menlo → Consolas → Liberation Mono → monospace.
- OpenType features:
kernandligaon display and body. No tabular-figure or stylistic-set affectation — the personality comes from weight, not feature switches.
Buttondown runs a single typeface across the whole page. Display and body are both Auto Pro; the contrast comes entirely from weight (400 body vs. 900 display) and size, not from a second family. This is a deliberately economical choice that reinforces the single-author, single-system feel.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | Auto Pro | 96 | 900 | 1.0 | -0.03em | the live hero size — heaviest weight on the page |
| display-lg | Auto Pro | 72 | 900 | 1.02 | -0.028em | secondary heroes |
| display | Auto Pro | 56 | 800 | 1.05 | -0.024em | feature-band heads |
| h1 | Auto Pro | 44 | 800 | 1.1 | -0.02em | page / section heads |
| h2 | Auto Pro | 32 | 800 | 1.15 | -0.016em | sub-section heads |
| h3 | Auto Pro | 24 | 700 | 1.25 | -0.01em | card / feature heads |
| h4 | Auto Pro | 20 | 700 | 1.3 | -0.005em | inline emphasis heads |
| h5 | Auto Pro | 17 | 700 | 1.35 | 0 | label-grade heads |
| lead | Auto Pro | 20 | 500 | 1.55 | 0 | hero subhead / intro paragraph |
| body-lg | Auto Pro | 18 | 400 | 1.6 | 0 | hero supporting copy |
| body | Auto Pro | 16 | 400 | 1.6 | 0 | default reading size (live body) |
| body-sm | Auto Pro | 14 | 400 | 1.5 | 0 | secondary copy |
| label | Auto Pro | 13 | 600 | 1.4 | 0.01em | eyebrow, form labels |
| caption | Auto Pro | 12 | 500 | 1.4 | 0.02em | image / chart caption |
| code-inline | mono | 14 | 400 | 1.5 | 0 | inline code |
| code | mono | 14 | 400 | 1.6 | 0 | code block |
Principles
- Weight is the hierarchy: the page jumps from 400 body straight to 900 display. There is no gradual weight ramp; the contrast between plain body and heavy headline is the whole typographic system.
- 900 is the brand: the hero runs at 900, heavier than the 700–800 register most newsletter platforms use. Drop below 800 at hero scale and the page loses its declarative, manifesto character.
- Negative tracking at scale: at 96px the track tightens to
-0.03emso the heavy letterforms knit into a dense block. Without the negative tracking, 900-weight Auto Pro reads loose and loud rather than confident and compressed. - One family, two roles: Auto Pro carries both display and body. The economy is intentional — it signals single-system, maker-built software, not a multi-typeface marketing department.
- No serif, no rounded warmth: the warmth in this system comes from the yellow highlight, not the typeface. Auto Pro is a clean neo-grotesk; keep it that way and let
#fef08aadd the human note. - Generous body leading: body copy sits at 1.6 line-height for comfortable long-form reading — appropriate for a product whose users write and read newsletters all day.
- The highlight is typographic, not chromatic decoration: the
#fef08asweep behaves like a type treatment (it marks a phrase), so it appears inline within running text, never as a standalone block.
4. Component Stylings
Buttons
Primary (blue pill)
- Background:
#0069ff. Text:#ffffffat Auto Pro 600 / 16px. Padding:12px 24px. Radius: 9999px (full pill). Border: none. - Hover: background →
#0052cc, transform →translateY(-1px), 150ms standard ease. Active:translateY(0), background →#0043a8. - Use: every primary CTA — “Join your last newsletter”, “Start writing”, “Get started”. The canonical Buttondown action.
Secondary (outlined pill)
- Background:
#ffffff. Text:#000000at Auto Pro 600 / 16px. Padding:12px 24px. Radius: 9999px. Border:1px solid #d4d4d4. - Hover: background →
#fafafa, border →#a3a3a3. Use: secondary action set beside the blue primary (e.g. “See features”).
Ghost (bare text)
- Background: transparent. Text:
#000000at Auto Pro 600 / 16px. Padding:10px 16px. Radius: 8px. Border: none. - Hover: background →
#fafafa. Use: tertiary actions, nav items, low-emphasis buttons.
Link (inline blue)
- Background: transparent. Text:
#0069ffat Auto Pro 600 / 16px. No padding, no radius. - Hover: color →
#0052cc, underline appears. Use: inline text links inside running copy.
Cards
Standard (hairline)
- Background:
#ffffff. Border:1px solid #e5e5e5. Radius: 12px. Padding: 24px. Shadow:rgba(0,0,0,0.04) 0 1px 3px(whisper). - Hover: border →
#d4d4d4, transform →translateY(-1px). Use: feature cards, pricing tiers, content blocks.
Highlight card (pale-yellow callout)
- Background:
#fefce8. Text:#000000at Auto Pro 400 / 16px. Border:1px solid #e5e5e5. Radius: 12px. Padding: 24px. - Use: emphasis blocks, “good to know” callouts — the pale-yellow companion to the inline highlight.
Soft-blue card (info)
- Background:
#e6f0ff. Text:#000000. Border: none. Radius: 12px. Padding: 24px. - Use: info / tip blocks where the brand blue should register without the full saturation.
Badges, Tags, Pills
Soft-blue badge
- Background:
#e6f0ff. Text:#0043a8at Auto Pro 600 / 13px. Padding:4px 12px. Radius: 9999px. - Use: “NEW”, “BETA”, category tags, status markers.
Yellow-highlight badge
- Background:
#fef08a. Text:#000000at Auto Pro 600 / 13px. Padding:4px 12px. Radius: 9999px. - Use: rare emphasis tags (“Popular”) where the highlighter note is wanted.
Inputs / Forms
Text input
- Background:
#ffffff. Border:1px solid #e5e5e5. Radius: 8px. Padding:10px 14px. Font: Auto Pro 400 / 16px. - Focus: border →
#0069ff, ring0 0 0 3px rgba(0,105,255,0.2). Placeholder:#a3a3a3.
Newsletter signup input
- Background:
#ffffff. Border:1px solid #e5e5e5. Radius: 9999px (pill) when paired with the inline blue pill submit, or 8px when stacked. Padding:12px 18px. Font: Auto Pro 400 / 16px. - Pairs with the blue pill submit button — the brand’s signature email-capture gesture.
Navigation
Top bar
- Background:
#ffffffwith a1px solid #e5e5e5bottom border that appears on scroll. Height: 64px. - Logo: Buttondown wordmark in Auto Pro 800 / 20px in
#000000. - Nav items: Auto Pro 600 / 14px, color
#000000, hover →#fafafaghost background or underline. - Primary CTA always visible at top right (blue pill).
Tooltips, Toasts, Modals
- Tooltip: background
#000000, text#ffffffat Auto Pro 500 / 12px, radius 6px, padding6px 10px. Shadow:raised. - Toast: background
#000000, text#ffffffat Auto Pro 500 / 14px, radius 12px, padding14px 18px,raisedshadow. - Modal: background
#ffffff, border1px solid #e5e5e5, radius 16px,overlayshadow. Backdrop:rgba(0,0,0,0.4). Padding: 24px.
5. Layout Principles
Spacing System
Base unit: 4px. Scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128]. The system favours medium-large jumps for calm breathing — 24px card padding, 32–48px between stacked elements, 96px between major sections. It is looser than a dense dashboard and tighter than beehiiv’s broadsheet 120–160px; the rhythm is “personal-website calm”.
Grid & Container
- Page width: 1280px max, centred.
- Prose width: 720px for editorial blog, docs, and the newsletter-preview reading column.
- Hero treatment: hero copy claims roughly 760–900px horizontal; headline at 96px display-hero; supporting copy at body-lg below; primary blue pill CTA directly under.
- Feature grid: 3-column at 1024px+, 2-column at 640–1024px, 1-column below 640px. Card gap: 24px.
Whitespace Philosophy
Whitespace here is calm-confident, not poster-loud. The hero gets generous vertical room (96px+ top/bottom), but the system never inflates to broadsheet scale. The white canvas itself is the breathing room — because there are no competing bands or colored sections, the page feels open even at moderate padding. The single blue accent and the heavy headline are what punctuate the calm.
Section Cadence
Sections stay on the white canvas; there is no band-cycling. Cadence comes from the heavy section headers (display / h1 at 800–900 weight), the occasional pale-yellow highlight callout, and the blue CTA repeating at the foot of major sections. Transitions are gentle — a 1px hairline divider or a shift to #fafafa surface, never an abrupt color band. The page reads as one continuous document, which suits the maker-first, single-author register.
6. Shapes & Radius Scale
| Tier | Value | Use |
|---|---|---|
| none | 0px | full-bleed dividers, the yellow text-highlight sweep |
| micro | 2px | inline indicators, tiny chips |
| sm | 4px | tight UI primitives, checkboxes |
| md | 8px | inputs, ghost buttons, small surfaces |
| lg | 12px | the canonical card radius |
| xl | 16px | modals, larger feature shells |
| xxl | 24px | hero image / illustration corners |
| pill | 9999px | the canonical CTA pill and all badges |
The radius ladder is moderate-with-a-pill-spike. Most surfaces sit at 8–12px (inputs 8px, cards 12px), and then the primary CTA jumps all the way to a full pill (9999px). That gap is intentional: the pill is reserved almost exclusively for the action, so the most-rounded element on the page is always the thing you’re meant to click. Badges share the pill shape, reinforcing “pill = interactive / status” as a visual rule.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 | flat, on #ffffff or #fafafa | body content, default surfaces |
| 1 | 1px solid #e5e5e5 border + whisper shadow (rgba(0,0,0,0.04) 0 1px 3px) | the canonical card |
| 2 | 1px solid #d4d4d4 + translateY(-1px) on hover | hovered card |
| 3 | rgba(0,0,0,0.08) 0 4px 12px shadow | dropdowns, popovers, tooltips |
| 4 | rgba(0,0,0,0.12) 0 12px 32px + backdrop | modal dialog |
| 5 | full-pill blue button translateY(-1px) on hover | the elevated primary action |
Shadow Philosophy: Buttondown treats elevation as mostly a border problem, not a shadow problem. The 1px #e5e5e5 hairline does the visual separation; the whisper shadow underneath is so faint it reads almost as a border softening rather than true depth. Real shadow appears only on genuinely floating chrome — dropdowns, popovers, modals — where the element must lift off the page. This keeps the marketing surface flat and document-like, in contrast to Stripe’s richer soft-shadow elevation language. The blue CTA’s translateY(-1px) hover is the most expressive depth gesture on the page, and even that is restrained.
8. Interaction & Motion
Easing
- standard:
cubic-bezier(0.4, 0, 0.2, 1)— workhorse Material-style ease for hovers and color shifts. - emphasized:
cubic-bezier(0.2, 0, 0, 1)— sharper accel/decel for the CTA press and dropdown open. - decelerate:
cubic-bezier(0, 0, 0.2, 1)— for elements entering from off-canvas.
Durations
- instant (80ms): hover background color shifts on ghost buttons and nav items.
- fast (150ms): card hover lift, blue-pill hover, link underline appearance.
- standard (240ms): primary CTA press, dropdown open, input focus-ring fade.
- slow (320ms): modal open, page-section reveal.
Per-component micro-states
- Blue-pill CTA hover: background →
#0052cc,translateY(-1px), 150ms standard ease. Active:translateY(0), background →#0043a8. - Card hover: border →
#d4d4d4,translateY(-1px)over 150ms; the whisper shadow stays constant. - Link hover: color →
#0052cc, underline grows in at 150ms. - Input focus: blue ring
0 0 0 3px rgba(0,105,255,0.2)fades in at 240ms; border switches to#0069ff. - Highlight reveal: where the
#fef08asweep animates on scroll, it wipes left-to-right over 320ms decelerate (the highlighter-stroke effect), and renders instantly under reduced-motion.
Page transitions
Buttondown uses opacity-only fades at ~200ms between marketing routes; no slide, no scale. The calm white canvas means route transitions stay quiet — the heavy type and single blue accent carry the visual interest, so motion does not need to.
Reduced-motion strategy
prefers-reduced-motion: reduce is honored: card hover lifts and CTA translateY collapse to color-only changes, the highlighter wipe renders as a static fill, and section reveals become instant. Focus rings and color-state changes are preserved — they communicate state, not decoration.
9. Accessibility & A11y
Contrast pairs (computed)
- text on bg:
#000000on#ffffff→ 21.0:1 (AAA at all sizes) — the maximum possible contrast. - on-brand on brand:
#ffffffon#0069ff→ 4.7:1 (AA for normal text and UI components; AAA for large text). The white-on-blue pill clears the 4.5:1 normal-text threshold. - text on accent:
#000000on#fef08a→ 18.05:1 (AAA) — black on the soft-yellow highlight is extremely legible. - brand link on bg:
#0069ffon#ffffff→ 4.7:1 (AA for normal text). Blue inline links pass; pair with underline for non-color affordance. - text-muted on bg:
#525252on#ffffff→ 7.81:1 (AAA at body sizes). - brand-active on brand-soft:
#0043a8on#e6f0ff(badge) → ~7:1 (AAA at badge sizes).
Note: because white-on-blue lands at 4.7:1 (just above the 4.5:1 floor), keep the blue at exactly #0069ff and the pill text at full white — lightening the blue or tinting the text would drop the primary CTA below AA. For blue-on-white inline links, the underline is required as a redundant non-color cue.
Focus indicators
- Default focus ring:
3px rgba(0,105,255,0.2)ring with a#0069ff1–2px border, visible on every neutral surface. - On the blue pill: focus shows a
#ffffffinner ring plus the offset blue glow for contrast against the saturated background. - Focus rings are never removed; they are color-adaptive but always present.
ARIA patterns
- Pricing toggles use
role="radiogroup"rather than tabs. - Newsletter-signup input uses
aria-describedbyto associate the field with helper text. - Modals use
role="dialog",aria-modal="true", focus trap, andEscto close. - The yellow highlight is purely presentational — it carries no semantics and is not announced by screen readers (it wraps existing text, no
aria-labelneeded).
Keyboard nav order
Top bar → hero CTA → feature sections in DOM order → pricing → footer. A skip-to-content link sits at the top of the DOM, visible on focus. Tab order matches visual order throughout the single-canvas layout.
Screen reader hints
- Icon-only buttons carry an
aria-labeldescribing the action. - Decorative dividers and the highlighter sweep carry no announced content.
- Form fields pair
<label>elements with inputs; placeholder text is never the only label.
Reduced motion
Honored throughout — see §8.
10. Responsive Behavior
Breakpoints
| Tier | Width | Behavior |
|---|---|---|
| mobile | < 640px | single column, 16px gutter, 48–64px section padding, hero at 40–48px |
| tablet | 640–1024px | 2-column feature grids, 24px gutter, 64px section padding, hero at 56–64px |
| desktop | 1024–1280px | 3-column feature grids, 24px gutter, 96px section padding, hero at 72–96px |
| wide | 1280px+ | container caps at 1280px, hero at full 96px display-hero |
Touch Targets
Minimum 44×44px on touch devices. The 12px / 24px button padding clears the threshold. The blue pill CTA on mobile expands to 14px / 28px for a thumb-friendly tap area, and full-width pill CTAs are common on the narrowest breakpoint.
Collapsing strategy
- Top nav: hamburger menu < 768px; the blue pill CTA stays visible at top right.
- Hero: headline scales down from 96px → 40–48px; supporting copy claims full width; any illustration moves below the copy.
- Feature grid: 3 → 2 → 1 columns at 1024 / 640.
- Pricing tiers: stack vertically < 768px with the recommended tier ordered to the top.
- Footer: multi-column → 2-column → 1-column at 1024 / 640.
Image behavior
Hero illustrations and newsletter mockups use a fixed aspect-ratio lock with object-fit: contain so the product UI never crops awkwardly. Below 640px the mockup fills container width with its aspect ratio maintained.
Container queries
Used inside the newsletter-preview and dashboard mockups — the preview component switches between condensed and expanded reading layouts based on container width rather than viewport width.
11. Content & Voice
Tone
Buttondown’s tone is opinionated-indie: first-person, plainspoken, and unafraid to have a point of view. It writes like a maker talking to other makers — “newsletter software for people like you” — rather than a marketing department talking to a funnel. Headlines are confident and slightly wry; the canonical CTA, “Join your last newsletter,” is half-tagline, half-button, and entirely in character. The copy assumes the reader is smart and skips the hard-sell.
Microcopy patterns
- Button verbs: “Start writing”, “Join your last newsletter”, “Get started”, “See pricing”, “Read the docs”. Action-forward but never breathless; no exclamation-point hype.
- Error messages: pattern is “[What happened]. [What to do].” e.g. “That email is already subscribed. Try signing in instead.”
- Success confirmations: short and human. “Sent. Your subscribers have it now.” rather than a generic success banner.
Empty states
Empty states are warm and instructional, framing the absence as a starting point. “No subscribers yet — share your signup page” with a copy-link button as the primary action. “Nothing scheduled. Write your first issue whenever you’re ready.” The voice never scolds; it nudges.
CTA verb conventions
- Primary marketing CTA: “Join your last newsletter” or “Start writing” — opinionated, on-brand phrasing.
- Secondary: “See pricing”, “Read the docs”, “See features”.
- Newsletter signup: “Subscribe” — plain, often with a subscriber count nearby for social proof.
- Sales / contact: “Talk to us” rather than “Talk to sales” — the indie register avoids enterprise vocabulary.
12. Dark Mode & Theming
Buttondown’s marketing surface is light-only — there is no dark variant on the production landing page, and the system does not follow prefers-color-scheme: dark. The white canvas is integral to the identity: the highlighter-on-paper metaphor and the electric-blue-on-white contrast only read correctly on a white ground.
The product application (the dashboard where users write and send newsletters) does offer a separate dark theme controlled by user preference, but it is a distinct system from the marketing site and is not described by these marketing tokens. If you build a dark variant of a Buttondown-styled component, preserve these rules:
- Keep the blue near
#0069ff(it may lift slightly, e.g.#3b82f6, for legibility on a dark ground, but it stays in the same electric-blue family). - The
#fef08ahighlight either drops opacity to ~18% as a wash or is replaced by a subtler underline on dark — full-saturation yellow on black drifts toward beehiiv’s territory and breaks the calm register. - Body text inverts to
#ffffff/#e5e5e5; surfaces step through#0a0a0a→#1a1a1a; the 1px hairline border becomes a#262626ring. - The flat, shadow-light elevation doctrine carries over — depth stays understated.
For the marketing surface specifically: do not add a dark mode. Light-only is the correct, intentional state.
13. Lineage & Influences
Buttondown’s visual lineage runs through three traditions: Swiss / International-Typographic restraint, the indie-web “small software” movement, and the everyday warmth of marking up paper with a highlighter. From the Swiss grid it inherits the discipline of a minimal palette and type-as-system — one accent color, a strict grid, and headlines doing the structural work that decoration does elsewhere. The single electric blue against pure white is a direct descendant of that “one signal color on white” philosophy, the same logic that runs through Müller-Brockmann’s poster work and, more recently, Stripe’s clean electric-blue SaaS register.
The indie-web influence is the personality. Buttondown is software with a maker’s voice — opinionated defaults, plainspoken copy, a CTA that doubles as a tagline. That register descends from the small-software / one-person-product culture of the indie web, where the product’s point of view is a feature, not a liability. It is positioned deliberately against Substack’s larger, more literary-corporate framing: where Substack is a platform, Buttondown is a tool made by someone who uses it.
The third note — the soft-yellow #fef08a highlight — is the human warmth, and it is a literal quotation. It’s the color of a highlighter pen on a printed page, and it’s also Tailwind’s yellow-200, signaling the utility-CSS vocabulary the site is built from. That single gesture pulls the otherwise clinical blue-and-white palette back toward the personal and the handmade, which is exactly the brand promise: real software for real people who write newsletters.
Named influences
- Josef Müller-Brockmann (wikipedia.org) — Swiss grid discipline: restraint, a single accent, type-as-system.
- Substack (substack.com) — the direct rival Buttondown positions against as the indie, maker-first alternative.
- Stripe (stripe.com) — the clean electric-blue-on-white SaaS register Buttondown adapts and simplifies.
- Pangram Pangram (pangrampangram.com) — contemporary grotesk display lineage; Auto Pro sits in this neo-grotesk family.
- Tailwind CSS (tailwindcss.com) — the
#fef08ahighlight is Tailwind’syellow-200; the utility-CSS color vocabulary the site draws from.
14. Do’s and Don’ts
Do
- Keep the canvas pure white
#ffffffand the body plain black#000000— the contrast is the foundation, and it scores a perfect 21:1. - Spend the entire color budget on one electric blue
#0069ff; resist adding a second brand hue. - Run hero headlines in Auto Pro at 900 weight; the heavy display register is the personality.
- Tighten tracking to about
-0.03emat 96px so the heavy letterforms knit into a confident block. - Use the
#fef08ahighlight as a thin inline sweep under key phrases — like a highlighter on paper, never as a fill or band. - Make the primary CTA a full-pill (
9999px) blue button; reserve the pill shape for actions and badges. - Keep cards quiet: 1px
#e5e5e5border, 12px radius, a whisper shadow at most. - Use black on the yellow highlight (18:1) and white on the blue pill (4.7:1) — both clear their thresholds.
- Write opinionated, plainspoken copy in the first person; let the CTA carry voice (“Join your last newsletter”).
- Keep the layout on a single white canvas; cadence comes from heavy headers and the repeating blue CTA, not color bands.
Don’t
- Don’t introduce a second accent hue; the system is white + black + one blue, and the yellow is a highlight role, not a brand color.
- Don’t drop the display weight below 800 at hero scale; below that the page loses its declarative voice.
- Don’t lighten the blue below
#0069ffor tint the pill text — white-on-blue is at 4.7:1 and any drift fails AA. - Don’t turn the
#fef08ayellow into a fill, a band, or a button background; it is a thin text-highlight sweep only. - Don’t add a dark mode to the marketing surface; light-only is the intentional, correct state.
- Don’t pile on shadows — the 1px hairline border carries elevation; reserve real shadow for floating chrome.
- Don’t make every button a pill; the pill is reserved for the primary action and badges, so it stays meaningful.
- Don’t use color alone for links; pair the blue with an underline for a non-color affordance.
- Don’t inflate spacing to broadsheet scale (120px+); the rhythm is personal-website calm, around 96px sections.
- Don’t switch to a second typeface for body; Auto Pro carries both display and body — the single family is the system.
15. Agent Prompt Guide
Quick Color Reference
bg: #ffffff
text: #000000
brand: #0069ff
brand-hover: #0052cc
on-brand: #ffffff
accent (highlight): #fef08a
brand-soft: #e6f0ff
text-muted: #525252
border: #e5e5e5
surface: #fafafa
Example Component Prompts
-
“Create a hero in the Buttondown style: pure white
#ffffffbackground, Auto Pro headline at 96px / 900 weight in#000000with-0.03emtracking, one key phrase swept in soft-yellow#fef08ahighlight, supporting copy at Auto Pro 18px / 400 in#000000, and a primary full-pill CTA (#0069ffbackground,#fffffftext at Auto Pro 600 / 16px,12px 24pxpadding,9999pxradius).” -
“Design a feature card in the Buttondown style:
#ffffffbackground,1px solid #e5e5e5border, 12px radius, 24px padding, whisper shadow (rgba(0,0,0,0.04) 0 1px 3px), Auto Pro 700 / 24px H3 title in#000000, body at Auto Pro 400 / 16px. Hover: border →#d4d4d4,translateY(-1px).” -
“Render a newsletter-signup form in the Buttondown style: pill-shaped input at
9999pxradius with1px solid #e5e5e5border and white fill, Auto Pro 400 / 16px with placeholder#a3a3a3, paired with a#0069fffull-pill submit button (#fffffftext, Auto Pro 600 / 16px). Focus ring on the input:0 0 0 3px rgba(0,105,255,0.2)with a#0069ffborder.” -
“Create a callout block in the Buttondown style: pale-yellow
#fefce8background,1px solid #e5e5e5border, 12px radius, 24px padding, Auto Pro 400 / 16px body in#000000, with one key phrase wrapped in a#fef08ahighlighter sweep.” -
“Design a pricing tier card in the Buttondown style:
#ffffffbackground,1px solid #e5e5e5border, 12px radius, 24px padding, tier name at Auto Pro 700 / 20px, price at Auto Pro 900 / 56px in#000000, feature list at Auto Pro 400 / 16px with#0069ffcheckmarks, and a primary blue full-pill CTA at the bottom.” -
“Build a top navigation bar in the Buttondown style: white
#ffffffbackground with a1px solid #e5e5e5bottom border on scroll, 64px height, Auto Pro 800 / 20px wordmark in#000000, nav items at Auto Pro 600 / 14px in#000000with#fafafaghost hover, and a#0069fffull-pill CTA pinned to the top right.”
Iteration Guide
- Start with the constraint: confirm white canvas, black body, and exactly one blue accent. If a second brand hue has crept in, remove it — the discipline is the brand.
- Verify the type weight: hero headlines should hit 96px at 900 weight with about
-0.03emtracking. If the headline reads merely competent, bump the weight to 900 and tighten the track. - Place the highlight surgically: the
#fef08asweep belongs under one or two key phrases, inline in running text. If it has become a fill or a band, you’ve drifted toward beehiiv. - Check the CTA shape: the primary action should be a full-pill (
9999px) blue button. Rectangular or lightly-rounded buttons read as secondary. - Audit the contrast: keep blue at exactly
#0069ffwith full white pill text (4.7:1, just above AA). Lightening either side fails the threshold. Black-on-yellow and black-on-white are both fine. - Keep elevation flat: cards should use a 1px
#e5e5e5border with at most a whisper shadow. If you see a soft drop shadow on a card, replace it with the hairline border. - Mind the calm: the layout stays on one white canvas with ~96px section rhythm — no color bands, no broadsheet 120px+ inflation. Cadence comes from heavy headers and the repeating blue CTA.
- Match the voice: copy should be first-person, opinionated, and plainspoken (“newsletter software for people like you”). If it reads like enterprise marketing, rewrite it toward the maker register.
Theme-toggle audit: score=2, signals=[tailwind-dark-class] — product app has dark mode; marketing surface is light-only.
Drop buttondown into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add buttondown npx agentkit init --design buttondown