DESIGN.md inspired by Upstash
Serverless data, daylight calm — a pale-grey canvas, deep green-black type, and one electric Upstash green.
Compare to…
- bg
#f5f5f5 - bg-deep
#ffffff - bg-mute
#eef4f1 - surface
#ffffff - surface-alt
#fafafa - surface-code
#09090b - brand — · 2.3
#00bc7d - brand-hover
#00a86f - brand-pressed
#009963 - brand-soft
#00bc7d1f - on-brand
#ffffff - on-brand-ink
#022c22 - accent
#007a55 - accent-hover
#006647 - accent-soft
#065f4633 - link
#007a55 - link-hover
#006647 - selected
#00bc7d26 - disabled
#d4d4d8 - disabled-text
#a1a1aa - text AAA · 13.9
#022c22 - text-heading
#022c22 - text-muted
#71717b - text-soft
#52525b - text-faint — · 2.4
#a1a1aa - text-disabled
#a1a1aa - border — · 1.1
#e5e7eb - border-soft
#0000000f - border-strong — · 1.4
#d4d4d8 - border-brand
#00bc7d66 - shadow-ambient
rgba(2,44,34,0.06) - shadow-standard
rgba(2,44,34,0.10) - shadow-elevated
rgba(2,44,34,0.14) - shadow-glow
rgba(0,188,125,0.22) - success
#00bc7d - success-bg
#eef4f1 - warning
#d97706 - warning-bg
#fef3c7 - danger
#dc2626 - danger-bg
#fee2e2 - info
#007a55 - info-bg
#eef4f1
- step-0 4px
- step-1 8px
- step-2 12px
- step-3 16px
- step-4 24px
- step-5 32px
- step-6 48px
- step-7 64px
- step-8 96px
- step-9 128px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - featured
20px - 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 → border-brand
Upstash inverts the dev-tool default. Where Neon, Vercel, and the rest of the serverless-infrastructure cohort reach for a near-black "late night console" canvas, Upstash works in daylight: a pale-grey field (`#f5f5f5`) under deep green-black type (`#022c22`), with one electric brand green (`#00bc7d`) rationed to action. The display face — Inter Tight, set genuinely huge at a 128px hero — is the loudest gesture on a page that is otherwise calm and bright. The green-on-light pairing descends from the Supabase/Postgres green-database semantics, but Upstash pitches its emerald higher and cooler and pairs it with deep green accents (`#007a55`) rather than forest tints. The system mono on a near-black code surface (`#09090b`) is the one dark element — the page flips to console-dark only where code lives. The result reads as a serverless data workbench in full daylight: technical, legible, confident, and quietly distinct from the dark-mode field it competes in.
- Green-on-light Postgres-era semantics; Upstash adopts the green-as-data-health idea on a daylight canvas.
- Inter type system, tight headline tracking, single confident accent rationed to action.
- Zinc/gray neutral ramp, ring-offset focus tokens, oklch color variables — the utility vocabulary the site is built on.
- The huge display face — a tighter, more display-tuned Inter cut driving the 128px hero.
- The product heritage — serverless Redis as the founding service; the trademark-mark red is the only non-green hue on the hero.
- Bright, document-like developer marketing — generous whitespace, confident type, restrained palette on light.
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: Upstash
tagline: 'Serverless data, daylight calm — a pale-grey canvas, deep green-black type, and one electric Upstash green.'
updated_at: 2026-05-30T00:00:00.000Z
published_at: 2026-05-29T21:44:16.080Z
author: webdesignhot
spec: webdesignhot/0.1
source_url: https://upstash.com
quality: curated
featured: false
categories: [dev-tools]
tags: [light, sans, developer, structured, cool, bright]
preview_swatch: ['#f5f5f5', '#00bc7d', '#007a55']
related: [neon, supabase, vercel]
description: 'Upstash runs a pale-grey canvas (`#f5f5f5`) under deep green-black type (`#022c22`) and one electric brand green (`#00bc7d`, `--color-primary`) that carries every "Start for Free" CTA on a 12px-radius pill. A deep-green accent (`#007a55`, `--color-primary-text`) handles links and emphasis; zinc-grey (`#71717b`) carries muted copy. The display face is Inter Tight, set huge — a 128px hero h1 at 700 — over Inter body, with system-mono for code. The mood is serverless infrastructure rendered as a bright, technical, daylight workbench rather than the late-night console its peers favour.'
# 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
ring: border-brand
colors:
# Primary
bg: '#f5f5f5' # pale-grey daylight canvas (oklch 0.97 0 0)
bg-deep: '#ffffff' # full-white hero band, footer cards
bg-mute: '#eef4f1' # 8% emerald wash (rgba(4,120,87,0.08)) — tinted strips
surface: '#ffffff' # card surface — white on the grey canvas
surface-alt: '#fafafa' # secondary panel
surface-code: '#09090b' # near-black code/pre surface (--color-pre-bg)
# Brand & Action
brand: '#00bc7d' # electric Upstash green (oklch 0.696 0.17 162.48, --color-primary)
brand-hover: '#00a86f' # hover variant (slightly deeper)
brand-pressed: '#009963' # active/pressed state
brand-soft: '#00bc7d1f' # 12% green wash — hover backgrounds, halos
on-brand: '#ffffff' # white text on green fill (as shipped on CTAs)
on-brand-ink: '#022c22' # deep green-black alt for AA-grade text on green
# Accent
accent: '#007a55' # deep-green accent (oklch 0.508 0.118 165.612, --color-primary-text)
accent-hover: '#006647' # link/accent hover, deeper
accent-soft: '#065f4633' # 20% deep-green wash (rgba(6,95,70,0.2)) — Documentation CTA fill
# Interactive
link: '#007a55' # deep-green inline links
link-hover: '#006647' # link hover
selected: '#00bc7d26' # 15% green selection wash
disabled: '#d4d4d8' # disabled control fill (zinc-300)
disabled-text: '#a1a1aa' # disabled text (zinc-400)
# Neutral Scale (heading → faint)
text: '#022c22' # primary copy — deep green-black (--color-text)
text-heading: '#022c22' # headlines share the deep green-black
text-muted: '#71717b' # secondary copy (oklch 0.552 0.016 285.938, zinc-500)
text-soft: '#52525b' # tertiary, captions (zinc-600)
text-faint: '#a1a1aa' # quaternary, placeholders (zinc-400)
text-disabled: '#a1a1aa' # disabled state copy
# Surface & Borders
border: '#e5e7eb' # solid hairline (gray-200)
border-soft: '#0000000f' # ~6% black translucent for low-emphasis dividers
border-strong: '#d4d4d8' # emphasized border on hover/focus (zinc-300)
border-brand: '#00bc7d66' # 40% green border on focus
# Shadow
shadow-ambient: 'rgba(2,44,34,0.06)' # low ambient — green-black tinted, not pure black
shadow-standard: 'rgba(2,44,34,0.10)' # standard card shadow (--tw-shadow-color)
shadow-elevated: 'rgba(2,44,34,0.14)' # popover / modal
shadow-glow: 'rgba(0,188,125,0.22)' # green glow on focus
# Semantic
success: '#00bc7d' # success uses brand green
success-bg: '#eef4f1' # success surface (emerald wash)
warning: '#d97706' # amber warning (amber-600)
warning-bg: '#fef3c7' # warning surface (amber-100)
danger: '#dc2626' # danger red (red-600) — also the trademark-mark red
danger-bg: '#fee2e2' # danger surface (red-100)
info: '#007a55' # info uses deep-green accent
info-bg: '#eef4f1' # info surface
typography:
display:
family: '"Inter Tight", Inter, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif'
weights: [500, 600, 700]
opentype-features: ['cv11', 'ss01']
body:
family: 'Inter, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif'
weights: [400, 500, 600]
opentype-features: ['cv11']
mono:
family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace'
weights: [400, 500]
opentype-features: ['zero']
scale:
display-hero: { size: 128, weight: 700, lineHeight: 1.0, tracking: '-0.035em', family: display, opentype: 'cv11' }
display-large: { size: 80, weight: 700, lineHeight: 1.02, tracking: '-0.03em', family: display, opentype: 'cv11' }
h1: { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.025em', family: display }
h2: { size: 40, weight: 700, lineHeight: 1.1, tracking: '-0.02em', family: display }
h3: { size: 32, weight: 600, lineHeight: 1.15, tracking: '-0.015em', family: display }
h4: { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
h5: { size: 20, weight: 600, lineHeight: 1.3, tracking: '0', family: body }
body-large: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-small: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
lead-muted: { size: 24, weight: 400, lineHeight: 1.4, tracking: '-0.005em', family: body }
label: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0', family: body }
button: { size: 15, weight: 500, lineHeight: 1.0, tracking: '-0.005em', family: body }
button-small: { size: 13, weight: 500, lineHeight: 1.0, tracking: '0', family: body }
link: { size: 16, weight: 500, lineHeight: 1.5, tracking: '0', family: body }
caption: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
micro: { size: 11, weight: 500, lineHeight: 1.3, tracking: '0.04em', family: body }
code-body: { size: 13, weight: 400, lineHeight: 1.6, tracking: '0', family: mono, opentype: 'zero' }
code-label: { size: 11, weight: 500, lineHeight: 1.3, tracking: '0.05em', family: mono, opentype: 'zero' }
radius:
micro: 2
sm: 4
md: 8
lg: 12 # button / CTA + card
xl: 16 # tab caps, feature shells
featured: 20 # signature feature panels
pill: 9999
spacing:
base: 4
scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128]
xxs: 4
xs: 8
sm: 12
md: 16
lg: 24
xl: 32
xxl: 48
section-sm: 64
section: 96
section-lg: 128
layout:
page-width: 1280
prose-width: 720
header-height: 64
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-fast: 150
duration-standard: 240
duration-slow: 320
reduced-motion: 'respects prefers-reduced-motion: reduce — transitions reduce to opacity-only fades, green-glow pulses and lift transforms disabled.'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
ambient: 'rgba(2,44,34,0.06) 0 1px 2px'
standard: 'rgba(2,44,34,0.10) 0 8px 16px -4px'
elevated: 'rgba(2,44,34,0.14) 0 20px 40px -8px, rgba(2,44,34,0.08) 0 8px 16px -8px'
deep: 'rgba(2,44,34,0.18) 0 32px 64px -16px'
ring: '0 0 0 2px #00bc7d'
glow: '0 0 24px rgba(0,188,125,0.22)'
accessibility:
contrast-text-on-bg: 13.9 # AAA — deep green-black on pale grey
contrast-text-on-surface: 15.15 # AAA — deep green-black on white
contrast-white-on-brand: 2.47 # FAILS AA — white on green as shipped; large/bold-only
contrast-ink-on-brand: 6.13 # AA — deep green-black on green (recommended swap)
contrast-accent-on-bg: 4.92 # AA — deep-green accent on pale grey
contrast-muted-on-bg: 4.43 # AA — zinc-500 on pale grey
focus-ring: '2px solid #00bc7d, offset 2px'
reduced-motion-honored: true
keyboard-nav: 'standard tab order; green focus ring on all interactive controls'
components:
button-primary:
bg: '#00bc7d'
text: '#ffffff'
padding: '10px 16px'
radius: 12
font: 'button (15/500)'
border: 'none'
hover: 'bg → #00a86f; subtle lift translateY(-1px)'
active: 'bg → #009963'
use: 'primary CTA — Start for Free, Get Started, Sign Up'
button-accent-soft:
bg: 'rgba(6,95,70,0.2)'
text: '#007a55'
padding: '10px 16px'
radius: 12
font: 'button (15/500)'
border: 'none'
hover: 'bg → rgba(6,95,70,0.28)'
use: 'secondary action on brand strips — Documentation, Read Docs'
button-ghost:
bg: 'transparent'
text: '#022c22'
padding: '10px 16px'
radius: 12
font: 'button (15/500)'
border: '1px solid #e5e7eb'
hover: 'border → #d4d4d8; bg → rgba(2,44,34,0.03)'
use: 'tertiary action — Sign in, Contact, Pricing'
button-danger:
bg: 'transparent'
text: '#dc2626'
padding: '10px 16px'
radius: 12
border: '1px solid rgba(220,38,38,0.35)'
hover: 'bg → rgba(220,38,38,0.06)'
use: 'destructive action — Delete database, Remove key'
card:
bg: '#ffffff'
text: '#022c22'
padding: '24px'
radius: 12
border: '1px solid #e5e7eb'
shadow: 'rgba(2,44,34,0.06) 0 1px 2px'
use: 'feature card, pricing tier, product tile'
card-tinted:
bg: '#eef4f1'
text: '#022c22'
padding: '24px'
radius: 12
border: 'none'
use: 'emerald-washed feature panel — section emphasis'
input:
bg: '#ffffff'
text: '#022c22'
placeholder: '#a1a1aa'
padding: '8px 12px'
radius: 8
border: '1px solid #e5e7eb'
focus: 'border → #00bc7d; ring 0 0 0 2px rgba(0,188,125,0.3)'
use: 'text input, search, connection-string field'
badge:
bg: '#eef4f1'
text: '#007a55'
padding: '2px 10px'
radius: 9999
font: 'micro (11/500)'
use: 'status pill — Serverless, Beta, region label'
tab:
bg: '#ffffff'
text: '#022c22'
radius: '16px 16px 0 0'
inactive: 'bg #f5f5f5, text #71717b'
use: 'product tabs — Redis, Vector, Workflow, QStash'
nav-link:
bg: 'transparent'
text: '#52525b'
padding: '8px 12px'
font: 'body-small (14/500)'
hover: 'text → #022c22'
active: 'text → #007a55'
use: 'top nav, sidebar nav'
lineage:
summary: |
Upstash inverts the dev-tool default. Where Neon, Vercel, and the rest
of the serverless-infrastructure cohort reach for a near-black "late
night console" canvas, Upstash works in daylight: a pale-grey field
(`#f5f5f5`) under deep green-black type (`#022c22`), with one electric
brand green (`#00bc7d`) rationed to action. The display face — Inter
Tight, set genuinely huge at a 128px hero — is the loudest gesture on a
page that is otherwise calm and bright. The green-on-light pairing
descends from the Supabase/Postgres green-database semantics, but
Upstash pitches its emerald higher and cooler and pairs it with deep
green accents (`#007a55`) rather than forest tints. The system mono on a
near-black code surface (`#09090b`) is the one dark element — the page
flips to console-dark only where code lives. The result reads as a
serverless data workbench in full daylight: technical, legible,
confident, and quietly distinct from the dark-mode field it competes in.
influences:
- name: 'Supabase'
role: 'Green-on-light Postgres-era semantics; Upstash adopts the green-as-data-health idea on a daylight canvas.'
url: https://supabase.com
- name: 'Vercel'
role: 'Inter type system, tight headline tracking, single confident accent rationed to action.'
url: https://vercel.com
- name: 'Tailwind CSS'
role: 'Zinc/gray neutral ramp, ring-offset focus tokens, oklch color variables — the utility vocabulary the site is built on.'
url: https://tailwindcss.com
- name: 'Inter Tight'
role: 'The huge display face — a tighter, more display-tuned Inter cut driving the 128px hero.'
url: https://rsms.me/inter/
- name: 'Redis'
role: 'The product heritage — serverless Redis as the founding service; the trademark-mark red is the only non-green hue on the hero.'
url: https://redis.io
- name: 'Stripe'
role: 'Bright, document-like developer marketing — generous whitespace, confident type, restrained palette on light.'
url: https://stripe.com
dark-mode: light # Upstash ships light-first; only code surfaces invert to near-black
---
## 1. Visual Theme & Atmosphere
Upstash opens on a pale-grey canvas — `#f5f5f5`, an off-white so close to
paper it reads as a daylight workbench rather than a screen. This is the
first deliberate inversion: the serverless-infrastructure cohort that
Upstash competes in (Neon, Vercel, PlanetScale, half of the modern
dev-tool field) almost universally commits to a near-black "late-night
console" canvas. Upstash refuses that convention and works in full light.
The deep green-black type (`#022c22`) sits on the grey like ink on a
technical broadsheet, and the single electric brand green (`#00bc7d`)
carries every CTA. The combination reads as **serverless data, rendered
calm and legible** — infrastructure you can read in daylight.
The loudest gesture on the page is typographic, not chromatic. The hero
h1 is set in Inter Tight at a genuinely enormous **128px / 700** — a size
that turns a single product line into architecture. Everything else is
restrained: Inter body at 16px with a comfortable 1.55 line-height, a
zinc-grey muted scale (`#71717b`) for supporting copy, and a deep-green
accent (`#007a55`) reserved for links and emphasis. The brand green never
becomes a background; it stays foregrounded on buttons, status dots, and
the occasional emphasized word. The discipline is the point — green is
action, green-black is voice, grey is structure.
The mood is **bright, technical, and confident**. There is no gradient
mesh, no glassmorphism, no AI-generated hero imagery. Depth comes from
hairline borders (`#e5e7eb`) and soft green-black-tinted shadows
(`rgba(2,44,34,0.10)`) rather than heavy elevation. Whitespace is
generous; sections breathe at 96–128px; cards sit on white surfaces that
lift a half-step off the grey canvas. The one place the page goes dark is
code — connection strings and snippets sit on a near-black `#09090b`
surface, a small console-dark island in an otherwise daylit document.
Reading top to bottom, the rhythm alternates pale-grey canvas, white
feature cards, emerald-washed tinted strips (`#eef4f1`), and near-black
code blocks. Product tabs (Redis, Vector, Workflow, QStash) cap with a
16px top radius like file folders. The green accent appears sparingly — a
"Start for Free" pill, a status badge, a deep-green link — so each
instance lands. Over-applying the green, colouring more than ~5% of any
viewport, would dilute the "this is the action" semantic that the rationed
emerald carries.
**Key Characteristics**
- Pale-grey daylight canvas (`#f5f5f5`) — a deliberate inversion of the dark-mode dev-tool default
- Deep green-black type (`#022c22`) reads as ink on a technical broadsheet
- One electric brand green (`#00bc7d`, `--color-primary`) rationed strictly to action, on a 12px-radius pill
- Deep-green accent (`#007a55`) for links and emphasis; zinc-grey (`#71717b`) for muted copy
- Inter Tight display set genuinely huge — a 128px hero h1 at 700 weight
- Inter body at 16px / 1.55 line-height; system mono for code
- Near-black code surface (`#09090b`) — the one dark island in a daylit page
- Hairline borders + soft green-black-tinted shadows, never heavy elevation
- Product tabs cap with a 16px top radius like file folders
- Trademark-mark red (`#dc2626`) is the only non-green hue, on the "Redis ®" mark
## 2. Color Palette & Roles
### Primary
- **Background** (`#f5f5f5`) [→ `--color-bg`]: page canvas, pale daylight grey (probed oklch 0.97 0 0)
- **Primary Text** (`#022c22`) [→ `--color-text`]: headlines and primary copy, deep green-black
- **Primary CTA Fill** (`#00bc7d`) [→ `--color-primary`]: electric green button background
### Brand & Action
- **Brand Green** (`#00bc7d`) [→ `--color-primary`]: the defining hue — electric emerald, the colour of a healthy serverless cluster (probed oklch 0.696 0.17 162.48)
- **Brand Hover** (`#00a86f`): slightly deeper for hover continuity
- **Brand Pressed** (`#009963`): active/pressed state
- **Brand Soft** (`#00bc7d1f`): 12% green wash for hover backgrounds and halos
- **On-Brand Text** (`#ffffff`): white text on the green fill, as shipped on CTAs (see §9 — this pair is below AA; prefer the ink alternate for small text)
- **On-Brand Ink** (`#022c22`): deep green-black alternate for AA-grade text on the green fill
### Accent
- **Deep Green** (`#007a55`) [→ `--color-primary-text`]: the accent — links, emphasis, secondary-action text (probed oklch 0.508 0.118 165.612)
- **Accent Hover** (`#006647`): deeper accent on hover
- **Accent Soft** (`#065f4633`): 20% deep-green wash — the "Documentation" secondary-CTA fill (probed rgba(6,95,70,0.2))
### Interactive
- **Link** (`#007a55`): deep-green inline and documentation links
- **Link Hover** (`#006647`): deeper green on hover
- **Selected** (`#00bc7d26`): 15% green wash for selection highlight
- **Disabled** (`#d4d4d8`): disabled control fill (zinc-300)
- **Disabled Text** (`#a1a1aa`): disabled-state copy (zinc-400)
### Neutral Scale
- **Text Heading** (`#022c22`): deep green-black for headlines
- **Text Body** (`#022c22`): same — body copy is full green-black on the pale canvas
- **Text Muted** (`#71717b`) [→ `--color-text-mute`]: secondary copy, metadata (probed oklch 0.552 0.016 285.938 — zinc-500)
- **Text Soft** (`#52525b`): tertiary copy, nav inactive (zinc-600)
- **Text Faint** (`#a1a1aa`): quaternary annotations, placeholders (zinc-400)
- **Text Disabled** (`#a1a1aa`): disabled-state copy
### Surface & Borders
- **Surface** (`#ffffff`) [→ `--color-surface` analog]: card and panel base — white, lifting a half-step off the grey canvas
- **Surface Alt** (`#fafafa`): secondary panel
- **Surface Code** (`#09090b`) [→ `--color-pre-bg`]: near-black code/pre surface — the page's one dark island
- **Bg Mute** (`#eef4f1`) [→ `--color-bg-mute`]: 8% emerald wash (probed rgba(4,120,87,0.08)) for tinted feature strips
- **Border** (`#e5e7eb`): solid hairline (gray-200)
- **Border Soft** (`#0000000f`): ~6% black translucent for low-emphasis dividers
- **Border Strong** (`#d4d4d8`): emphasized border on hover/focus (zinc-300)
- **Border Brand** (`#00bc7d66`): 40% green border on focus
### Shadow Colors
Shadows are tinted with the deep green-black (`#022c22`) at low alpha — never pure black. This keeps elevation in the same chromatic family as the type and avoids the cold grey cast pure-black shadows give on a warm-leaning grey canvas:
- **Ambient** (`rgba(2,44,34,0.06)`): low resting shadow
- **Standard** (`rgba(2,44,34,0.10)`): card hover (matches `--tw-shadow-color`)
- **Elevated** (`rgba(2,44,34,0.14)`): popover and dropdown
- **Glow** (`rgba(0,188,125,0.22)`): exception — green focus glow only
### Semantic
- **Success** (`#00bc7d`): success uses the brand green — they are the same hue
- **Success Bg** (`#eef4f1`): success surface, emerald wash
- **Warning** (`#d97706`): amber, used sparingly outside the green palette (amber-600)
- **Warning Bg** (`#fef3c7`): warning surface (amber-100)
- **Danger** (`#dc2626`): red-600 — doubles as the trademark-mark red on "Redis ®"
- **Danger Bg** (`#fee2e2`): danger surface (red-100)
- **Info** (`#007a55`): info uses the deep-green accent
- **Info Bg** (`#eef4f1`): info surface
## 3. Typography Rules
### Font Family
- **Display**: `Inter Tight` (probed `__Inter_Tight_a3c0d3`), Inter, system-ui fallback chain — a tighter, more display-tuned Inter cut
- **Body**: `Inter` (probed `__Inter_f367f3`) — same fallback chain
- **Mono**: `ui-monospace`, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace (system stack)
- **OpenType features**: `cv11` (single-storey alternates) on the Inter faces for a cleaner geometric read; `zero` (slashed zero) on the mono for connection strings and identifiers
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | OT Features | Notes |
|------|------|------|--------|-------------|----------------|-------------|-------|
| display-hero | display | 128 | 700 | 1.0 | -0.035em | cv11 | hero only — probed live, single line |
| display-large | display | 80 | 700 | 1.02 | -0.03em | cv11 | secondary hero, big section opener |
| h1 | display | 56 | 700 | 1.05 | -0.025em | — | page/section opener |
| h2 | display | 40 | 700 | 1.1 | -0.02em | — | feature heading |
| h3 | display | 32 | 600 | 1.15 | -0.015em | — | sub-feature |
| h4 | display | 24 | 600 | 1.25 | -0.005em | — | card heading |
| h5 | body | 20 | 600 | 1.3 | 0 | — | small heading, dense UI |
| body-large | body | 18 | 400 | 1.55 | 0 | — | hero supporting copy |
| body | body | 16 | 400 | 1.55 | 0 | — | default body (probed) |
| body-small | body | 14 | 400 | 1.5 | 0 | — | dense feature blocks |
| lead-muted | body | 24 | 400 | 1.4 | -0.005em | — | hero subhead in zinc-grey (probed h2-slot) |
| label | body | 13 | 500 | 1.4 | 0 | — | form labels, eyebrows |
| button | body | 15 | 500 | 1.0 | -0.005em | — | primary/ghost button |
| button-small | body | 13 | 500 | 1.0 | 0 | — | dense UI controls |
| link | body | 16 | 500 | 1.5 | 0 | — | inline link |
| caption | body | 12 | 500 | 1.4 | 0.02em | — | image captions, metadata |
| micro | body | 11 | 500 | 1.3 | 0.04em | — | badges, status pills |
| code-body | mono | 13 | 400 | 1.6 | 0 | zero | inline + block code |
| code-label | mono | 11 | 500 | 1.3 | 0.05em | zero | region/branch labels in code UI |
### Principles
- **Display is the loudest voice**: Inter Tight at 700 carries the identity. The 128px hero is the single most distinctive choice on the page — do not shrink it timidly; if it must reduce, step to 80 then 56, never to a polite 40
- **Tracking philosophy**: tight negative tracking (-0.025em to -0.035em) on display tightens the huge Inter Tight; neutral on body; slightly positive (`0.02em` to `0.05em`) on caption/micro/code-label to hold small sizes legible
- **Weight as hierarchy**: 700 for display through h2, 600 for h3–h5, 500 for buttons/labels, 400 for body. The drop from 700-display to 400-body is intentional and stark — it is what keeps the page calm under the loud hero
- **Two Inter cuts, not one**: Inter Tight for display, regular Inter for body. They share a skeleton but Inter Tight's tighter spacing reads as "headline"; never set body in Inter Tight or display in regular Inter
- **Muted subhead pattern**: the hero subhead sits at ~24px in zinc-grey (`#71717b`), not green-black — it recedes deliberately under the display line
- **Mono for code only**: system mono with slashed zero for connection strings, snippets, identifiers; never set body or UI copy in mono
- **Body line-height 1.55**: generous daylight reading rhythm; tighten to 1.5 only in dense feature blocks
- **Caption sizes ≤ 13px** rely on letter-spacing (0.02–0.05em) to stay legible at small sizes on the pale canvas
## 4. Component Stylings
### Buttons
**button-primary** — Electric green CTA
- Background: `#00bc7d`
- Text: `#ffffff` at 15/500 (as shipped; see §9 — swap to `#022c22` ink for AA at small sizes)
- Padding: 10px 16px
- Radius: 12
- Border: none
- Hover: `#00a86f`, subtle translateY(-1px) lift
- Active: `#009963`
- Focus: 2px solid `#00bc7d` ring, 2px offset
- Use: primary CTA — "Start for Free", "Get Started", "Sign Up"
**button-accent-soft** — Deep-green soft secondary
- Background: `rgba(6,95,70,0.2)` (accent-soft)
- Text: `#007a55` at 15/500
- Padding: 10px 16px
- Radius: 12
- Border: none
- Hover: bg → `rgba(6,95,70,0.28)`
- Use: secondary action on brand strips — "Documentation", "Read Docs" (probed live)
**button-ghost** — Outlined tertiary
- Background: transparent
- Text: `#022c22` at 15/500
- Padding: 10px 16px
- Radius: 12
- Border: 1px solid `#e5e7eb`
- Hover: border → `#d4d4d8`, bg → rgba(2,44,34,0.03)
- Use: "Sign in", "Pricing", "Contact" — quiet navigation actions
**button-danger** — Destructive
- Background: transparent
- Text: `#dc2626` at 15/500
- Padding: 10px 16px
- Radius: 12
- Border: 1px solid rgba(220,38,38,0.35)
- Hover: bg → rgba(220,38,38,0.06)
- Use: "Delete database", "Remove key", "Drop index"
### Cards
**card-default**
- Background: `#ffffff`
- Padding: 24px
- Radius: 12
- Border: 1px solid `#e5e7eb`
- Shadow: ambient (rgba(2,44,34,0.06) 0 1px 2px)
- Hover: border → `#d4d4d8`, shadow → standard, translateY(-2px)
- Use: feature card, pricing tier, product tile
**card-tinted** — Emerald-washed feature panel
- Background: `#eef4f1` (8% emerald wash)
- Padding: 24px
- Radius: 12
- Border: none
- Use: section-emphasis feature block — the daylight equivalent of a tinted panel
### Badges / Tags / Pills
**badge-status** — Green status pill
- Background: `#eef4f1`
- Text: `#007a55` at 11/500 micro
- Padding: 2px 10px
- Radius: pill (9999)
- Use: "Serverless", "Beta", region label
**badge-neutral** — Quiet label pill
- Background: `#ffffff`
- Text: `#71717b` at 11/500
- Padding: 2px 10px
- Radius: pill
- Border: 1px solid `#e5e7eb`
- Use: version tags, "v2", neutral metadata
### Inputs / Forms
**input-text**
- Background: `#ffffff`
- Text: `#022c22` at 15/400
- Placeholder: `#a1a1aa`
- Padding: 8px 12px
- Radius: 8
- Border: 1px solid `#e5e7eb`
- Focus: border → `#00bc7d`, ring 0 0 0 2px rgba(0,188,125,0.3)
- Use: text input, search, connection-string field
### Navigation
**nav-link**
- Background: transparent
- Text: `#52525b` at 14/500
- Padding: 8px 12px
- Hover: text → `#022c22`
- Active: text → `#007a55`
- Use: top nav, sidebar nav
**product-tab** — File-folder tab cap
- Active: bg `#ffffff`, text `#022c22`, radius `16px 16px 0 0`
- Inactive: bg `#f5f5f5`, text `#71717b`, radius `16px 16px 0 0`
- Use: product switcher — Redis, Vector, Workflow, QStash (probed live, 16px top radius)
### Decorative
**status-dot** — Live indicator
- 6–8px circle of `#00bc7d`
- Optional `0 0 12px rgba(0,188,125,0.45)` glow on live state
- Use: next to region labels, "online" indicators, healthy-cluster markers
**code-block**
- Background: `#09090b` (near-black, the page's one dark surface)
- Text: `#e4e4e7` at code-body with `zero` slashed-zero
- Padding: 16px 20px
- Radius: 12
- Inline backticks render in `#007a55` deep-green on light surfaces
- Use: connection strings, SDK snippets, CLI examples
## 5. Layout Principles
### Spacing System
- **Base unit**: 4px
- **Scale**: 4, 8, 12, 16, 24, 32, 48, 64, 96, 128
- **Density observation**: tight within cards (16–24px), generous between sections (96–128px). The page reads roomy because the grey canvas and white cards do the structural work — gaps don't need to be enormous to feel separated
### Grid & Container
- **Page width**: 1280px max
- **Prose width**: 720px (documentation, marketing body)
- **Hero treatment**: content constrained to ~1024px so the 128px display line has room to breathe without wall-to-wall sprawl
- **Feature grid**: 3-column at desktop, 2-column at tablet, 1-column at mobile
- **Header height**: 64px sticky bar
### Whitespace Philosophy
- Section rhythm: ~96–128px between major sections
- Within-section rhythm: ~24–48px between feature blocks
- The pale-grey canvas is itself negative space — white cards float on it, so whitespace and surface do double duty
- The huge hero demands clearance: leave at least 96px below the 128px display line before the next element
### Section Cadence
- Pale-grey canvas → white feature cards → emerald-washed tinted strip (`#eef4f1`) → near-black code block → footer
- Tinted strips and code blocks are the section-break devices — the canvas itself stays constant grey
- Green accent stays foreground throughout — it never anchors a section background
## 6. Shapes & Radius Scale
| Tier | Px | Use |
|------|----|----|
| Micro | 2 | inline chips, dense tags |
| Standard | 4 | small badges, dense controls |
| Comfortable | 8 | inputs, small controls |
| Relaxed | 12 | buttons / CTAs and cards — the signature radius |
| Featured | 16 | product tab caps, feature shells |
| Large | 20 | signature feature panels |
| Pill | 9999 | status pills, avatars |
The signature radius is **12px**, shared by both the green CTA pill and
cards — a slightly rounder, friendlier curve than the 8px most dev tools
use, which softens the otherwise technical page. Product tabs use a
**compound radius** (`16px 16px 0 0`) that rounds only the top corners,
reading as file-folder caps that merge into the panel below.
## 7. Depth & Elevation
| Level | Treatment | Use |
|-------|-----------|----|
| 0 (flat) | no shadow, no border | hero copy on canvas |
| 1 | 1px solid `#e5e7eb` border, no shadow | inline cards, list rows |
| 2 | 1px border + ambient shadow (0 1px 2px) | feature cards at rest |
| 3 | standard shadow (0 8px 16px -4px) | card hover, raised tile |
| 4 | elevated shadow (0 20px 40px -8px) | popover, dropdown |
| 5 | deep shadow (0 32px 64px -16px) | modal, command palette |
**Shadow Philosophy**: shadows are tinted with the deep green-black
(`rgba(2,44,34,…)`) at low alpha rather than pure black. On a warm-leaning
pale grey, pure-black shadows read cold and dirty; green-black-tinted
shadows keep elevation in the same chromatic family as the type and the
canvas. Elevation is gentle — this is a daylight page, so depth comes
mostly from hairline borders and white-on-grey surface contrast, with
shadow as a secondary cue. The only chromatic shadow is the green focus
glow (`rgba(0,188,125,0.22)`), reserved for focus rings, never for resting
elevation. Multi-layer shadows appear at level 4+ to soften edges.
## 8. Interaction & Motion
### Easing
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover, focus, fade
- **Emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — modal enter, page transitions
- **Decelerate**: `cubic-bezier(0, 0, 0.2, 1)` — tooltips, dropdowns enter
### Durations
- **Fast** (150ms): hover state changes, focus ring
- **Standard** (240ms): card lift, button press, tab switch
- **Slow** (320ms): modal enter, page transition
### Per-Component Recipes
- **Button hover**: bg colour transitions over 150ms standard ease; subtle translateY(-1px) lift on the green CTA
- **Card hover**: border lifts from `#e5e7eb` → `#d4d4d8`, shadow intensifies ambient → standard, translateY(-2px) over 240ms
- **Link hover**: deep-green deepens `#007a55` → `#006647`; underline grows from 0 → 1px over 150ms
- **Tab switch**: active tab cap raises to white, inactive recedes to grey over 240ms
- **Status dot (live)**: optional pulse — opacity 0.6 → 1.0 over 1.5s ease-in-out infinite
- **Green glow on focus**: ring fades in over 150ms
### Page Transitions
- Default: fade with a short upward translate (8px) over 240ms emphasized ease
- Keeps the bright, document-like feel — no aggressive slide or scale
### Reduced Motion
When `prefers-reduced-motion: reduce` is set:
- All transitions reduce to opacity-only fades
- The green status-dot pulse animation is disabled
- Card and button lift transforms are removed
- Page transitions become instant
## 9. Accessibility & A11y
### Contrast Pairs
- **Green-black `#022c22` text on `#f5f5f5` bg**: 13.9:1 (WCAG AAA, all sizes)
- **Green-black `#022c22` text on white surface**: 15.15:1 (AAA)
- **White `#ffffff` on green `#00bc7d` brand fill**: 2.47:1 — **fails AA**. This is the live shipped pairing on the "Start for Free" CTA; it passes only as large/bold text (≥18.66px bold). For small text on green, swap to the deep green-black ink (`#022c22`), which lands at 6.13:1 (AA)
- **Green-black ink `#022c22` on green `#00bc7d`**: 6.13:1 (AA) — the recommended on-brand text for body sizes
- **Deep-green accent `#007a55` on `#f5f5f5` bg**: 4.92:1 (AA at body sizes)
- **Muted `#71717b` on `#f5f5f5` bg**: 4.43:1 (AA at body sizes; the muted floor)
- **White on code surface `#09090b`**: 19.9:1 (AAA)
- **Brand green `#00bc7d` as text on `#f5f5f5`**: 2.27:1 — **fails** as text; the green is for fills and dots, never small text on the canvas
### Focus Indicators
- Default focus: `2px solid #00bc7d` ring, 2px offset, 12px radius
- Inputs: focus border → `#00bc7d` + ring 0 0 0 2px rgba(0,188,125,0.3)
- Tailwind ring-offset uses white (`--tw-ring-offset-color: #fff`) so rings stay crisp on both grey canvas and white cards
- Always visible — never `outline: none` without replacement
### ARIA Patterns
- **Combobox**: standard listbox pattern with aria-expanded, aria-activedescendant, role="combobox"
- **Dialog**: aria-labelledby + aria-describedby; trap focus; ESC to close
- **Product tabs**: role="tablist" / role="tab" / role="tabpanel" with aria-selected on the active cap
- **Status dots**: aria-label="Live" or "Online" — never relied on colour alone
### Keyboard Navigation
- Tab order follows visual order; skip-link at page top
- Enter/Space activates buttons; Enter on links
- Arrow keys move between product tabs within the tablist
- Escape closes modals, popovers, command palette
### Screen Reader Hints
- Status indicators carry explicit aria-label (never "green dot")
- Green colour-coding always paired with a text label
- Code blocks use `<code>`/`<pre>` semantic with role where needed
### Reduced Motion
`prefers-reduced-motion: reduce` honored throughout — see §8 for the strategy.
## 10. Responsive Behavior
### Breakpoints
| Name | Min Width | Use |
|------|-----------|----|
| Mobile | — | default |
| Tablet | 640 | enlarged grids |
| Desktop | 1024 | full feature grid |
| Wide | 1280 | max page width |
| Ultra | 1536 | wide hero only |
### Touch Targets
- Minimum 44×44px for primary interactive controls
- Status dots remain 6–8px visual but hit-area expands to 24×24px
- The 12px-radius green CTA keeps generous 10px 16px padding for comfortable tapping
### Collapsing Strategy
- **Nav**: top nav collapses to hamburger ≤ 768px
- **Feature grid**: 3-col → 2-col @ 1024 → 1-col @ 640
- **Hero**: display-hero (128px) steps down to 80px @ 1024, then 56px @ 640 — never below 56px, the hero must stay loud
- **Product tabs**: horizontal scroll on overflow, retaining the 16px top-radius caps
- **Code blocks**: scroll horizontally on overflow; never wrap connection strings
### Image Behavior
- Hero illustrations and product diagrams are SVG, crisp at all sizes
- Logos lock at intrinsic size
- The "Redis ®" trademark mark holds its red regardless of theme
## 11. Content & Voice
### Tone
Direct, technical, confident — written for developers who already know
what serverless data infrastructure is. Copy is informative and concrete
("Serverless Redis", "Vector", "QStash"), not promotional. The huge hero
line states the product, the muted subhead explains it, the green CTA
asks for one action. No exclamation points, no emoji in marketing body.
### Microcopy Patterns
- **Button verbs**: "Start for Free", "Get Started", "Read Docs", "Sign Up" — single action per button
- **Error message recipe**: `[noun] [failed verb]: [reason]` — e.g., "Database creation failed: region unavailable"
- **Success confirmations**: `[noun] [verb-past]` — e.g., "Database created", "Key set"
- **Empty states**: "No databases yet. [CTA: Create your first database]" — one concrete next action
### CTA Verb Conventions
- Top-level: "Start for Free" (the signature primary CTA, probed live — not "Sign up free")
- Product: "Get Started" (not "Launch")
- Documentation: "Read Docs" / "Documentation" (not "Learn more")
- Support: "Contact" (not "Get in touch")
## 12. Dark Mode & Theming
Upstash is **light-first**. The brand identity depends on the pale-grey
daylight canvas (`#f5f5f5`) under deep green-black type — the daylight
inversion is the differentiator from its dark-mode-default peers. The
theme-toggle audit detected `prefers-color-scheme` CSS and a Tailwind
`dark:` class scaffold (score 4), so a dark variant exists in the
component layer, but the marketing identity is committed to light.
The one place the page goes dark regardless of theme is **code**:
connection strings and snippets sit on the near-black `#09090b` surface
(`--color-pre-bg`), a deliberate console-dark island that signals "this is
where you type". If implementing a full dark mode, invert the canvas to a
near-black while keeping the green `#00bc7d` rationed to action and lifting
the deep-green accent toward the brand green for legibility — but the
default and the brand-true mode is light.
## 13. Lineage & Influences
Upstash's identity is the **daylight inversion** of the serverless-tool
playbook. Its peers — Neon, Vercel, PlanetScale, the modern dev-tool field
— almost all commit to a near-black late-night-console canvas. Upstash
works in a pale-grey daylight field (`#f5f5f5`) under deep green-black ink
(`#022c22`), with one electric brand green (`#00bc7d`) rationed to action.
The green-on-light pairing descends from the Supabase/Postgres green-as-
data-health semantics, but Upstash pitches its emerald higher and cooler
and pairs it with a deep-green accent (`#007a55`) rather than forest tints.
The type system — Inter for body, the tighter Inter Tight cut for display,
set genuinely huge at 128px — borrows Vercel's "single confident accent,
tight Inter headlines" formula and turns the volume up on the display.
The page is built on the Tailwind utility vocabulary — zinc/gray neutral
ramps, ring-offset focus tokens, oklch colour variables — which gives it
the bright, document-like developer-marketing feel that Stripe pioneered:
generous whitespace, restrained palette, type doing the heavy lifting. The
product heritage is Redis (serverless Redis was the founding service), and
the trademark-mark red (`#dc2626`) on the "Redis ®" mark is the only non-
green hue on the hero — a small, honest nod to lineage. What Upstash
rejects is the dark-mode-by-default convention and the gradient-mesh /
glassmorphism school entirely: depth here is hairline borders and soft
green-black-tinted shadows, never heavy elevation.
- **Supabase** — https://supabase.com — green-on-light Postgres-era data-health semantics
- **Vercel** — https://vercel.com — Inter type, tight headlines, single rationed accent
- **Tailwind CSS** — https://tailwindcss.com — zinc/gray ramp, ring-offset focus, oklch variables
- **Inter Tight** — https://rsms.me/inter/ — the huge display face driving the 128px hero
- **Redis** — https://redis.io — product heritage; the trademark-mark red is the lone non-green hue
- **Stripe** — https://stripe.com — bright, document-like developer marketing on light
## 14. Do's and Don'ts
### Do
- **Do** keep the canvas at `#f5f5f5` pale grey — the daylight field is the whole differentiator from dark-mode peers
- **Do** set the hero in Inter Tight at 128px / 700 — the huge display line is the loudest, most distinctive gesture; let it be loud
- **Do** ration the green `#00bc7d` to action only — CTAs, status dots, the occasional emphasized word; keep it under ~5% of any viewport
- **Do** use the 12px radius on both the green CTA pill and cards — it is the signature, friendlier-than-8px curve
- **Do** carry muted copy at `#71717b` zinc-grey and the deep-green accent `#007a55` for links — never the brand green as small text
- **Do** tint shadows with green-black (`rgba(2,44,34,…)`) at low alpha, not pure black, on the warm-leaning canvas
- **Do** invert to near-black `#09090b` only for code blocks — the one dark island in a daylight page
- **Do** swap CTA text to the deep green-black ink (`#022c22`) when it must be small — white on green fails AA (see §9)
- **Do** cap product tabs with the compound `16px 16px 0 0` top radius — the file-folder read is on-brand
- **Do** keep section rhythm at 96–128px and let white cards float on the grey to do structural work
- **Do** pair every green status colour with an explicit text label for accessibility
- **Do** honor `prefers-reduced-motion` — disable the green-dot pulse and lift transforms
### Don't
- **Don't** flip the default to dark mode; Upstash's identity is the daylight inversion of the dark-tool norm
- **Don't** use the seed's wrong faded-green `rgba(52,211,153,0.2)` as the brand — the brand is solid `#00bc7d`
- **Don't** set the brand green as small text on the canvas — it lands at 2.27:1 and fails; green is for fills and dots
- **Don't** shrink the hero timidly — step 128 → 80 → 56, never to a polite 40px
- **Don't** set body or UI copy in Inter Tight or in mono — Inter Tight is display, mono is code, regular Inter is everything else
- **Don't** introduce a second chromatic accent (blue, purple, orange) — the palette is green + green-black + zinc-grey, with red only on the trademark mark
- **Don't** apply heavy drop shadows or glassmorphism — depth is hairline borders and gentle green-black-tinted shadows
- **Don't** use pure-black shadows on the grey canvas — they read cold and dirty against the warm-leaning field
- **Don't** use the green `#00bc7d` as a section background — it stays foregrounded as action
- **Don't** swap the 12px radius for the conventional 8px dev-tool curve — the rounder corner is deliberate
- **Don't** mix the emerald with conventional Tailwind green (`#22c55e`) — the Upstash green is cooler and higher in chroma
- **Don't** crowd the 128px hero — leave at least 96px of clearance below it
## 15. Agent Prompt Guide
### Quick Color Reference
```
bg: #f5f5f5
surface: #ffffff
bg-mute: #eef4f1
text: #022c22
text-muted: #71717b
brand: #00bc7d
brand-hover: #00a86f
accent: #007a55
on-brand: #ffffff (small text → use #022c22 for AA)
border: #e5e7eb
code-bg: #09090b
```
### Example Component Prompts
1. "Create a hero section on a `#f5f5f5` pale-grey background with a 128px Inter Tight headline in deep green-black (`#022c22`) at 700 weight and -0.035em tracking, a 24px subhead in zinc-grey (`#71717b`), and a primary green CTA (`#00bc7d` fill, white text, 12px radius) that says 'Start for Free.'"
2. "Design a 3-card feature grid: white (`#ffffff`) cards on the grey canvas, each 24px padding, 12px radius, 1px `#e5e7eb` border, soft green-black-tinted shadow, a 24px Inter Tight h4 in `#022c22`, and body copy at 16px `#71717b`. The middle card uses the `#eef4f1` emerald wash instead of white."
3. "Build a product tab bar: four tabs (Redis, Vector, Workflow, QStash) with `16px 16px 0 0` top-radius caps. Active tab is white with `#022c22` text; inactive tabs are `#f5f5f5` with `#71717b` text. The active cap merges into the white panel below."
4. "Create a code block: near-black `#09090b` background, 13px system mono `#e4e4e7` text with slashed-zero, 16px 20px padding, 12px radius. Inline backticks elsewhere on the light page render in deep-green `#007a55`."
5. "Design a secondary CTA pair on a brand strip: a primary green pill (`#00bc7d`, white text, 12px radius) reading 'Get Started', beside a soft deep-green button (`rgba(6,95,70,0.2)` fill, `#007a55` text, 12px radius) reading 'Documentation.'"
6. "Build a status badge: a 6px `#00bc7d` dot with a soft `0 0 12px rgba(0,188,125,0.45)` glow beside the label 'Serverless · us-east-1', the label set in 11px Inter at 500 in `#007a55` on an `#eef4f1` pill."
### Iteration Guide
1. **Start with the canvas** — confirm `#f5f5f5` pale grey, not white and not dark; the daylight field is the identity
2. **Make the hero huge** — Inter Tight at 128px / 700 is the signature; if it looks ordinary, it's too small
3. **Ration the green** — count viewport green pixels; if more than ~5%, demote to the deep-green accent or an emerald-wash surface
4. **Check the green CTA text** — white on `#00bc7d` fails AA; if the label is small, switch to `#022c22` ink
5. **Use 12px everywhere rounded** — both CTA and card; the rounder-than-8px corner is what softens the technical page
6. **Tint the shadows green-black** — `rgba(2,44,34,…)`, never pure black, on the warm canvas
7. **Keep one dark island** — code goes on `#09090b`; nothing else inverts in light mode
8. **Hold the neutral ramp** — green-black `#022c22` → zinc-grey `#71717b` → faint `#a1a1aa`; never grey-on-grey mud
1. Visual Theme & Atmosphere
Upstash opens on a pale-grey canvas — #f5f5f5, an off-white so close to
paper it reads as a daylight workbench rather than a screen. This is the
first deliberate inversion: the serverless-infrastructure cohort that
Upstash competes in (Neon, Vercel, PlanetScale, half of the modern
dev-tool field) almost universally commits to a near-black “late-night
console” canvas. Upstash refuses that convention and works in full light.
The deep green-black type (#022c22) sits on the grey like ink on a
technical broadsheet, and the single electric brand green (#00bc7d)
carries every CTA. The combination reads as serverless data, rendered
calm and legible — infrastructure you can read in daylight.
The loudest gesture on the page is typographic, not chromatic. The hero
h1 is set in Inter Tight at a genuinely enormous 128px / 700 — a size
that turns a single product line into architecture. Everything else is
restrained: Inter body at 16px with a comfortable 1.55 line-height, a
zinc-grey muted scale (#71717b) for supporting copy, and a deep-green
accent (#007a55) reserved for links and emphasis. The brand green never
becomes a background; it stays foregrounded on buttons, status dots, and
the occasional emphasized word. The discipline is the point — green is
action, green-black is voice, grey is structure.
The mood is bright, technical, and confident. There is no gradient
mesh, no glassmorphism, no AI-generated hero imagery. Depth comes from
hairline borders (#e5e7eb) and soft green-black-tinted shadows
(rgba(2,44,34,0.10)) rather than heavy elevation. Whitespace is
generous; sections breathe at 96–128px; cards sit on white surfaces that
lift a half-step off the grey canvas. The one place the page goes dark is
code — connection strings and snippets sit on a near-black #09090b
surface, a small console-dark island in an otherwise daylit document.
Reading top to bottom, the rhythm alternates pale-grey canvas, white
feature cards, emerald-washed tinted strips (#eef4f1), and near-black
code blocks. Product tabs (Redis, Vector, Workflow, QStash) cap with a
16px top radius like file folders. The green accent appears sparingly — a
“Start for Free” pill, a status badge, a deep-green link — so each
instance lands. Over-applying the green, colouring more than ~5% of any
viewport, would dilute the “this is the action” semantic that the rationed
emerald carries.
Key Characteristics
- Pale-grey daylight canvas (
#f5f5f5) — a deliberate inversion of the dark-mode dev-tool default - Deep green-black type (
#022c22) reads as ink on a technical broadsheet - One electric brand green (
#00bc7d,--color-primary) rationed strictly to action, on a 12px-radius pill - Deep-green accent (
#007a55) for links and emphasis; zinc-grey (#71717b) for muted copy - Inter Tight display set genuinely huge — a 128px hero h1 at 700 weight
- Inter body at 16px / 1.55 line-height; system mono for code
- Near-black code surface (
#09090b) — the one dark island in a daylit page - Hairline borders + soft green-black-tinted shadows, never heavy elevation
- Product tabs cap with a 16px top radius like file folders
- Trademark-mark red (
#dc2626) is the only non-green hue, on the “Redis ®” mark
2. Color Palette & Roles
Primary
- Background (
#f5f5f5) [→--color-bg]: page canvas, pale daylight grey (probed oklch 0.97 0 0) - Primary Text (
#022c22) [→--color-text]: headlines and primary copy, deep green-black - Primary CTA Fill (
#00bc7d) [→--color-primary]: electric green button background
Brand & Action
- Brand Green (
#00bc7d) [→--color-primary]: the defining hue — electric emerald, the colour of a healthy serverless cluster (probed oklch 0.696 0.17 162.48) - Brand Hover (
#00a86f): slightly deeper for hover continuity - Brand Pressed (
#009963): active/pressed state - Brand Soft (
#00bc7d1f): 12% green wash for hover backgrounds and halos - On-Brand Text (
#ffffff): white text on the green fill, as shipped on CTAs (see §9 — this pair is below AA; prefer the ink alternate for small text) - On-Brand Ink (
#022c22): deep green-black alternate for AA-grade text on the green fill
Accent
- Deep Green (
#007a55) [→--color-primary-text]: the accent — links, emphasis, secondary-action text (probed oklch 0.508 0.118 165.612) - Accent Hover (
#006647): deeper accent on hover - Accent Soft (
#065f4633): 20% deep-green wash — the “Documentation” secondary-CTA fill (probed rgba(6,95,70,0.2))
Interactive
- Link (
#007a55): deep-green inline and documentation links - Link Hover (
#006647): deeper green on hover - Selected (
#00bc7d26): 15% green wash for selection highlight - Disabled (
#d4d4d8): disabled control fill (zinc-300) - Disabled Text (
#a1a1aa): disabled-state copy (zinc-400)
Neutral Scale
- Text Heading (
#022c22): deep green-black for headlines - Text Body (
#022c22): same — body copy is full green-black on the pale canvas - Text Muted (
#71717b) [→--color-text-mute]: secondary copy, metadata (probed oklch 0.552 0.016 285.938 — zinc-500) - Text Soft (
#52525b): tertiary copy, nav inactive (zinc-600) - Text Faint (
#a1a1aa): quaternary annotations, placeholders (zinc-400) - Text Disabled (
#a1a1aa): disabled-state copy
Surface & Borders
- Surface (
#ffffff) [→--color-surfaceanalog]: card and panel base — white, lifting a half-step off the grey canvas - Surface Alt (
#fafafa): secondary panel - Surface Code (
#09090b) [→--color-pre-bg]: near-black code/pre surface — the page’s one dark island - Bg Mute (
#eef4f1) [→--color-bg-mute]: 8% emerald wash (probed rgba(4,120,87,0.08)) for tinted feature strips - Border (
#e5e7eb): solid hairline (gray-200) - Border Soft (
#0000000f): ~6% black translucent for low-emphasis dividers - Border Strong (
#d4d4d8): emphasized border on hover/focus (zinc-300) - Border Brand (
#00bc7d66): 40% green border on focus
Shadow Colors
Shadows are tinted with the deep green-black (#022c22) at low alpha — never pure black. This keeps elevation in the same chromatic family as the type and avoids the cold grey cast pure-black shadows give on a warm-leaning grey canvas:
- Ambient (
rgba(2,44,34,0.06)): low resting shadow - Standard (
rgba(2,44,34,0.10)): card hover (matches--tw-shadow-color) - Elevated (
rgba(2,44,34,0.14)): popover and dropdown - Glow (
rgba(0,188,125,0.22)): exception — green focus glow only
Semantic
- Success (
#00bc7d): success uses the brand green — they are the same hue - Success Bg (
#eef4f1): success surface, emerald wash - Warning (
#d97706): amber, used sparingly outside the green palette (amber-600) - Warning Bg (
#fef3c7): warning surface (amber-100) - Danger (
#dc2626): red-600 — doubles as the trademark-mark red on “Redis ®” - Danger Bg (
#fee2e2): danger surface (red-100) - Info (
#007a55): info uses the deep-green accent - Info Bg (
#eef4f1): info surface
3. Typography Rules
Font Family
- Display:
Inter Tight(probed__Inter_Tight_a3c0d3), Inter, system-ui fallback chain — a tighter, more display-tuned Inter cut - Body:
Inter(probed__Inter_f367f3) — same fallback chain - Mono:
ui-monospace, SFMono-Regular, “SF Mono”, Menlo, Consolas, monospace (system stack) - OpenType features:
cv11(single-storey alternates) on the Inter faces for a cleaner geometric read;zero(slashed zero) on the mono for connection strings and identifiers
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | OT Features | Notes |
|---|---|---|---|---|---|---|---|
| display-hero | display | 128 | 700 | 1.0 | -0.035em | cv11 | hero only — probed live, single line |
| display-large | display | 80 | 700 | 1.02 | -0.03em | cv11 | secondary hero, big section opener |
| h1 | display | 56 | 700 | 1.05 | -0.025em | — | page/section opener |
| h2 | display | 40 | 700 | 1.1 | -0.02em | — | feature heading |
| h3 | display | 32 | 600 | 1.15 | -0.015em | — | sub-feature |
| h4 | display | 24 | 600 | 1.25 | -0.005em | — | card heading |
| h5 | body | 20 | 600 | 1.3 | 0 | — | small heading, dense UI |
| body-large | body | 18 | 400 | 1.55 | 0 | — | hero supporting copy |
| body | body | 16 | 400 | 1.55 | 0 | — | default body (probed) |
| body-small | body | 14 | 400 | 1.5 | 0 | — | dense feature blocks |
| lead-muted | body | 24 | 400 | 1.4 | -0.005em | — | hero subhead in zinc-grey (probed h2-slot) |
| label | body | 13 | 500 | 1.4 | 0 | — | form labels, eyebrows |
| button | body | 15 | 500 | 1.0 | -0.005em | — | primary/ghost button |
| button-small | body | 13 | 500 | 1.0 | 0 | — | dense UI controls |
| link | body | 16 | 500 | 1.5 | 0 | — | inline link |
| caption | body | 12 | 500 | 1.4 | 0.02em | — | image captions, metadata |
| micro | body | 11 | 500 | 1.3 | 0.04em | — | badges, status pills |
| code-body | mono | 13 | 400 | 1.6 | 0 | zero | inline + block code |
| code-label | mono | 11 | 500 | 1.3 | 0.05em | zero | region/branch labels in code UI |
Principles
- Display is the loudest voice: Inter Tight at 700 carries the identity. The 128px hero is the single most distinctive choice on the page — do not shrink it timidly; if it must reduce, step to 80 then 56, never to a polite 40
- Tracking philosophy: tight negative tracking (-0.025em to -0.035em) on display tightens the huge Inter Tight; neutral on body; slightly positive (
0.02emto0.05em) on caption/micro/code-label to hold small sizes legible - Weight as hierarchy: 700 for display through h2, 600 for h3–h5, 500 for buttons/labels, 400 for body. The drop from 700-display to 400-body is intentional and stark — it is what keeps the page calm under the loud hero
- Two Inter cuts, not one: Inter Tight for display, regular Inter for body. They share a skeleton but Inter Tight’s tighter spacing reads as “headline”; never set body in Inter Tight or display in regular Inter
- Muted subhead pattern: the hero subhead sits at ~24px in zinc-grey (
#71717b), not green-black — it recedes deliberately under the display line - Mono for code only: system mono with slashed zero for connection strings, snippets, identifiers; never set body or UI copy in mono
- Body line-height 1.55: generous daylight reading rhythm; tighten to 1.5 only in dense feature blocks
- Caption sizes ≤ 13px rely on letter-spacing (0.02–0.05em) to stay legible at small sizes on the pale canvas
4. Component Stylings
Buttons
button-primary — Electric green CTA
- Background:
#00bc7d - Text:
#ffffffat 15/500 (as shipped; see §9 — swap to#022c22ink for AA at small sizes) - Padding: 10px 16px
- Radius: 12
- Border: none
- Hover:
#00a86f, subtle translateY(-1px) lift - Active:
#009963 - Focus: 2px solid
#00bc7dring, 2px offset - Use: primary CTA — “Start for Free”, “Get Started”, “Sign Up”
button-accent-soft — Deep-green soft secondary
- Background:
rgba(6,95,70,0.2)(accent-soft) - Text:
#007a55at 15/500 - Padding: 10px 16px
- Radius: 12
- Border: none
- Hover: bg →
rgba(6,95,70,0.28) - Use: secondary action on brand strips — “Documentation”, “Read Docs” (probed live)
button-ghost — Outlined tertiary
- Background: transparent
- Text:
#022c22at 15/500 - Padding: 10px 16px
- Radius: 12
- Border: 1px solid
#e5e7eb - Hover: border →
#d4d4d8, bg → rgba(2,44,34,0.03) - Use: “Sign in”, “Pricing”, “Contact” — quiet navigation actions
button-danger — Destructive
- Background: transparent
- Text:
#dc2626at 15/500 - Padding: 10px 16px
- Radius: 12
- Border: 1px solid rgba(220,38,38,0.35)
- Hover: bg → rgba(220,38,38,0.06)
- Use: “Delete database”, “Remove key”, “Drop index”
Cards
card-default
- Background:
#ffffff - Padding: 24px
- Radius: 12
- Border: 1px solid
#e5e7eb - Shadow: ambient (rgba(2,44,34,0.06) 0 1px 2px)
- Hover: border →
#d4d4d8, shadow → standard, translateY(-2px) - Use: feature card, pricing tier, product tile
card-tinted — Emerald-washed feature panel
- Background:
#eef4f1(8% emerald wash) - Padding: 24px
- Radius: 12
- Border: none
- Use: section-emphasis feature block — the daylight equivalent of a tinted panel
Badges / Tags / Pills
badge-status — Green status pill
- Background:
#eef4f1 - Text:
#007a55at 11/500 micro - Padding: 2px 10px
- Radius: pill (9999)
- Use: “Serverless”, “Beta”, region label
badge-neutral — Quiet label pill
- Background:
#ffffff - Text:
#71717bat 11/500 - Padding: 2px 10px
- Radius: pill
- Border: 1px solid
#e5e7eb - Use: version tags, “v2”, neutral metadata
Inputs / Forms
input-text
- Background:
#ffffff - Text:
#022c22at 15/400 - Placeholder:
#a1a1aa - Padding: 8px 12px
- Radius: 8
- Border: 1px solid
#e5e7eb - Focus: border →
#00bc7d, ring 0 0 0 2px rgba(0,188,125,0.3) - Use: text input, search, connection-string field
Navigation
nav-link
- Background: transparent
- Text:
#52525bat 14/500 - Padding: 8px 12px
- Hover: text →
#022c22 - Active: text →
#007a55 - Use: top nav, sidebar nav
product-tab — File-folder tab cap
- Active: bg
#ffffff, text#022c22, radius16px 16px 0 0 - Inactive: bg
#f5f5f5, text#71717b, radius16px 16px 0 0 - Use: product switcher — Redis, Vector, Workflow, QStash (probed live, 16px top radius)
Decorative
status-dot — Live indicator
- 6–8px circle of
#00bc7d - Optional
0 0 12px rgba(0,188,125,0.45)glow on live state - Use: next to region labels, “online” indicators, healthy-cluster markers
code-block
- Background:
#09090b(near-black, the page’s one dark surface) - Text:
#e4e4e7at code-body withzeroslashed-zero - Padding: 16px 20px
- Radius: 12
- Inline backticks render in
#007a55deep-green on light surfaces - Use: connection strings, SDK snippets, CLI examples
5. Layout Principles
Spacing System
- Base unit: 4px
- Scale: 4, 8, 12, 16, 24, 32, 48, 64, 96, 128
- Density observation: tight within cards (16–24px), generous between sections (96–128px). The page reads roomy because the grey canvas and white cards do the structural work — gaps don’t need to be enormous to feel separated
Grid & Container
- Page width: 1280px max
- Prose width: 720px (documentation, marketing body)
- Hero treatment: content constrained to ~1024px so the 128px display line has room to breathe without wall-to-wall sprawl
- Feature grid: 3-column at desktop, 2-column at tablet, 1-column at mobile
- Header height: 64px sticky bar
Whitespace Philosophy
- Section rhythm: ~96–128px between major sections
- Within-section rhythm: ~24–48px between feature blocks
- The pale-grey canvas is itself negative space — white cards float on it, so whitespace and surface do double duty
- The huge hero demands clearance: leave at least 96px below the 128px display line before the next element
Section Cadence
- Pale-grey canvas → white feature cards → emerald-washed tinted strip (
#eef4f1) → near-black code block → footer - Tinted strips and code blocks are the section-break devices — the canvas itself stays constant grey
- Green accent stays foreground throughout — it never anchors a section background
6. Shapes & Radius Scale
| Tier | Px | Use |
|---|---|---|
| Micro | 2 | inline chips, dense tags |
| Standard | 4 | small badges, dense controls |
| Comfortable | 8 | inputs, small controls |
| Relaxed | 12 | buttons / CTAs and cards — the signature radius |
| Featured | 16 | product tab caps, feature shells |
| Large | 20 | signature feature panels |
| Pill | 9999 | status pills, avatars |
The signature radius is 12px, shared by both the green CTA pill and
cards — a slightly rounder, friendlier curve than the 8px most dev tools
use, which softens the otherwise technical page. Product tabs use a
compound radius (16px 16px 0 0) that rounds only the top corners,
reading as file-folder caps that merge into the panel below.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 (flat) | no shadow, no border | hero copy on canvas |
| 1 | 1px solid #e5e7eb border, no shadow | inline cards, list rows |
| 2 | 1px border + ambient shadow (0 1px 2px) | feature cards at rest |
| 3 | standard shadow (0 8px 16px -4px) | card hover, raised tile |
| 4 | elevated shadow (0 20px 40px -8px) | popover, dropdown |
| 5 | deep shadow (0 32px 64px -16px) | modal, command palette |
Shadow Philosophy: shadows are tinted with the deep green-black
(rgba(2,44,34,…)) at low alpha rather than pure black. On a warm-leaning
pale grey, pure-black shadows read cold and dirty; green-black-tinted
shadows keep elevation in the same chromatic family as the type and the
canvas. Elevation is gentle — this is a daylight page, so depth comes
mostly from hairline borders and white-on-grey surface contrast, with
shadow as a secondary cue. The only chromatic shadow is the green focus
glow (rgba(0,188,125,0.22)), reserved for focus rings, never for resting
elevation. Multi-layer shadows appear at level 4+ to soften edges.
8. Interaction & Motion
Easing
- Standard:
cubic-bezier(0.4, 0, 0.2, 1)— default for hover, focus, fade - Emphasized:
cubic-bezier(0.2, 0, 0, 1)— modal enter, page transitions - Decelerate:
cubic-bezier(0, 0, 0.2, 1)— tooltips, dropdowns enter
Durations
- Fast (150ms): hover state changes, focus ring
- Standard (240ms): card lift, button press, tab switch
- Slow (320ms): modal enter, page transition
Per-Component Recipes
- Button hover: bg colour transitions over 150ms standard ease; subtle translateY(-1px) lift on the green CTA
- Card hover: border lifts from
#e5e7eb→#d4d4d8, shadow intensifies ambient → standard, translateY(-2px) over 240ms - Link hover: deep-green deepens
#007a55→#006647; underline grows from 0 → 1px over 150ms - Tab switch: active tab cap raises to white, inactive recedes to grey over 240ms
- Status dot (live): optional pulse — opacity 0.6 → 1.0 over 1.5s ease-in-out infinite
- Green glow on focus: ring fades in over 150ms
Page Transitions
- Default: fade with a short upward translate (8px) over 240ms emphasized ease
- Keeps the bright, document-like feel — no aggressive slide or scale
Reduced Motion
When prefers-reduced-motion: reduce is set:
- All transitions reduce to opacity-only fades
- The green status-dot pulse animation is disabled
- Card and button lift transforms are removed
- Page transitions become instant
9. Accessibility & A11y
Contrast Pairs
- Green-black
#022c22text on#f5f5f5bg: 13.9:1 (WCAG AAA, all sizes) - Green-black
#022c22text on white surface: 15.15:1 (AAA) - White
#ffffffon green#00bc7dbrand fill: 2.47:1 — fails AA. This is the live shipped pairing on the “Start for Free” CTA; it passes only as large/bold text (≥18.66px bold). For small text on green, swap to the deep green-black ink (#022c22), which lands at 6.13:1 (AA) - Green-black ink
#022c22on green#00bc7d: 6.13:1 (AA) — the recommended on-brand text for body sizes - Deep-green accent
#007a55on#f5f5f5bg: 4.92:1 (AA at body sizes) - Muted
#71717bon#f5f5f5bg: 4.43:1 (AA at body sizes; the muted floor) - White on code surface
#09090b: 19.9:1 (AAA) - Brand green
#00bc7das text on#f5f5f5: 2.27:1 — fails as text; the green is for fills and dots, never small text on the canvas
Focus Indicators
- Default focus:
2px solid #00bc7dring, 2px offset, 12px radius - Inputs: focus border →
#00bc7d+ ring 0 0 0 2px rgba(0,188,125,0.3) - Tailwind ring-offset uses white (
--tw-ring-offset-color: #fff) so rings stay crisp on both grey canvas and white cards - Always visible — never
outline: nonewithout replacement
ARIA Patterns
- Combobox: standard listbox pattern with aria-expanded, aria-activedescendant, role=“combobox”
- Dialog: aria-labelledby + aria-describedby; trap focus; ESC to close
- Product tabs: role=“tablist” / role=“tab” / role=“tabpanel” with aria-selected on the active cap
- Status dots: aria-label=“Live” or “Online” — never relied on colour alone
Keyboard Navigation
- Tab order follows visual order; skip-link at page top
- Enter/Space activates buttons; Enter on links
- Arrow keys move between product tabs within the tablist
- Escape closes modals, popovers, command palette
Screen Reader Hints
- Status indicators carry explicit aria-label (never “green dot”)
- Green colour-coding always paired with a text label
- Code blocks use
<code>/<pre>semantic with role where needed
Reduced Motion
prefers-reduced-motion: reduce honored throughout — see §8 for the strategy.
10. Responsive Behavior
Breakpoints
| Name | Min Width | Use |
|---|---|---|
| Mobile | — | default |
| Tablet | 640 | enlarged grids |
| Desktop | 1024 | full feature grid |
| Wide | 1280 | max page width |
| Ultra | 1536 | wide hero only |
Touch Targets
- Minimum 44×44px for primary interactive controls
- Status dots remain 6–8px visual but hit-area expands to 24×24px
- The 12px-radius green CTA keeps generous 10px 16px padding for comfortable tapping
Collapsing Strategy
- Nav: top nav collapses to hamburger ≤ 768px
- Feature grid: 3-col → 2-col @ 1024 → 1-col @ 640
- Hero: display-hero (128px) steps down to 80px @ 1024, then 56px @ 640 — never below 56px, the hero must stay loud
- Product tabs: horizontal scroll on overflow, retaining the 16px top-radius caps
- Code blocks: scroll horizontally on overflow; never wrap connection strings
Image Behavior
- Hero illustrations and product diagrams are SVG, crisp at all sizes
- Logos lock at intrinsic size
- The “Redis ®” trademark mark holds its red regardless of theme
11. Content & Voice
Tone
Direct, technical, confident — written for developers who already know what serverless data infrastructure is. Copy is informative and concrete (“Serverless Redis”, “Vector”, “QStash”), not promotional. The huge hero line states the product, the muted subhead explains it, the green CTA asks for one action. No exclamation points, no emoji in marketing body.
Microcopy Patterns
- Button verbs: “Start for Free”, “Get Started”, “Read Docs”, “Sign Up” — single action per button
- Error message recipe:
[noun] [failed verb]: [reason]— e.g., “Database creation failed: region unavailable” - Success confirmations:
[noun] [verb-past]— e.g., “Database created”, “Key set” - Empty states: “No databases yet. [CTA: Create your first database]” — one concrete next action
CTA Verb Conventions
- Top-level: “Start for Free” (the signature primary CTA, probed live — not “Sign up free”)
- Product: “Get Started” (not “Launch”)
- Documentation: “Read Docs” / “Documentation” (not “Learn more”)
- Support: “Contact” (not “Get in touch”)
12. Dark Mode & Theming
Upstash is light-first. The brand identity depends on the pale-grey
daylight canvas (#f5f5f5) under deep green-black type — the daylight
inversion is the differentiator from its dark-mode-default peers. The
theme-toggle audit detected prefers-color-scheme CSS and a Tailwind
dark: class scaffold (score 4), so a dark variant exists in the
component layer, but the marketing identity is committed to light.
The one place the page goes dark regardless of theme is code:
connection strings and snippets sit on the near-black #09090b surface
(--color-pre-bg), a deliberate console-dark island that signals “this is
where you type”. If implementing a full dark mode, invert the canvas to a
near-black while keeping the green #00bc7d rationed to action and lifting
the deep-green accent toward the brand green for legibility — but the
default and the brand-true mode is light.
13. Lineage & Influences
Upstash’s identity is the daylight inversion of the serverless-tool
playbook. Its peers — Neon, Vercel, PlanetScale, the modern dev-tool field
— almost all commit to a near-black late-night-console canvas. Upstash
works in a pale-grey daylight field (#f5f5f5) under deep green-black ink
(#022c22), with one electric brand green (#00bc7d) rationed to action.
The green-on-light pairing descends from the Supabase/Postgres green-as-
data-health semantics, but Upstash pitches its emerald higher and cooler
and pairs it with a deep-green accent (#007a55) rather than forest tints.
The type system — Inter for body, the tighter Inter Tight cut for display,
set genuinely huge at 128px — borrows Vercel’s “single confident accent,
tight Inter headlines” formula and turns the volume up on the display.
The page is built on the Tailwind utility vocabulary — zinc/gray neutral
ramps, ring-offset focus tokens, oklch colour variables — which gives it
the bright, document-like developer-marketing feel that Stripe pioneered:
generous whitespace, restrained palette, type doing the heavy lifting. The
product heritage is Redis (serverless Redis was the founding service), and
the trademark-mark red (#dc2626) on the “Redis ®” mark is the only non-
green hue on the hero — a small, honest nod to lineage. What Upstash
rejects is the dark-mode-by-default convention and the gradient-mesh /
glassmorphism school entirely: depth here is hairline borders and soft
green-black-tinted shadows, never heavy elevation.
- Supabase — https://supabase.com — green-on-light Postgres-era data-health semantics
- Vercel — https://vercel.com — Inter type, tight headlines, single rationed accent
- Tailwind CSS — https://tailwindcss.com — zinc/gray ramp, ring-offset focus, oklch variables
- Inter Tight — https://rsms.me/inter/ — the huge display face driving the 128px hero
- Redis — https://redis.io — product heritage; the trademark-mark red is the lone non-green hue
- Stripe — https://stripe.com — bright, document-like developer marketing on light
14. Do’s and Don’ts
Do
- Do keep the canvas at
#f5f5f5pale grey — the daylight field is the whole differentiator from dark-mode peers - Do set the hero in Inter Tight at 128px / 700 — the huge display line is the loudest, most distinctive gesture; let it be loud
- Do ration the green
#00bc7dto action only — CTAs, status dots, the occasional emphasized word; keep it under ~5% of any viewport - Do use the 12px radius on both the green CTA pill and cards — it is the signature, friendlier-than-8px curve
- Do carry muted copy at
#71717bzinc-grey and the deep-green accent#007a55for links — never the brand green as small text - Do tint shadows with green-black (
rgba(2,44,34,…)) at low alpha, not pure black, on the warm-leaning canvas - Do invert to near-black
#09090bonly for code blocks — the one dark island in a daylight page - Do swap CTA text to the deep green-black ink (
#022c22) when it must be small — white on green fails AA (see §9) - Do cap product tabs with the compound
16px 16px 0 0top radius — the file-folder read is on-brand - Do keep section rhythm at 96–128px and let white cards float on the grey to do structural work
- Do pair every green status colour with an explicit text label for accessibility
- Do honor
prefers-reduced-motion— disable the green-dot pulse and lift transforms
Don’t
- Don’t flip the default to dark mode; Upstash’s identity is the daylight inversion of the dark-tool norm
- Don’t use the seed’s wrong faded-green
rgba(52,211,153,0.2)as the brand — the brand is solid#00bc7d - Don’t set the brand green as small text on the canvas — it lands at 2.27:1 and fails; green is for fills and dots
- Don’t shrink the hero timidly — step 128 → 80 → 56, never to a polite 40px
- Don’t set body or UI copy in Inter Tight or in mono — Inter Tight is display, mono is code, regular Inter is everything else
- Don’t introduce a second chromatic accent (blue, purple, orange) — the palette is green + green-black + zinc-grey, with red only on the trademark mark
- Don’t apply heavy drop shadows or glassmorphism — depth is hairline borders and gentle green-black-tinted shadows
- Don’t use pure-black shadows on the grey canvas — they read cold and dirty against the warm-leaning field
- Don’t use the green
#00bc7das a section background — it stays foregrounded as action - Don’t swap the 12px radius for the conventional 8px dev-tool curve — the rounder corner is deliberate
- Don’t mix the emerald with conventional Tailwind green (
#22c55e) — the Upstash green is cooler and higher in chroma - Don’t crowd the 128px hero — leave at least 96px of clearance below it
15. Agent Prompt Guide
Quick Color Reference
bg: #f5f5f5
surface: #ffffff
bg-mute: #eef4f1
text: #022c22
text-muted: #71717b
brand: #00bc7d
brand-hover: #00a86f
accent: #007a55
on-brand: #ffffff (small text → use #022c22 for AA)
border: #e5e7eb
code-bg: #09090b
Example Component Prompts
-
“Create a hero section on a
#f5f5f5pale-grey background with a 128px Inter Tight headline in deep green-black (#022c22) at 700 weight and -0.035em tracking, a 24px subhead in zinc-grey (#71717b), and a primary green CTA (#00bc7dfill, white text, 12px radius) that says ‘Start for Free.’” -
“Design a 3-card feature grid: white (
#ffffff) cards on the grey canvas, each 24px padding, 12px radius, 1px#e5e7ebborder, soft green-black-tinted shadow, a 24px Inter Tight h4 in#022c22, and body copy at 16px#71717b. The middle card uses the#eef4f1emerald wash instead of white.” -
“Build a product tab bar: four tabs (Redis, Vector, Workflow, QStash) with
16px 16px 0 0top-radius caps. Active tab is white with#022c22text; inactive tabs are#f5f5f5with#71717btext. The active cap merges into the white panel below.” -
“Create a code block: near-black
#09090bbackground, 13px system mono#e4e4e7text with slashed-zero, 16px 20px padding, 12px radius. Inline backticks elsewhere on the light page render in deep-green#007a55.” -
“Design a secondary CTA pair on a brand strip: a primary green pill (
#00bc7d, white text, 12px radius) reading ‘Get Started’, beside a soft deep-green button (rgba(6,95,70,0.2)fill,#007a55text, 12px radius) reading ‘Documentation.’” -
“Build a status badge: a 6px
#00bc7ddot with a soft0 0 12px rgba(0,188,125,0.45)glow beside the label ‘Serverless · us-east-1’, the label set in 11px Inter at 500 in#007a55on an#eef4f1pill.”
Iteration Guide
- Start with the canvas — confirm
#f5f5f5pale grey, not white and not dark; the daylight field is the identity - Make the hero huge — Inter Tight at 128px / 700 is the signature; if it looks ordinary, it’s too small
- Ration the green — count viewport green pixels; if more than ~5%, demote to the deep-green accent or an emerald-wash surface
- Check the green CTA text — white on
#00bc7dfails AA; if the label is small, switch to#022c22ink - Use 12px everywhere rounded — both CTA and card; the rounder-than-8px corner is what softens the technical page
- Tint the shadows green-black —
rgba(2,44,34,…), never pure black, on the warm canvas - Keep one dark island — code goes on
#09090b; nothing else inverts in light mode - Hold the neutral ramp — green-black
#022c22→ zinc-grey#71717b→ faint#a1a1aa; never grey-on-grey mud
Drop upstash into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add upstash npx agentkit init --design upstash