---
version: alpha
name: Replicate-design-analysis
description: |
Replicate's marketing surfaces pair the warm-cream developer-tools aesthetic
of an indie ML playground with a confident hot-orange brand accent and a
signature display typeface (rb-freigeist-neue) sized aggressively large at
72px+. The system reads as "AI lab notebook crossed with print magazine":
cream and bone surfaces, dark ink type, monospace code wells, irregular
hand-drawn-feeling diagrams, and a rich orange used scarcely on the most
consequential CTA. Photography of contributors and example outputs is
square-ish with mid-radius corners; everything else is borderless or hairline.
colors:
primary: "#ea2804"
primary-deep: "#c01f00"
on-primary: "#ffffff"
ink: "#202020"
body: "#3a3a3a"
charcoal: "#575757"
mute: "#646464"
ash: "#8d8d8d"
stone: "#bbbbbb"
on-dark: "#fcfcfc"
on-dark-mute: "rgba(252,252,252,0.72)"
canvas: "#f9f7f3"
surface-bone: "#f3f0e8"
surface-card: "#ffffff"
surface-dark: "#202020"
surface-deep: "#000000"
hairline: "rgba(32,32,32,0.12)"
hairline-strong: "#202020"
divider-dark: "rgba(255,255,255,0.2)"
hero-warm: "#ea2804"
hero-glow: "#ff6a3d"
hero-pink: "#f4a8a0"
badge-success: "#2b9a66"
link: "#ea2804"
ring-focus: "rgba(59,130,246,0.5)"
github-dark: "#24292e"
typography:
display-xxl:
fontFamily: rb-freigeist-neue
fontSize: 128px
fontWeight: 700
lineHeight: 1.0
letterSpacing: -3px
display-xl:
fontFamily: rb-freigeist-neue
fontSize: 72px
fontWeight: 700
lineHeight: 1.0
letterSpacing: -1.8px
display-lg:
fontFamily: rb-freigeist-neue
fontSize: 48px
fontWeight: 700
lineHeight: 1.0
letterSpacing: -1px
display-md:
fontFamily: rb-freigeist-neue
fontSize: 30px
fontWeight: 600
lineHeight: 1.2
letterSpacing: -0.5px
heading-lg:
fontFamily: basier-square
fontSize: 38.4px
fontWeight: 600
lineHeight: 0.83
letterSpacing: -0.5px
heading-md:
fontFamily: basier-square
fontSize: 24px
fontWeight: 600
lineHeight: 1.33
letterSpacing: -0.35px
heading-sm:
fontFamily: basier-square
fontSize: 20px
fontWeight: 600
lineHeight: 1.4
letterSpacing: -0.3px
subtitle:
fontFamily: rb-freigeist-neue
fontSize: 18px
fontWeight: 600
lineHeight: 1.56
letterSpacing: 0
body-lg:
fontFamily: basier-square
fontSize: 18px
fontWeight: 400
lineHeight: 1.56
letterSpacing: 0
body-md:
fontFamily: basier-square
fontSize: 16px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0
body-sm:
fontFamily: basier-square
fontSize: 14px
fontWeight: 400
lineHeight: 1.43
letterSpacing: 0
button-md:
fontFamily: basier-square
fontSize: 16px
fontWeight: 600
lineHeight: 1.0
letterSpacing: 0
button-sm:
fontFamily: basier-square
fontSize: 14px
fontWeight: 600
lineHeight: 1.0
letterSpacing: 0
caption:
fontFamily: basier-square
fontSize: 12px
fontWeight: 400
lineHeight: 1.33
letterSpacing: 0
caption-tight:
fontFamily: basier-square
fontSize: 14px
fontWeight: 600
lineHeight: 1.43
letterSpacing: -0.35px
code-md:
fontFamily: jetbrains-mono
fontSize: 14px
fontWeight: 400
lineHeight: 1.43
letterSpacing: 0
code-sm:
fontFamily: jetbrains-mono
fontSize: 11px
fontWeight: 400
lineHeight: 1.5
letterSpacing: 0
rounded:
none: 0px
xs: 4px
sm: 6px
md: 10px
lg: 16px
full: 9999px
spacing:
xxs: 2px
xs: 4px
sm: 8px
md: 12px
lg: 16px
xl: 24px
xxl: 32px
xxxl: 48px
section: 96px
band: 160px
components:
button-primary:
backgroundColor: "{colors.primary}"
textColor: "{colors.on-primary}"
typography: "{typography.button-md}"
rounded: "{rounded.full}"
padding: 12px 24px
height: 44px
button-primary-pressed:
backgroundColor: "{colors.primary-deep}"
textColor: "{colors.on-primary}"
typography: "{typography.button-md}"
rounded: "{rounded.full}"
button-dark:
backgroundColor: "{colors.surface-dark}"
textColor: "{colors.on-dark}"
typography: "{typography.button-md}"
rounded: "{rounded.full}"
padding: 12px 24px
height: 44px
button-outline:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
typography: "{typography.button-md}"
rounded: "{rounded.full}"
padding: 11px 23px
height: 44px
button-ghost:
backgroundColor: "{colors.canvas}"
textColor: "{colors.ink}"
typography: "{typography.button-md}"
rounded: "{rounded.full}"
padding: 8px 16px
height: 36px
button-icon:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
rounded: "{rounded.full}"
size: 36px
text-input:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
typography: "{typography.body-md}"
rounded: "{rounded.full}"
padding: 12px 20px
height: 44px
hero-band:
backgroundColor: "{colors.hero-warm}"
textColor: "{colors.on-dark}"
typography: "{typography.display-xl}"
rounded: "{rounded.none}"
padding: 96px 32px
model-card:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
typography: "{typography.body-md}"
rounded: "{rounded.md}"
padding: 16px
collection-tile:
backgroundColor: "{colors.canvas}"
textColor: "{colors.ink}"
typography: "{typography.heading-md}"
rounded: "{rounded.md}"
padding: 24px
pricing-tier:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
typography: "{typography.body-md}"
rounded: "{rounded.lg}"
padding: 32px
pricing-tier-featured:
backgroundColor: "{colors.surface-dark}"
textColor: "{colors.on-dark}"
typography: "{typography.body-md}"
rounded: "{rounded.lg}"
padding: 32px
code-block:
backgroundColor: "{colors.surface-dark}"
textColor: "{colors.on-dark}"
typography: "{typography.code-md}"
rounded: "{rounded.md}"
padding: 24px
code-tab:
backgroundColor: "{colors.surface-deep}"
textColor: "{colors.on-dark-mute}"
typography: "{typography.code-sm}"
rounded: "{rounded.xs}"
padding: 6px 12px
badge-status:
backgroundColor: "{colors.badge-success}"
textColor: "{colors.on-dark}"
typography: "{typography.caption}"
rounded: "{rounded.full}"
padding: 4px 10px
badge-tag:
backgroundColor: "{colors.canvas}"
textColor: "{colors.ink}"
typography: "{typography.caption}"
rounded: "{rounded.full}"
padding: 4px 10px
nav-bar:
backgroundColor: "{colors.canvas}"
textColor: "{colors.ink}"
typography: "{typography.button-sm}"
rounded: "{rounded.none}"
height: 60px
sub-nav-pill:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
typography: "{typography.button-sm}"
rounded: "{rounded.full}"
padding: 6px 14px
contributor-avatar:
backgroundColor: "{colors.surface-card}"
textColor: "{colors.ink}"
rounded: "{rounded.full}"
size: 40px
footer:
backgroundColor: "{colors.surface-deep}"
textColor: "{colors.on-dark}"
typography: "{typography.body-sm}"
rounded: "{rounded.none}"
padding: 64px 32px
---
Overview
Section 01Replicate is a developer-tools platform with the soul of an art zine. The
public marketing surfaces sit on a warm cream canvas (`{colors.canvas}` —
`#f9f7f3`) rather than the white-or-near-black default of typical AI
infrastructure sites, and that single decision colours everything else:
photography reads as editorial, code wells read as printed pull-quotes, and
the brand orange (`{colors.primary}` — `#ea2804`) feels like a stamp rather
than a notification.
The typography is the load-bearing decoration. **rb-freigeist-neue** — a
heavy, slightly condensed grotesque — appears at sizes up to 128px in hero
bands, with a tight `lineHeight: 1.0` and negative letter-spacing that lets
multi-line headlines pack into geometric blocks. The companion family,
**basier-square**, takes care of body, button labels, and metadata in the
14–18px range. **JetBrains Mono** carries every code well, command, and
example. Three families, three jobs, no overlap.
Page rhythm cycles between a default cream canvas, a bold full-bleed orange
hero band, and a `{colors.surface-dark}` (`#202020`) section that hosts the
code stories — the "how it works" walkthrough. Curves are intentional and
soft: every interactive surface (buttons, inputs, tags, avatars) uses
`{rounded.full}`, while content cards and code wells step up to `{rounded.md}`
or `{rounded.lg}`. There are no sharp corners on Replicate; the system reads
as friendly precision.
**Key Characteristics:**
Colors
Section 02Brand & Accent
Section 03Surface
Section 04Text
Section 05Semantic
Section 06Typography
Section 07Font Family
Section 08Replicate ships a deliberate three-family stack:
When proprietary families cannot be licensed, **Bricolage Grotesque** or **Migra** are credible substitutes for rb-freigeist-neue, and **Geist** or **Inter** can stand in for basier-square. JetBrains Mono is open-source and should always be used directly.
Hierarchy
Section 09| Token | Size | Weight | Line Height | Letter Spacing | Use |
|---|---|---|---|---|---|
| `{typography.display-xxl}` | 128px | 700 | 1.0 | -3px | The single hero "Run AI" / "Imagine what you can build" headline. One per page. |
| `{typography.display-xl}` | 72px | 700 | 1.0 | -1.8px | Section openers ("How it works", "Scale on Replicate"). |
| `{typography.display-lg}` | 48px | 700 | 1.0 | -1px | Sub-section titles, pricing tier names. |
| `{typography.display-md}` | 30px | 600 | 1.2 | -0.5px | Feature card titles. |
| `{typography.heading-lg}` | 38.4px | 600 | 0.83 | -0.5px | Tightly-stacked basier-square headlines, used in pricing and enterprise hero. |
| `{typography.heading-md}` | 24px | 600 | 1.33 | -0.35px | Card titles, model detail headers. |
| `{typography.heading-sm}` | 20px | 600 | 1.4 | -0.3px | List section headers. |
| `{typography.subtitle}` | 18px | 600 | 1.56 | 0 | Lead paragraphs in display sections. |
| `{typography.body-lg}` | 18px | 400 | 1.56 | 0 | Marketing prose. |
| `{typography.body-md}` | 16px | 400 | 1.5 | 0 | Default body. |
| `{typography.body-sm}` | 14px | 400 | 1.43 | 0 | Captions, metadata. |
| `{typography.button-md}` | 16px | 600 | 1.0 | 0 | Default button label. |
| `{typography.button-sm}` | 14px | 600 | 1.0 | 0 | Compact button label, sub-nav pills. |
| `{typography.caption}` | 12px | 400 | 1.33 | 0 | Footer disclosure, copyright. |
| `{typography.caption-tight}` | 14px | 600 | 1.43 | -0.35px | Emphatic small caption used in pricing tier rows. |
| `{typography.code-md}` | 14px | 400 | 1.43 | 0 | Code blocks and inline code. |
| `{typography.code-sm}` | 11px | 400 | 1.5 | 0 | Code-tab labels and small inline tokens. |
Principles
Section 010Note on Font Substitutes
Section 011When the proprietary families are unavailable, clamp display `lineHeight` to 1.0 explicitly and apply a -3% letter-spacing on display-xxl / display-xl to match the original tightness. Substitutes typically render with looser tracking by default.
Layout
Section 012Spacing System
Section 013Grid & Container
Section 014Whitespace Philosophy
Section 015Elevation & Depth
Section 016| Level | Treatment | Use |
|---|---|---|
| 0 — flat | No shadow, no border | Default cream canvas, full-bleed bands. |
| 1 — outline | 1px solid `{colors.hairline}` or `{colors.hairline-strong}` | Model cards, pricing tiers, collection tiles. |
| 2 — bone inset | Surface colour shift to `{colors.surface-bone}` inside a `{colors.canvas}` band | Feature group containers, "How it works" walkthrough. |
| 3 — dark inversion | Card swaps to `{colors.surface-dark}` against cream | Code wells, featured pricing tier, "Scale on Replicate" hero card. |
| 4 — soft drop | `0 8px 24px rgba(32,32,32,0.08)` | Hover-anchored model thumbnails (visual only — not interaction-state-documented). |
Drop shadows exist in the extracted tokens but are restrained — used sparingly to lift photography thumbnails one step off the cream canvas. The dominant elevation language is colour-blocking.
Decorative Depth
Section 017Shapes
Section 018Border Radius Scale
Section 019| Token | Value | Use |
|---|---|---|
| `{rounded.none}` | 0px | Hero bands, full-bleed sections, footer. |
| `{rounded.xs}` | 4px | Code tabs, inline tags inside code wells. |
| `{rounded.sm}` | 6px | Mid-radius callouts, small inset chips. |
| `{rounded.md}` | 10px | Model cards, collection tiles, code wells. |
| `{rounded.lg}` | 16px | Pricing tiers, larger feature cards. |
| `{rounded.full}` | 9999px | Buttons, inputs, badges, avatars, pills. |
Photography Geometry
Section 020Components
Section 021Buttons
Section 022**`button-primary`** — orange CTA
**`button-dark`** — dark CTA
**`button-outline`** — outlined CTA
**`button-ghost`** — inline button
**`button-icon`** — icon button
Cards & Containers
Section 023**`model-card`** — model listing card
**`collection-tile`** — collection-of-models tile
**`pricing-tier`** — pricing tier card
**`pricing-tier-featured`** — featured pricing tier
**`code-block`** — code well
**`code-tab`** — code tab chip
**`hero-band`** — full-bleed hero
Inputs & Forms
Section 024**`text-input`** — default input
Navigation
Section 025**`nav-bar`** — top nav (desktop)
**`nav-bar`** (mobile)
**`sub-nav-pill`** — sub-nav chip
Signature Components
Section 026**`badge-status`** — model status badge
**`badge-tag`** — neutral tag
**`contributor-avatar`** — community contributor
**`footer`** — global footer
Do's and Don'ts
Section 027Do
Section 028Don't
Section 029Responsive Behavior
Section 030Breakpoints
Section 031| Name | Width | Key Changes |
|---|---|---|
| Desktop XL | ≥ 1440px | Full max-width 1280 body, hero band runs full-bleed, 4-up model grid. |
| Desktop | 1280–1439px | Container shrinks; padding `{spacing.xl}` (24px) sides. |
| Tablet Large | 1024–1279px | Model grid 3-up, code-story splits remain 2-up. |
| Tablet | 768–1023px | Model grid 2-up, code-story stacks (narrative on top, code below), pricing stacks vertically. |
| Mobile Large | 426–767px | Model grid 1-up at 480px+, nav collapses to hamburger, hero `{typography.display-xxl}` clamps to 64px. |
| Mobile | ≤ 425px | All grids 1-up, hero clamps to 48px, section padding `{spacing.section}` collapses to 64px. |
Touch Targets
Section 032Collapsing Strategy
Section 033Image Behavior
Section 034Iteration Guide
Section 0351. Focus on ONE component at a time. Most interactive elements share `{rounded.full}` and the `{colors.canvas}` / `{colors.surface-card}` pair — only the role-specific tokens (`{colors.primary}`, `{component.code-block}`) shift between variants.
2. Reference component names and tokens directly (`{colors.primary}`, `{component.button-primary-pressed}`, `{rounded.lg}`) — do not paraphrase.
3. Run `npx @google/design.md lint DESIGN.md` after edits; orphaned-tokens warnings will catch unused entries.
4. Add new variants as separate entries (`-pressed`, `-disabled`, `-featured`) — do not bury them in prose.
5. Default body type to `{typography.body-md}`; reach for `{typography.subtitle}` only on hero subtitles.
6. Keep `{colors.primary}` scarce — if more than one orange element appears per viewport, ask whether one should drop to `{colors.surface-dark}` instead.