OpenAI Brand Design System Deep Dive
1. Brand Overview
OpenAI’s visual language is stripped down, confident, and intentionally restrained. This isn’t a brand screaming for attention with saturated color blasts or ornamental UI — it’s a brand that lets content and interaction carry the weight. The vibe is high‑trust tech, aimed at professionals, researchers, and developers but accessible enough for curious general users.
The most immediate signal: the heavy use of black (#000000) and near‑neutral grays. This anchors the interface in seriousness. White is used sparingly, often as text or icon color against dark contexts, or as a button background in secondary actions. The entire system reads as understated but precise — nothing here is accidental.
Typography is custom (OpenAI Sans), supporting a clean geometric feel without leaning too humanist or too industrial. The type is set with tight letterspacing for large headings (−1.44px at 48px size) and rational line heights that balance density with legibility. You can feel the design team’s control over rhythm — it’s not relying on defaults.
The spacing scale is an 8px base, but it allows for micro‑adjustments (2px, 3px, 6px) where precision matters. This is common in brands that care about optical balance over strict mathematical scaling. Breakpoints are classic Tailwind defaults (640px, 768px, 1024px, 1280px, 1536px), meaning responsive behavior is predictable and developer‑friendly.
What stands out most: components feel “quiet” until interacted with. Buttons often have transparent or low‑opacity backgrounds until hover, when they invert color schemes or increase contrast. This is a deliberate choice — the interface doesn’t draw your eye with visual noise, it rewards interaction.
From a design philosophy perspective, OpenAI’s brand says: “We are serious about AI, we trust you to explore, and we won’t overwhelm you with decoration.” If you’re building in this system, you need to respect that restraint.
2. Color System
2.1 Primary Colors
Primary in this system isn’t a bright hue — it’s a semi‑transparent black (rgba(0, 0, 0, 0.6)) used as the semantic “primary” color. That’s unusual. Most brands use a vivid color for primary to signal action. Here, primary is about text and icon color in key interactions. Secondary is even lighter (rgba(0, 0, 0, 0.44)), often used for less important text or icon states.
Psychologically, this makes the brand feel calm, authoritative, and non‑intrusive. No high‑energy blues or reds here — just neutrals. Compared to competitors in the AI space (Anthropic, DeepMind), which lean on blues and gradients, OpenAI’s palette says “we’re the minimalists in the room.”
2.2 Complete Palette
| Color Name | Hex | Role | Usage |
|---|---|---|---|
| Primary | rgba(0, 0, 0, 0.6) | Semantic primary | Main interactive text/icons |
| Secondary | rgba(0, 0, 0, 0.44) | Semantic secondary | Less prominent text/icons |
| Gray-100 | #e5e7eb | Neutral light | Dividers, subtle backgrounds |
| Black | #000000 | Core text | Headings, body text, icons |
| White | #ffffff | Background/text | Button backgrounds, text on dark |
| Black-72 | rgba(0, 0, 0, 0.72) | Interaction state | Focus rings, hover states |
| Black-8 | rgba(0, 0, 0, 0.086) | Hover/focus | Very light overlay |
| Black-71.8 | rgba(0, 0, 0, 0.718) | Hover/focus | High-contrast overlay |
| Accent1 | #0066dc | CSS variable | Accent actions |
| Accent2 | #007bff | CSS variable | Accent actions |
| Accent3 | #3c93ff | CSS variable | Accent actions |
| Vivid1 | #ffcc00 | CSS variable | Highlights |
| Elevation1 | #292d39 | CSS variable | Dark surfaces |
| Elevation2 | #181c20 | CSS variable | Darker surfaces |
| Elevation3 | #373c4b | CSS variable | Darkest surfaces |
| Highlight1 | #535760 | CSS variable | Emphasis text/icons |
| FolderWidgetColor | #8c92a4 | CSS variable | UI widget accents |
| RingColor | rgba(59,130,246,.5) | Ring/focus | Focus outlines |
| RingOffsetColor | #ffffff | Ring offset | Inverted focus rings |
2.3 Color Relationships
Contrast is high between black text (#000000) and white backgrounds — WCAG AAA compliance for body text sizes. The semi‑transparent blacks are trickier; rgba(0, 0, 0, 0.44) over white gives ~4.5:1 ratio — borderline AAA for large text, but safe for UI labels.
Dark mode is implicit in the CSS variables (--leva-colors-elevation1/2/3), suggesting surfaces shift from light gray to layered darks. Accent blues (#0066dc, #007bff, #3c93ff) are reserved for interactive states — they’re not part of the neutral UI.
2.4 Usage Guide
- Keep primary (
rgba(0, 0, 0, 0.6)) for interactive text/icons. Don’t use it for body copy. - Secondary (
rgba(0, 0, 0, 0.44)) is for placeholders, disabled states, or secondary actions. - White backgrounds with black text are the default “light mode” surface.
- Accent blues are for CTAs and focus rings — avoid using them for decorative color blocking.
- The vivid yellow (
#ffcc00) is rare — use only for highlight or warning contexts. - Avoid mixing elevation grays with pure white — pick one surface mode per context.
3. Typography
3.1 Font Families
All typography uses OpenAI Sans. No fallbacks are explicitly listed in the data — meaning it’s likely a custom hosted font. No Google Fonts, no Adobe Fonts. It’s probably variable internally, but variableFonts flag is false, so static weights are used.
3.2 Type Scale
| Element | Font | Size | Weight | Line Height |
|---|---|---|---|---|
| Heading-1 | OpenAI Sans | 48px (3.00rem) | 500 | 1.16 |
| Heading-1 | OpenAI Sans | 22px (1.38rem) | 500 | 1.26 |
| Heading-1 | OpenAI Sans | 18px (1.13rem) | 500 | 1.32 |
| Heading-1 | OpenAI Sans | 17px (1.06rem) | 400 | 1.65 |
| Button | OpenAI Sans | 17px (1.06rem) | 400 | 1.65 |
| Link | OpenAI Sans | 17px (1.06rem) | 400 | 1.65 |
| Link | OpenAI Sans | 14px (0.88rem) | 500 | 1.00 |
| Button | OpenAI Sans | 14px (0.88rem) | 500 | 1.00 |
| Caption | OpenAI Sans | 14px (0.88rem) | 500 | 1.64 |
| Caption | OpenAI Sans | 14px (0.88rem) | 400 | 1.64 |
3.3 Hierarchy
The heading sizes are unusual — multiple “heading-1” contexts with different sizes. This implies a modular heading system where H1 style is reused across different breakpoints or modules. The tight letterspacing on large headings (−1.44px) adds weight and presence.
Body text is often the 17px/400 weight style — comfortable for reading, not too dense. Captions drop to 14px but keep generous line height (1.64), improving legibility in small type. This hierarchy is subtle — there’s no massive jumps like 48px to 16px; instead, it’s a smooth scale, keeping the brand feeling consistent across contexts.
4. Spacing & Layout
4.1 Spacing Scale
Base: 8px grid, but with optical tweaks.
| Value (px) | Rem | Count | Notes |
|---|---|---|---|
| 2 | 0.13rem | 50 | Micro gaps |
| 3 | 0.19rem | 1 | Rare |
| 6 | 0.38rem | 6 | Small gaps |
| 8 | 0.50rem | 48 | Base unit |
| 8.15625 | 0.51rem | 1 | Precision tweak |
| 12 | 0.75rem | 102 | Common padding |
| 16 | 1.00rem | 38 | Base step up |
| 20 | 1.25rem | 6 | Medium gaps |
| 24 | 1.50rem | 3 | Component padding |
| 32 | 2.00rem | 13 | Section gaps |
| 46 | 2.88rem | 1 | Specific layout |
| 48 | 3.00rem | 1 | Large heading gap |
| 64 | 4.00rem | 1 | Hero spacing |
| 80 | 5.00rem | 1 | Large section padding |
| 120 | 7.50rem | 3 | Strategic whitespace |
| 187 | 11.69rem | 2 | Hero layouts |
| 264 | 16.50rem | 7 | Massive spacing, likely modals/marketing |
4.2 Layout
Breakpoints: 640px, 768px, 1024px, 1280px, 1536px. Classic Tailwind. Responsive layout is predictable: mobile-first, scale up. The large spacing tokens (120px, 187px, 264px) suggest generous hero/landing page layouts.
5. Visual Elements
Border Radius
| Value | Count | Elements | Notes |
|---|---|---|---|
| 4px | 4 | a | Small buttons/links |
| 6.08px | 64 | div, a, li, menu items | Default component radius |
| 24px | 1 | label | Custom form |
| 40px | 6 | a, div, button | Large pill buttons |
| 9999px | 11 | various | Full pill avatars/buttons |
Shadows
Only one subtle shadow: rgba(0, 0, 0, 0.04) 0px 1px 2px 0px. Flat design dominates — shadows aren’t part of the depth system. Borders (1px solid rgba(0, 0, 0, 0.12)) are rare, used for light separation.
6. Components
6.1 Buttons
Variant 1 (transition pill)
- Default:
background: rgba(0, 0, 0, 0.04),color: #000000, padding0px 20px,border-radius: 40px, no border, opacity0. - Hover:
background: rgba(0, 0, 0, 0.25),color: #ffffff, transform applied (translate/rotate/skew/scale). - Active:
background: transparent,box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow). - Focus:
color: hsl(var(--twc-primary-60)),background: var(--tweet-color-blue-primary-hover).
Font: 14px, weight 500.
Variant 2 (icon button)
- Default:
background: #ffffff,color: rgba(0, 0, 0, 0.44), padding8px,border-radius: 9999px, opacity1. - Hover/active/focus not defined in extracted data.
Font: 17px, weight 400.
Variant 3 (dark pill)
- Default:
background: rgba(0, 0, 0, 0.44),color: rgba(255, 255, 255, 0.6), padding0px,border-radius: 9999px. - Hover/active/focus not defined.
Font: 17px, weight 400.
6.2 Links
Default: black text, no underline, weight 500. Hover states not detailed — likely color change.
6.3 Forms
No extracted inputs — likely minimalist with borderless or subtle styling.
6.4 Cards
No explicit card data — spacing tokens (24px, 32px) point to clean, flat surfaces with 6.08px radius.
7. Design Tokens
:root {
/* Colors */
--color-primary: rgba(0, 0, 0, 0.6);
--color-secondary: rgba(0, 0, 0, 0.44);
--color-gray-100: #e5e7eb;
--color-black: #000000;
--color-white: #ffffff;
--color-black-72: rgba(0, 0, 0, 0.72);
--color-black-8: rgba(0, 0, 0, 0.086);
--color-black-71_8: rgba(0, 0, 0, 0.718);
--color-accent1: #0066dc;
--color-accent2: #007bff;
--color-accent3: #3c93ff;
--color-vivid1: #ffcc00;
--color-elevation1: #292d39;
--color-elevation2: #181c20;
--color-elevation3: #373c4b;
--color-highlight1: #535760;
--color-folderWidget: #8c92a4;
--color-ring: rgba(59,130,246,.5);
--color-ring-offset: #ffffff;
/* Typography */
--font-family-primary: 'OpenAI Sans';
--font-size-h1-lg: 48px;
--font-size-h1-md: 22px;
--font-size-h1-sm: 18px;
--font-size-body: 17px;
--font-size-caption: 14px;
--line-height-h1-lg: 1.16;
--line-height-h1-md: 1.26;
--line-height-h1-sm: 1.32;
--line-height-body: 1.65;
--line-height-caption: 1.64;
--font-weight-regular: 400;
--font-weight-medium: 500;
/* Spacing */
--space-2: 2px;
--space-3: 3px;
--space-6: 6px;
--space-8: 8px;
--space-8_15625: 8.15625px;
--space-12: 12px;
--space-16: 16px;
--space-20: 20px;
--space-24: 24px;
--space-32: 32px;
--space-46: 46px;
--space-48: 48px;
--space-64: 64px;
--space-80: 80px;
--space-120: 120px;
--space-187: 187px;
--space-264: 264px;
/* Radius */
--radius-sm: 4px;
--radius-md: 6.08px;
--radius-lg: 24px;
--radius-xl: 40px;
--radius-full: 9999px;
/* Shadows */
--shadow-subtle: rgba(0, 0, 0, 0.04) 0px 1px 2px 0px;
}8. AI Coding Assistant Prompt
# OpenAI Design System Specification
You are an OpenAI design expert. Build UIs matching their visual language exactly.
## Brand Context
OpenAI’s design language is neutral, restrained, and precision-driven. It uses a minimal color palette dominated by black, white, and subtle grays. Interactions are understated until hover/focus. Typography is custom and tight, spacing follows an 8px grid with micro adjustments.
## Color Palette
- Primary: rgba(0, 0, 0, 0.6) — Interactive text/icons
- Secondary: rgba(0, 0, 0, 0.44) — Secondary text/icons
- Gray-100: #e5e7eb — Dividers, backgrounds
- Black: #000000 — Core text
- White: #ffffff — Backgrounds, text on dark
- Black-72: rgba(0, 0, 0, 0.72) — Hover/focus
- Black-8: rgba(0, 0, 0, 0.086) — Light overlay
- Black-71.8: rgba(0, 0, 0, 0.718) — Dark overlay
- Accent1: #0066dc — Accent actions
- Accent2: #007bff — Accent actions
- Accent3: #3c93ff — Accent actions
- Vivid1: #ffcc00 — Highlights
- Elevation1: #292d39 — Dark surfaces
- Elevation2: #181c20 — Darker surfaces
- Elevation3: #373c4b — Darkest surfaces
- Highlight1: #535760 — Emphasis
- FolderWidget: #8c92a4 — Widget UI
- RingColor: rgba(59,130,246,.5) — Focus outlines
- RingOffsetColor: #ffffff — Ring offsets
## Typography
Font family: "OpenAI Sans"
Levels:
| Level | Size | Weight | Line Height | Use |
| H1 Large | 48px | 500 | 1.16 | Page titles |
| H1 Medium | 22px | 500 | 1.26 | Section headings |
| H1 Small | 18px | 500 | 1.32 | Subheadings |
| Body | 17px | 400 | 1.65 | Paragraph text |
| Link/Button | 14px | 500 | 1.00 | UI labels |
| Caption Medium | 14px | 500 | 1.64 | Small labels |
| Caption Regular | 14px | 400 | 1.64 | Secondary captions |
## Spacing & Grid
Base: 8px grid with micro units.
Values: 2px, 3px, 6px, 8px, 8.15625px, 12px, 16px, 20px, 24px, 32px, 46px, 48px, 64px, 80px, 120px, 187px, 264px.
## Border Radius
- sm: 4px — Small buttons/links
- md: 6.08px — Default components
- lg: 24px — Labels/forms
- xl: 40px — Large pill buttons
- full: 9999px — Avatars, full pills
## Shadows & Depth
Flat design. Minimal shadow: rgba(0, 0, 0, 0.04) 0px 1px 2px 0px.
## Component Specifications
### Primary Button
Default:
```css
background: rgba(0,0,0,0.04);
color: #000000;
padding: 0 20px;
border-radius: 40px;
font-weight: 500;
font-size: 14px;
border: none;
opacity: 0;
```
Hover:
```css
background: rgba(0,0,0,0.25);
color: #ffffff;
transform: translate(var(--tw-translate-x),var(--tw-translate-y));
```
Active:
```css
background: transparent;
box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow);
```
Focus:
```css
color: hsl(var(--twc-primary-60));
background: var(--tweet-color-blue-primary-hover);
```
### Secondary Icon Button
```css
background: #ffffff;
color: rgba(0,0,0,0.44);
padding: 8px;
border-radius: 9999px;
font-size: 17px;
font-weight: 400;
```
### Dark Pill Button
```css
background: rgba(0,0,0,0.44);
color: rgba(255,255,255,0.6);
border-radius: 9999px;
font-size: 17px;
```
### Navigation Link
```css
color: #000000;
text-decoration: none;
font-weight: 500;
```
## Layout & Responsive Rules
Breakpoints: 640px, 768px, 1024px, 1280px, 1536px.
Page padding: multiples of 8px scale.
## Interaction Rules
- Transition timing: use Tailwind `duration-short` (~150ms) ease curves.
- Focus indicators: ring color rgba(59,130,246,.5) with offset #ffffff.
- Hover states: increase contrast, invert text color on dark backgrounds.
## DO
- Use only palette colors.
- Maintain 8px grid.
- Keep typography weights as specified.
- Use full-radius only for pills/avatars.
- Apply hover states only on interactive elements.
- Respect opacity levels for disabled states.
## DON'T
- Introduce new colors.
- Apply shadows beyond subtle default.
- Mix sharp and rounded corners in same context.
- Change font family.
- Overuse accent colors — reserve for actions.
## Code Examples
Primary Button (Tailwind):
```html
<button class="bg-black/4 text-black px-5 rounded-[40px] font-medium text-sm hover:bg-black/25 hover:text-white transition ease-in-out duration-150">
Click Me
</button>
```
Secondary Icon Button:
```html
<button class="bg-white text-black/44 p-2 rounded-full text-base">
<svg>...</svg>
</button>
```
Card:
```html
<div class="bg-white rounded-[6.08px] p-6 shadow-[rgba(0,0,0,0.04)_0px_1px_2px_0px]">
Card content
</div>
```9. Summary
TL;DR — OpenAI’s system is neutral, precise, and interaction‑driven. Everything is built on black, white, and subtle grays, with rare accent blues/yellows for action. Typography is tight and custom, spacing follows an 8px grid but flexes for optical balance. Buttons are understated until hover, shadows are nearly absent.
Brand Keywords:
- neutral-authoritative
- restrained-interactive
- tech-minimalist
- precision-driven
- content-first