taste-skill / Style guides / Upstash style
How to build a UI in the Upstash style
Upstash (upstash.com) reads as Oversized Emerald Typography & Clean Serverless Daylight — Soft #F5F5F5 daylight canvas with #FFFFFF cards, deep forest-emerald #022C22 monumental 128px Inter Tight headlines (-0.025em), JetBrains Mono snippets, and #00BC7D emerald accents. This guide turns its extracted computed styles into an implementation kit: a live preview, the exact palette and type scale, real button and card recipes, the rules to avoid, and drop-in CSS variables, Tailwind config and a Cursor / Claude Code SKILL.md snippet.
Source: computed styles extracted from
https://upstash.com on 2026-10-26 by the taste-skill extractor. Brand fonts may be proprietary; previews fall back to Inter / system fonts. Upstash is a trademark of its owner; this page documents publicly visible styling for reference and is not affiliated with Upstash.Live preview with Upstash tokens
Color palette (light mode)
| Role | Value | Tailwind | Usage |
|---|---|---|---|
| canvasBg | #F5F5F5 | bg-[#F5F5F5] | Primary Upstash page canvas |
| surfaceElevated | #FFFFFF | bg-white | Primary elevated card & bento surface |
| surfaceSecondary | rgba(0, 115, 89, 0.08) | bg-[rgba(0,115,89,0.08)] | Secondary interactive container / hover fill |
| borderPrimary | rgba(0, 0, 0, 0.05) | border-black/[0.05] | Primary structural divider (1px rgba(0,0,0,0.05)) |
| borderSecondary | rgba(255, 255, 255, 0.1) | border-white/[0.1] | Secondary nested module or pill border |
| textPrimary | #022C22 | text-[#022C22] | Hero H1, section H2 & high-contrast foreground |
| textMuted | #71717B | text-[#71717B] | Lead paragraphs, descriptions & muted labels |
| accentPrimary | #00BC7D | bg-[#00BC7D] | Primary interactive CTA & brand highlight (10px) |
| accentSecondary | #00BC7D | text-[#00BC7D] | Secondary badge, syntax or telemetry highlight |
Typography
Heading Inter Tight · body Inter · mono JetBrains Mono
| Level | Computed spec |
|---|---|
| Hero H1 | 128px | line-height 128px (leading-[1]) | letter-spacing -3.2px (tracking-[-0.025em]) | weight 700 (font-[700]) | color rgba(0, 0, 0, 0) (text-[rgba(0,0,0,0)]) | font Inter Tight |
| Section H2 (Primary) | 48px | line-height 48px (leading-[1]) | letter-spacing 0px (tracking-[0em]) | weight 600 (font-[600]) | color #022C22 (text-[#022C22]) | font Inter Tight |
| Card / Feature H3 | 24px | line-height 32px (leading-[1.33]) | letter-spacing 0px (tracking-[0em]) | weight 600 (font-[600]) | color #022C22 (text-[#022C22]) | font Inter Tight |
| Body Copy (Paragraph) | 16px | line-height 24px (leading-[1.5]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #71717B (text-[#71717B]) | font Inter |
| Monospace / Code Block | 13.8px | line-height 20.6px (leading-[1.5]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #E4E4E7 (text-[#E4E4E7]) | font JetBrains Mono |
Spacing, radius, depth and motion
| Token family | Most frequent values (count on page) |
|---|---|
| Border radius | 35.2px ×41 · 12px ×18 · 16px ×7 · 16px 16px 0px 0px ×6 · 6px ×5 · 8px ×5 |
| Box shadow | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px ×28 · rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px ×2 · rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(16, 185, 129, 0.3) 0px 0px 80px 0px ×1 |
| Grid / flex gap | 8px ×40 · 16px ×9 · 4px ×7 · 2px ×7 · 12px ×7 · 32px ×5 |
| Container max-width | 1280px ×7 · 768px ×5 · 1536px ×1 · 1080px ×1 |
| Section vertical padding | 64px / 64px ×3 · 32px / 32px ×1 · 112px / 112px ×1 · 96px / 96px ×1 |
| Easing | cubic-bezier(0.4, 0, 0.2, 1) ×111 · cubic-bezier(0, 0, 0.2, 1) ×5 · cubic-bezier(0.4, 0, 1, 1) ×1 |
| Duration | 0.15s ×93 · 0.3s ×16 · 0.2s ×5 · 0.5s ×3 |
Component recipes
Buttons (7 distinct)
| Rendered | Height | Padding | Radius | Background / Text | Border | Font |
|---|---|---|---|---|---|---|
| Button | 40px | 0px 20px | 10px | #FFFFFF#065F46 | none | 16px / 500 |
| QStash | 64px | 0px 32px | 16px 16px 0px 0px | #F5F5F5#71717B | 2px solid rgba(0, 115, 89, 0.08) | 24px / 600 |
| Explore Redis | 42px | 8px 20px | 12px | rgba(0, 115, 89, 0.08)#007A55 | none | 16px / 500 |
| Documentation | 42px | 8px 20px | 12px | rgba(5, 95, 70, 0.2)#007A55 | none | 16px / 500 |
| Create Database | 42px | 8px 20px | 12px | #00BC7D#FFFFFF | none | 16px / 500 |
Cards (3 distinct)
| # | Background | Border | Radius | Padding | Shadow |
|---|---|---|---|---|---|
| 1 | #F5F5F5 | none | 35.2px | 24px 48px | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.1) 0px 2px 4px -2px |
| 2 | #FFFFFF | none | 35.2px | 32px 32px | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px |
| 3 | #FFFFFF | 1px solid rgba(0, 0, 0, 0.05) | 35.2px | 32px 32px | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px |
Rules: what never to do in the Upstash style
- NEVER substitute generic uncalibrated gray backgrounds for Upstash’s exact
#F5F5F5canvas and#FFFFFFsurface pairing. - NEVER replace
Inter Tightdisplay typography or ignore its signature scale (128px / -0.025em (w700)). - NEVER use thick opaque borders that clash with
rgba(0, 0, 0, 0.05)(1px rgba(0,0,0,0.05)). - NEVER deviate from the signature button geometry (
10px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with
JetBrains Mono.
Copy-paste kit
CSS variables
:root {
/* Upstash style — extracted from upstash.com by taste-skill */
--canvas: #F5F5F5;
--surface: #FFFFFF;
--text: #022C22;
--text-muted: #71717B;
--accent: #00BC7D;
--border: rgba(0, 0, 0, 0.05);
--font-heading: 'Inter Tight', Inter, system-ui, -apple-system, sans-serif;
--font-body: Inter, Inter, system-ui, -apple-system, sans-serif;
--font-mono: 'JetBrains Mono', 'JetBrains Mono', ui-monospace, monospace;
--h1-size: 128px;
--h1-tracking: -0.025em;
--h1-weight: 700;
--radius-button: 10px;
--radius-common: 35.2px;
--shadow-common: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px;
--ease: cubic-bezier(0.4, 0, 0.2, 1);
--duration: 0.15s;
}tailwind.config.js
// tailwind.config.js — Upstash style tokens (taste-skill)
module.exports = {
theme: {
extend: {
colors: {
canvas: "#F5F5F5",
surface: "#FFFFFF",
ink: "#022C22",
muted: "#71717B",
accent: "#00BC7D",
line: "rgba(0, 0, 0, 0.05)",
},
fontFamily: {
heading: ["Inter Tight", 'Inter', 'system-ui', 'sans-serif'],
sans: ["Inter", 'Inter', 'system-ui', 'sans-serif'],
mono: ["JetBrains Mono", 'ui-monospace', 'monospace'],
},
fontSize: { display: ["128px", { letterSpacing: "-0.025em", fontWeight: "700" }] },
borderRadius: { button: "10px", card: "35.2px" },
boxShadow: { brand: "rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 1px 2px 0px" },
transitionTimingFunction: { brand: "cubic-bezier(0.4, 0, 0.2, 1)" },
},
},
};.cursor/skills/upstash-style/SKILL.md
--- name: upstash-style description: Build UI in the Upstash visual style (Oversized Emerald Typography & Clean Serverless Daylight). Use when the user asks for a Upstash-like look. --- # Upstash Style — Quick Rules (source: upstash.com, extracted by taste-skill) ## Tokens - canvasBg: #F5F5F5 — Primary Upstash page canvas - surfaceElevated: #FFFFFF — Primary elevated card & bento surface - surfaceSecondary: rgba(0, 115, 89, 0.08) — Secondary interactive container / hover fill - borderPrimary: rgba(0, 0, 0, 0.05) — Primary structural divider (1px rgba(0,0,0,0.05)) - borderSecondary: rgba(255, 255, 255, 0.1) — Secondary nested module or pill border - textPrimary: #022C22 — Hero H1, section H2 & high-contrast foreground - textMuted: #71717B — Lead paragraphs, descriptions & muted labels - accentPrimary: #00BC7D — Primary interactive CTA & brand highlight (10px) - accentSecondary: #00BC7D — Secondary badge, syntax or telemetry highlight ## Typography - Heading font: Inter Tight; body: Inter; mono: JetBrains Mono - Hero H1: 128px | line-height 128px (leading-[1]) | letter-spacing -3.2px (tracking-[-0.025em]) | weight 700 (font-[700]) | color rgba(0, 0, 0, 0) (text-[rgba(0,0,0,0)]) | font Inter Tight - Section H2 (Primary): 48px | line-height 48px (leading-[1]) | letter-spacing 0px (tracking-[0em]) | weight 600 (font-[600]) | color #022C22 (text-[#022C22]) | font Inter Tight - Card / Feature H3: 24px | line-height 32px (leading-[1.33]) | letter-spacing 0px (tracking-[0em]) | weight 600 (font-[600]) | color #022C22 (text-[#022C22]) | font Inter Tight - Body Copy (Paragraph): 16px | line-height 24px (leading-[1.5]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #71717B (text-[#71717B]) | font Inter ## Components - Primary button: height 40px, padding 0px 20px, radius 10px, bg #FFFFFF, text #065F46, 16px / 500 - Card: bg #F5F5F5, border none, radius 35.2px, padding 24px 48px ## Never - NEVER substitute generic uncalibrated gray backgrounds for Upstash’s exact #F5F5F5 canvas and #FFFFFF surface pairing. - NEVER replace Inter Tight display typography or ignore its signature scale (128px / -0.025em (w700)). - NEVER use thick opaque borders that clash with rgba(0, 0, 0, 0.05) (1px rgba(0,0,0,0.05)). - NEVER deviate from the signature button geometry (10px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with JetBrains Mono. Full 120-line spec: https://taste-skill.pages.dev/taste/upstash/
Or install the full spec
npx taste-skill add upstash
Related
Upstash full token specUpstash ButtonsUpstash CardsUpstash Pricing TableNeon vs UpstashVercel vs UpstashSupabase vs UpstashClerk vs UpstashPlanetScale vs Upstash
Similar styles
Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.
See taste-skill Pro →