DESIGN.md inspired by GitLab
Light DevOps-platform marketing — GitLab Sans, near-black ink, oversized 96px headlines, tanuki-orange accent.
Compare to…
- bg
#ffffff - bg-soft
#f2f1f5 - surface
#ffffff - surface-soft
#f2f1f5 - surface-ink
#171321 - text AAA · 18.2
#171321 - text-strong
#171321 - text-soft
#4d4a57 - text-muted
#6e6b78 - text-faint — · 2.8
#9b99a3 - on-brand
#ffffff - brand — · 2.9
#fc6d26 - brand-red
#e24329 - brand-purple
#6e49cb - brand-soft
rgba(252, 109, 38, 0.10) - brand-gradient
linear-gradient(135deg, #fc6d26 0%, #e24329 50%, #6e49cb 100%) - cta-bg
#171321 - cta-text
#ffffff - cta-hover
#2b2640 - cta-light-bg
#ffffff - cta-light-text
#171321 - link
#6e49cb - link-hover
#5a3aa8 - border AAA · 18.2
#171321 - border-soft
#dcd9e3 - border-faint
#ece9f1 - semantic-success
#108548 - semantic-warning
#c17d10 - semantic-danger
#dd2b0e - semantic-info
#6e49cb - shadow-tint
rgba(23, 19, 33, 0.10)
- step-0 0px
- step-1 4px
- step-2 8px
- step-3 12px
- step-4 16px
- step-5 24px
- step-6 32px
- step-7 48px
- step-8 64px
- step-9 96px
- step-10 128px
- micro
2px - sm
4px - md
8px - lg
12px - xl
16px - 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 → —
- muted → text-muted
- border → border
- ring → brand
GitLab's marketing site is the bright contrarian in a dev-tool category that overwhelmingly chose the dark canvas. Where GitHub, Linear, and Vercel ground their marketing in near-black, GitLab runs a pure-white `#ffffff` page with near-black `#171321` ink — a faintly purple-tinted black that quietly nods to the tanuki logo's purple end-stop. The type does the heavy lifting: GitLab Sans (the open-source variable family GitLab commissioned to replace the licensed Source Sans era) renders hero headlines at a striking 96px on a custom 660 weight — heavier than 600, lighter than 700, a register tuned for oversized display without tipping into black-weight shout. The whole system descends from GitLab's Pajamas design system, the deeply-tokened language that powers both the product UI and the marketing chrome. Chrome stays disciplined: primary CTAs are flat dark-on-white or white-on-dark blocks at a tight 4px radius, borders are high-contrast `#171321` hairlines, and the brand's chromatic energy is concentrated in the tanuki gradient — orange `#fc6d26` → red `#e24329` → purple `#6e49cb` — with the orange carrying accent duty on the rare key spark. The influence map runs from Swiss editorial typography (big type, tight grid, generous white space) through Pajamas' systematic tokening to the broader 2020s dev-tool marketing language that GitLab inverts by staying light. The orange is the one thing that is unmistakably GitLab — the diff-green of GitHub has no analog here; instead the fox-fire orange marks the brand the way a highlighter marks a page.
- Internal design system informing both product UI and marketing tokens
- Commissioned variable display family — primary type signature at custom 660 weight
- Logo + orange→red→purple gradient that defines the accent palette
- Big-type, tight-grid, white-space editorial lineage behind the oversized headlines
- Adjacent dev-platform marketing language GitLab inverts by choosing light over dark
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: GitLab
tagline: Light DevOps-platform marketing — GitLab Sans, near-black ink, oversized 96px headlines, tanuki-orange accent.
updated_at: 2026-05-28T23:11:49.553Z
published_at: 2026-05-28T23:11:49.553Z
author: webdesignhot
source_url: https://about.gitlab.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [dev-tools, saas]
tags: [light, structured, sans, developer, devops, orange]
preview_swatch: ['#ffffff', '#fc6d26', '#171321']
related: [github, vercel, linear]
description: 'GitLab''s marketing surface is the bright counterweight to the dev-tool dark-canvas crowd: a pure-white ground, near-black `#171321` ink with a faint purple tint, and enormous GitLab Sans headlines that run to 96px at a custom 660 weight. The chrome is restrained and high-contrast — primary CTAs are dark-on-white or white-on-dark blocks at a tight 4px radius — while the brand''s identity lives in the tanuki logo''s orange→red→purple gradient, with the orange `#fc6d26` carrying accent duty. The system reads as a confident, single-platform DevSecOps story told in plain black-on-white, letting the type size and the orange spark do the work that other dev tools hand to neon-on-black.'
# 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
muted: text-muted
border: border
ring: brand
themes:
default: light
available: [light]
switch-via: 'none — marketing chrome is light-only; no theme toggle on about.gitlab.com'
colors:
bg: '#ffffff' # canvas — pure white marketing ground
bg-soft: '#f2f1f5' # subtle band / soft button — faint purple-grey wash
surface: '#ffffff' # primary card surface (border-defined, not fill-defined)
surface-soft: '#f2f1f5' # secondary surface — soft cards, code-sample wells
surface-ink: '#171321' # inverted dark surface — dark CTA, dark feature panel
text: '#171321' # primary ink — near-black with purple tint
text-strong: '#171321' # display emphasis (same ink — contrast comes from weight)
text-soft: '#4d4a57' # supporting copy, captions
text-muted: '#6e6b78' # secondary metadata, footer body
text-faint: '#9b99a3' # disabled / placeholder
on-brand: '#ffffff' # text on orange / on dark CTA
brand: '#fc6d26' # tanuki orange — primary brand accent
brand-red: '#e24329' # tanuki red — gradient mid-stop, hover/active orange
brand-purple: '#6e49cb' # tanuki purple — gradient end-stop, editorial accent
brand-soft: 'rgba(252, 109, 38, 0.10)' # tinted orange wash — eyebrow chips
brand-gradient: 'linear-gradient(135deg, #fc6d26 0%, #e24329 50%, #6e49cb 100%)' # tanuki gradient
cta-bg: '#171321' # primary CTA — dark-on-white block
cta-text: '#ffffff'
cta-hover: '#2b2640' # dark CTA hover — lifted ink
cta-light-bg: '#ffffff' # inverse CTA — white-on-dark / outline block
cta-light-text: '#171321'
link: '#6e49cb' # link — tanuki purple
link-hover: '#5a3aa8' # darker purple on hover
border: '#171321' # high-contrast structural border (button / card outline)
border-soft: '#dcd9e3' # hairline divider — purple-grey
border-faint: '#ece9f1' # faintest rule — table rows
semantic-success: '#108548' # GitLab green — pipeline passed
semantic-warning: '#c17d10' # amber — pending
semantic-danger: '#dd2b0e' # red — pipeline failed
semantic-info: '#6e49cb' # info — purple
shadow-tint: 'rgba(23, 19, 33, 0.10)'
typography:
display:
family: '"GitLab Sans", system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
weights: [500, 600, 660, 700]
opentype: ['kern', 'liga']
body:
family: '"GitLab Sans", system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
weights: [400, 500, 600]
opentype: ['kern', 'liga']
mono:
family: '"GitLab Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace'
weights: [400, 500]
opentype: ['kern', 'tnum']
scale:
display-hero: { size: 96, weight: 660, lineHeight: 1.0, tracking: '-0.03em', family: display }
display-lg: { size: 72, weight: 660, lineHeight: 1.02, tracking: '-0.028em', family: display }
display-md: { size: 56, weight: 660, lineHeight: 1.05, tracking: '-0.022em', family: display }
h1: { size: 48, weight: 660, lineHeight: 1.1, tracking: '-0.02em', family: display }
h2: { size: 40, weight: 600, lineHeight: 1.15, tracking: '-0.015em', family: display }
h3: { size: 32, weight: 600, lineHeight: 1.2, tracking: '-0.012em', 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-lg: { size: 20, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body: { size: 18, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-base: { size: 16, weight: 400, lineHeight: 1.55, tracking: '0', family: body }
body-sm: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: body }
label: { size: 14, weight: 600, lineHeight: 1.0, tracking: '0', family: body }
eyebrow: { size: 13, weight: 600, lineHeight: 1.4, tracking: '0.08em', family: body, transform: 'uppercase' }
caption: { size: 13, weight: 500, lineHeight: 1.4, tracking: '0.01em', family: body }
caption-sm: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.02em', family: body }
button: { size: 16, weight: 600, lineHeight: 1.0, tracking: '0', family: body }
button-sm: { size: 14, weight: 600, lineHeight: 1.0, tracking: '0', family: body }
link: { size: 16, weight: 500, lineHeight: 1.5, tracking: '0', family: body }
code: { size: 14, weight: 400, lineHeight: 1.5, tracking: '0', family: mono }
code-label: { size: 12, weight: 500, lineHeight: 1.4, tracking: '0.04em', family: mono, transform: 'uppercase' }
radius:
micro: 2
sm: 4
md: 8
lg: 12
xl: 16
pill: 9999
spacing:
base: 4
xxs: 4
xs: 8
sm: 12
md: 16
lg: 24
xl: 32
xxl: 48
section-sm: 48
section: 96
section-lg: 128
scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 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-entrance: 'cubic-bezier(0, 0, 0.2, 1)'
duration-fast: 150
duration-standard: 240
duration-slow: 320
reduced-motion: 'respects prefers-reduced-motion: reduce — hover lifts collapse to color-only; on-scroll reveals become instant'
breakpoints:
mobile: 640
tablet: 1024
desktop: 1280
wide: 1536
shadows:
ambient: 'rgba(23, 19, 33, 0.06) 0 1px 2px'
standard: 'rgba(23, 19, 33, 0.10) 0 4px 12px'
elevated: 'rgba(23, 19, 33, 0.14) 0 12px 32px'
deep: 'rgba(23, 19, 33, 0.18) 0 24px 48px'
focus: '0 0 0 3px rgba(110, 73, 203, 0.35)'
accessibility:
contrast-text-on-bg: 16.9 # #171321 on #ffffff — AAA
contrast-text-on-soft: 15.6 # #171321 on #f2f1f5 — AAA
contrast-on-cta: 16.9 # #ffffff on #171321 — AAA
contrast-brand-on-bg: 3.2 # #fc6d26 on #ffffff — AA large/UI only
contrast-link-on-bg: 6.6 # #6e49cb on #ffffff — AA / AAA large
focus-ring: '3px rgba(110, 73, 203, 0.35) ring with 1px solid #6e49cb on light canvas'
reduced-motion-honored: true
keyboard-nav: 'tab order follows visual; skip-link visible on focus; mega-menu navigable by arrow keys'
components:
button-primary:
background: '#171321'
text: '#ffffff'
radius: 4
padding: '12px 20px'
height: 44
font: button
hover: 'background #2b2640'
use: 'primary CTA — Get free trial (dark-on-white block)'
button-inverse:
background: '#ffffff'
text: '#171321'
border: '1px solid #171321'
radius: 4
padding: '11px 20px'
height: 44
font: button
hover: 'background #f2f1f5'
use: 'secondary CTA — Request a demo (outline / white-on-dark)'
button-soft:
background: '#f2f1f5'
text: '#171321'
radius: 8
padding: '12px 20px'
height: 44
font: button
hover: 'background #e8e6ee'
use: 'tertiary action — soft purple-grey fill (in-page controls)'
button-accent:
background: '#fc6d26'
text: '#ffffff'
radius: 4
padding: '12px 20px'
height: 44
font: button
hover: 'background #e24329'
use: 'high-energy accent CTA — orange, used sparingly for the single key action'
button-ghost:
background: 'transparent'
text: '#171321'
radius: 4
padding: '12px 16px'
font: button
hover: 'background rgba(23, 19, 33, 0.05)'
use: 'text-only tertiary action'
card:
background: '#ffffff'
text: '#171321'
border: '1px solid #dcd9e3'
radius: 12
padding: 24
use: 'standard feature card — hairline border, no fill'
card-soft:
background: '#f2f1f5'
text: '#171321'
radius: 12
padding: 24
use: 'soft-fill card — content well, no border'
card-ink:
background: '#171321'
text: '#ffffff'
radius: 12
padding: 32
use: 'inverted dark panel — bold statement / contrast section'
input:
background: '#ffffff'
text: '#171321'
border: '1px solid #dcd9e3'
radius: 8
padding: '10px 12px'
height: 44
focus: 'border #6e49cb; ring 0 0 0 3px rgba(110, 73, 203, 0.35)'
use: 'search / email / form input'
badge:
background: '#f2f1f5'
text: '#4d4a57'
radius: 9999
padding: '4px 12px'
font: caption
use: 'NEW / status pill'
badge-eyebrow:
background: 'rgba(252, 109, 38, 0.10)'
text: '#e24329'
radius: 9999
padding: '4px 12px'
font: eyebrow
use: 'section eyebrow chip — orange-tinted taxonomy label'
nav-link:
background: 'transparent'
text: '#171321'
font: body-base
padding: '8px 12px'
hover: 'text #6e49cb; underline appears'
use: 'top-nav mega-menu trigger (Platform / Solutions / Pricing / Resources)'
code-block:
background: '#f2f1f5'
text: '#171321'
border: '1px solid #dcd9e3'
radius: 8
padding: 16
font: code
use: 'config / CLI sample with optional filename header'
dark-mode: none
lineage:
summary: |
GitLab's marketing site is the bright contrarian in a dev-tool
category that overwhelmingly chose the dark canvas. Where GitHub,
Linear, and Vercel ground their marketing in near-black, GitLab
runs a pure-white `#ffffff` page with near-black `#171321` ink —
a faintly purple-tinted black that quietly nods to the tanuki
logo's purple end-stop. The type does the heavy lifting: GitLab
Sans (the open-source variable family GitLab commissioned to
replace the licensed Source Sans era) renders hero headlines at a
striking 96px on a custom 660 weight — heavier than 600, lighter
than 700, a register tuned for oversized display without tipping
into black-weight shout. The whole system descends from GitLab's
Pajamas design system, the deeply-tokened language that powers both
the product UI and the marketing chrome. Chrome stays disciplined:
primary CTAs are flat dark-on-white or white-on-dark blocks at a
tight 4px radius, borders are high-contrast `#171321` hairlines,
and the brand's chromatic energy is concentrated in the tanuki
gradient — orange `#fc6d26` → red `#e24329` → purple `#6e49cb` —
with the orange carrying accent duty on the rare key spark. The
influence map runs from Swiss editorial typography (big type, tight
grid, generous white space) through Pajamas' systematic tokening to
the broader 2020s dev-tool marketing language that GitLab inverts
by staying light. The orange is the one thing that is unmistakably
GitLab — the diff-green of GitHub has no analog here; instead the
fox-fire orange marks the brand the way a highlighter marks a page.
influences:
- name: 'GitLab Pajamas Design System'
role: 'Internal design system informing both product UI and marketing tokens'
url: 'https://design.gitlab.com'
- name: 'GitLab Sans (open-source)'
role: 'Commissioned variable display family — primary type signature at custom 660 weight'
url: 'https://gitlab.com/gitlab-org/frontend/fonts'
- name: 'GitLab Brand Tanuki'
role: 'Logo + orange→red→purple gradient that defines the accent palette'
url: 'https://about.gitlab.com/press/press-kit/'
- name: 'Swiss / International Typographic Style'
role: 'Big-type, tight-grid, white-space editorial lineage behind the oversized headlines'
url: 'https://en.wikipedia.org/wiki/International_Typographic_Style'
- name: 'GitHub'
role: 'Adjacent dev-platform marketing language GitLab inverts by choosing light over dark'
url: 'https://github.com'
---
## 1. Visual Theme & Atmosphere
GitLab's marketing canvas is a pure-white `#ffffff` page set in near-black `#171321` ink — a black that is not quite neutral, carrying a faint purple tint that ties it back to the tanuki logo's purple end-stop. In a developer-platform category that has overwhelmingly settled on the dark canvas (GitHub, Linear, Vercel, Cursor), GitLab is the deliberate bright contrarian. The page reads like a well-set technical document: high contrast, calm, confident, and structured around type rather than chrome.
The headline scale is the system's loudest signal. Hero copy runs to 96px in GitLab Sans at a custom 660 weight — heavier than a typical 600, lighter than a full 700 — a register tuned specifically for oversized display that commands attention without tipping into black-weight shouting. At `-0.03em` tracking the giant type reads as engineered and intentional. The body settles at a comfortable 16–18px, so the page swings from monumental headlines to readable prose with very little in between, and that contrast in scale is the editorial tension that animates the whole layout.
What makes GitLab distinctive against its nearest neighbors is the inversion of the dark-mode default plus the concentration of color. Most dev tools soften a dark canvas with one neon accent. GitLab keeps a bright canvas and concentrates its chromatic energy in the tanuki gradient — orange `#fc6d26` → red `#e24329` → purple `#6e49cb` — with the orange `#fc6d26` doing primary accent duty as the single spark. Primary CTAs are not orange; they are flat dark-on-white or white-on-dark blocks at a tight 4px radius. The orange is reserved, applied like a highlighter to the one thing that matters in a given view.
The chrome is disciplined and structural. Borders are high-contrast — a `#171321` hairline that wraps outline buttons and key cards rather than a soft grey divider — and the dominant depth tool is contrast and white space, not shadow. Soft purple-grey washes (`#f2f1f5`) carry the secondary surfaces: content wells, soft buttons, code samples. The result is a page that feels like a single, coherent DevSecOps platform telling one story, where size and a flash of orange do the work that other tools hand to neon on black.
Reading the homepage feels like reading a confident broadsheet about software. There is no marketing-layer theatrics pretending to be a separate brand experience — the same GitLab Sans, the same ink, the same Pajamas tokens run from the product UI through to the hero. The brand's restraint is the brand.
**Key Characteristics:**
- Pure-white `#ffffff` canvas — the bright contrarian in a dark-canvas category.
- Near-black `#171321` ink with a faint purple tint (nods to the tanuki purple).
- Oversized GitLab Sans headlines — 96px hero at custom 660 weight, `-0.03em` tracking.
- Tanuki orange `#fc6d26` is the brand accent; the full gradient is orange → red → purple.
- Primary CTAs are flat dark-on-white / white-on-dark blocks at a tight 4px radius — never orange-filled by default.
- High-contrast `#171321` structural borders; soft `#f2f1f5` purple-grey wash for secondary surfaces.
- Contrast and white space carry depth — shadow is minimal and reserved.
- Body sits at 16–18px; massive scale jump from body to display is the editorial signature.
- Tanuki purple `#6e49cb` carries links and editorial accents.
- Light-only marketing chrome — no dark variant, no theme toggle.
## 2. Color Palette & Roles
### Primary
- **Background** (`#ffffff`) [→ canvas]: pure-white marketing ground; the bright base of the entire system.
- **Text / Ink** (`#171321`) [→ text]: near-black with a faint purple tint; primary copy and the default border color.
- **Brand** (`#fc6d26`) [→ brand]: tanuki orange; the single accent spark, applied sparingly like a highlighter.
### Brand & Gradient
- **Tanuki Orange** (`#fc6d26`) [→ brand]: primary brand color; eyebrow chips, key spark, accent CTA fill.
- **Tanuki Red** (`#e24329`) [→ brand-red]: gradient mid-stop; also the hover/active state for orange.
- **Tanuki Purple** (`#6e49cb`) [→ brand-purple]: gradient end-stop; links, editorial accents, focus ring.
- **Tanuki Gradient** (`linear-gradient(135deg, #fc6d26 0%, #e24329 50%, #6e49cb 100%)`) [→ brand-gradient]: the logo gradient; used on decorative marks and the occasional large statement.
- **Brand Soft** (`rgba(252, 109, 38, 0.10)`) [→ brand-soft]: tinted orange wash behind eyebrow chips.
### Accent / CTA
- **CTA Dark** (`#171321`) [→ cta-bg]: primary CTA fill — the dark-on-white block (e.g. "Get free trial"). Text inverts to white.
- **CTA Light** (`#ffffff`) [→ cta-light-bg]: inverse CTA — white-on-dark or outline block (e.g. "Request a demo"). Text is ink.
- **CTA Hover** (`#2b2640`) [→ cta-hover]: lifted-ink hover for the dark primary CTA.
### Interactive
- **Link** (`#6e49cb`) [→ link]: tanuki purple; inline links and nav-hover color.
- **Link Hover** (`#5a3aa8`) [→ link-hover]: darker purple on hover.
- **Focus Ring** (`rgba(110, 73, 203, 0.35)` 3px) [→ focus]: purple ring on light canvas, paired with a 1px solid purple edge.
### Neutral Scale
- **Text Strong** (`#171321`) [→ text-strong]: display emphasis — same ink as body; contrast comes from weight, not color.
- **Text** (`#171321`) [→ text]: primary copy.
- **Text Soft** (`#4d4a57`) [→ text-soft]: supporting copy, captions.
- **Text Muted** (`#6e6b78`) [→ text-muted]: secondary metadata, footer body.
- **Text Faint** (`#9b99a3`) [→ text-faint]: disabled and placeholder text.
### Surface & Borders
- **Surface** (`#ffffff`) [→ surface]: primary card surface — defined by border, not fill.
- **Surface Soft** (`#f2f1f5`) [→ surface-soft]: soft cards, content wells, code samples — a faint purple-grey wash.
- **Surface Ink** (`#171321`) [→ surface-ink]: inverted dark panel for high-contrast statement sections.
- **Border** (`#171321`) [→ border]: high-contrast structural border for outline buttons and key cards.
- **Border Soft** (`#dcd9e3`) [→ border-soft]: hairline divider — purple-grey.
- **Border Faint** (`#ece9f1`) [→ border-faint]: faintest rule — table rows, nested dividers.
### Shadow
- **Ambient** (`rgba(23, 19, 33, 0.06) 0 1px 2px`) [→ shadow-tint]: subtle card lift.
- **Standard** (`rgba(23, 19, 33, 0.10) 0 4px 12px`): hover elevation.
- **Elevated** (`rgba(23, 19, 33, 0.14) 0 12px 32px`): dropdowns, mega-menu panels.
- **Deep** (`rgba(23, 19, 33, 0.18) 0 24px 48px`): modals.
### Semantic
- **Success** (`#108548`) [→ semantic-success]: GitLab green — pipeline passed.
- **Warning** (`#c17d10`) [→ semantic-warning]: amber — pending / attention.
- **Danger** (`#dd2b0e`) [→ semantic-danger]: red — pipeline failed / error.
- **Info** (`#6e49cb`) [→ semantic-info]: purple — informational notes.
## 3. Typography Rules
### Font Family
- **Primary (display + body):** `"GitLab Sans", system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif`. The open-source variable family GitLab commissioned to replace its earlier licensed-Source-Sans era. The custom 660 display weight is the brand fingerprint.
- **Mono companion:** `"GitLab Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace`. Matched mono for code samples, CLI, and config.
- **OpenType features:** `kern`, `liga` enabled site-wide; `tnum` on code for column alignment.
### Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | GitLab Sans | 96 | 660 | 1.0 | -0.03em | Homepage h1 — the signature oversized headline |
| display-lg | GitLab Sans | 72 | 660 | 1.02 | -0.028em | Large section opener |
| display-md | GitLab Sans | 56 | 660 | 1.05 | -0.022em | Sub-hero / feature lead |
| h1 | GitLab Sans | 48 | 660 | 1.1 | -0.02em | Page h1 |
| h2 | GitLab Sans | 40 | 600 | 1.15 | -0.015em | Section heads |
| h3 | GitLab Sans | 32 | 600 | 1.2 | -0.012em | Sub-section heads |
| h4 | GitLab Sans | 24 | 600 | 1.25 | -0.005em | Card titles |
| h5 | GitLab Sans | 20 | 600 | 1.3 | 0 | Small heads, list leads |
| body-lg | GitLab Sans | 20 | 400 | 1.55 | 0 | Hero subhead |
| body | GitLab Sans | 18 | 400 | 1.55 | 0 | Default marketing body |
| body-base | GitLab Sans | 16 | 400 | 1.55 | 0 | Dense body / nav |
| body-sm | GitLab Sans | 14 | 400 | 1.5 | 0 | Footer body, fine print |
| label | GitLab Sans | 14 | 600 | 1.0 | 0 | Form labels |
| eyebrow | GitLab Sans | 13 | 600 | 1.4 | 0.08em | Uppercase section eyebrow |
| caption | GitLab Sans | 13 | 500 | 1.4 | 0.01em | Supporting metadata |
| caption-sm | GitLab Sans | 12 | 500 | 1.4 | 0.02em | Footer microcopy |
| button | GitLab Sans | 16 | 600 | 1.0 | 0 | CTA button label |
| button-sm | GitLab Sans | 14 | 600 | 1.0 | 0 | Compact button |
| link | GitLab Sans | 16 | 500 | 1.5 | 0 | Inline link |
| code | GitLab Mono | 14 | 400 | 1.5 | 0 | Code block |
| code-label | GitLab Mono | 12 | 500 | 1.4 | 0.04em | Code-block filename header |
### Principles
- **The custom 660 weight is the brand fingerprint.** Heavier than 600, lighter than 700 — GitLab Sans's variable axis was tuned for oversized display at this register. Hero headlines never run at flat 700.
- **Scale jumps are the editorial signature.** The system swings from a 96px hero to 16–18px body with very little mid-range, creating monumental contrast on every page.
- **Display tracking is tight.** Headlines sit at `-0.02em` to `-0.03em`, growing tighter as the size grows. The negative tracking makes giant type read as engineered, not loud.
- **Body is comfortable, not dense.** At 16–18px with 1.55 line height, GitLab's prose is more generous than GitHub's 14px — a deliberate readability choice for a broad enterprise audience.
- **Color emphasis comes from weight, not hue.** Strong text is the same `#171321` ink as body; emphasis is a weight bump, never a recolor (except the rare orange spark or purple link).
- **One family does display and body.** GitLab Sans carries everything except code; GitLab Mono is the only secondary face. No third sans is introduced.
- **Uppercase only for eyebrows.** The `0.08em` tracked uppercase eyebrow is the single uppercase register — body and headlines stay sentence-case.
## 4. Component Stylings
### Buttons
**Primary (Dark Block)** — Background `#171321`, text `#ffffff`, 4px radius, padding `12px 20px`, height 44px, button font (16/600). Hover background `#2b2640`. **Use:** primary CTA — "Get free trial". The dark-on-white block is GitLab's default primary.
**Inverse / Outline (Light Block)** — Background `#ffffff` with 1px `#171321` border, text `#171321`, 4px radius. Hover background `#f2f1f5`. On dark sections this becomes a white fill with ink text. **Use:** secondary CTA — "Request a demo".
**Soft** — Background `#f2f1f5` (purple-grey wash), text `#171321`, 8px radius, no border. Hover background `#e8e6ee`. **Use:** tertiary in-page controls where a full outline would be too heavy.
**Accent (Orange)** — Background `#fc6d26`, text `#ffffff`, 4px radius. Hover background `#e24329` (tanuki red). **Use:** the single high-energy spark CTA — used sparingly, never as the default everywhere.
**Ghost** — Transparent background, ink text, 4px radius, padding `12px 16px`. Hover `rgba(23, 19, 33, 0.05)` background. **Use:** text-only tertiary action.
### Cards
**Standard Card** — Background `#ffffff`, 1px `#dcd9e3` hairline border, 12px radius, 24px padding. Defined by border rather than fill. **Use:** generic feature card.
**Soft Card** — Background `#f2f1f5` (purple-grey wash), no border, 12px radius, 24px padding. **Use:** content wells, grouped lists, soft feature tiles.
**Ink Card** — Background `#171321`, text `#ffffff`, 12px radius, 32px padding. **Use:** inverted dark statement panel — a single high-contrast section against the white page. Orange accent and white-fill CTAs read well inside it.
### Badges & Tags
**Standard Badge** — Background `#f2f1f5`, text `#4d4a57`, 9999 radius (pill), `4px 12px` padding, caption font. **Use:** NEW / status pill.
**Eyebrow Chip** — Background `rgba(252, 109, 38, 0.10)`, text `#e24329` (tanuki red on tint), 9999 radius, `4px 12px` padding, eyebrow font (uppercase, `0.08em` tracked). The signature taxonomy label above a section heading — the one place orange consistently appears in chrome.
### Inputs & Forms
**Text Input** — Background `#ffffff`, 1px `#dcd9e3` border, 8px radius, padding `10px 12px`, height 44px. Focus: border `#6e49cb` (tanuki purple), ring `0 0 0 3px rgba(110, 73, 203, 0.35)`. Label is label font (14/600) above the field.
### Navigation
**Top Nav** — White background, 64px height, hairline `#dcd9e3` bottom border on scroll. Layout: tanuki wordmark left, mega-menu triggers center (Platform / Solutions / Pricing / Resources), Sign in + "Get free trial" primary CTA right.
**Nav Link** — Transparent background, `#171321` text, body-base font, padding `8px 12px`. Hover: text shifts to `#6e49cb` purple, an underline appears. Mega-menu panels drop with the elevated shadow.
### Decorative
**Code Block** — Background `#f2f1f5` (surface-soft), 1px `#dcd9e3` border, 8px radius, 16px padding, GitLab Mono 14/400. Optional filename header in mono 12/500/0.04em uppercase. Used for CLI / `.gitlab-ci.yml` config samples.
**Hero Band** — Full-width white band. display-hero (96/660/-0.03em) headline, body-lg (20/400) subhead, two CTAs (dark primary + outline secondary). 96px+ vertical padding.
## 5. Layout Principles
### Spacing System
- **Base unit:** 4px.
- **Scale:** 0 / 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128.
- **Section padding ladder:** 48px (condensed) / 96px (normal) / 128px (spacious).
- **Card padding:** 24px standard, 32px for ink statement panels.
### Grid & Container
- **Max content width:** 1280px.
- **Prose width:** 720px for long-form editorial passages.
- **Hero region:** generous block padding (96–128px) so the 96px headline has room to breathe.
- **Feature grids:** 2–3 columns at desktop with 24–32px gaps; collapse to 1-up on mobile.
- **Footer:** 4–5 column link matrix at desktop.
### Whitespace Philosophy
GitLab's white space is editorial, not minimalist-for-its-own-sake. The pure-white ground plus oversized type means the page leans on generous margins to keep the giant headlines from feeling cramped. Unlike GitHub's deliberately dense 14px chrome, GitLab's body is comfortable (16–18px) and sections are roomy — the white space is the calm counterweight to the monumental type.
### Section Cadence
- White hero with 96px headline → feature grid (bordered + soft cards) → inverted ink statement panel → logos / social proof → pricing or platform breakdown → CTA band → footer.
- Tonal rhythm comes from alternating white, soft purple-grey (`#f2f1f5`), and the occasional ink-dark panel — never a busy multi-color section.
## 6. Shapes & Radius Scale
| Token | Value | Tier | Use |
|---|---|---|---|
| micro | 2px | Micro | Inline chips, the smallest pills |
| sm | 4px | Standard | **Buttons, CTAs** — GitLab's tight signature radius |
| md | 8px | Comfortable | Inputs, code blocks, soft buttons |
| lg | 12px | Relaxed | Cards, content wells |
| xl | 16px | Large | Large feature panels, media frames |
| pill | 9999px | Pill | Badges, eyebrow chips, status pills |
The radius story is defined by the tight 4px CTA corner. Where many 2020s SaaS sites push buttons to 8–12px or full pills, GitLab keeps primary actions at a crisp 4px — a small but consistent signal of engineered precision. Cards relax to 12px and inputs sit at 8px, so there is a clear ladder: 4 (actions) / 8 (fields) / 12 (containers). Pills stay scoped to badges and eyebrow chips.
## 7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 — Flat | `#ffffff` canvas | Body bands, footer |
| 1 — Soft fill | `#f2f1f5` purple-grey wash | Content wells, soft cards |
| 2 — Bordered | `#ffffff` + 1px `#dcd9e3` hairline | Standard cards |
| 3 — Lifted | `#ffffff` + standard shadow | Hover state on interactive cards |
| 4 — Floating | `#ffffff` + elevated shadow | Mega-menu panels, dropdowns |
| 5 — Modal | `#ffffff` + deep shadow | Dialogs, lightboxes |
| Ink — Inverted | `#171321` panel | High-contrast statement section |
### Shadow Philosophy
GitLab leans on contrast and white space for depth, not shadow. On the bright canvas, separation is achieved primarily through hairline borders (`#dcd9e3`) and soft purple-grey fills (`#f2f1f5`); shadow is reserved for genuinely floating elements — mega-menu panels, dropdowns, and modals. The shadow color is a low-alpha ink tint (`rgba(23, 19, 33, 0.10–0.18)`) so it reads as a soft, neutral lift rather than a heavy drop. The inverted ink panel is its own elevation device: dropping to `#171321` against white creates more separation than any shadow could.
## 8. Interaction & Motion
### Easing & Duration
- **ease-standard:** `cubic-bezier(0.4, 0, 0.2, 1)` — material default for color and position shifts.
- **ease-emphasized:** `cubic-bezier(0.2, 0, 0, 1)` — used for card hover lift and panel entrance.
- **ease-entrance:** `cubic-bezier(0, 0, 0.2, 1)` — on-scroll content reveal.
- **duration-fast:** 150ms — color shifts on hover.
- **duration-standard:** 240ms — card lift, mega-menu drop.
- **duration-slow:** 320ms — section reveal on scroll.
### Per-Component Micro-States
- **Primary button hover:** background `#171321` → `#2b2640`, no transform. 150ms.
- **Outline button hover:** background transparent → `#f2f1f5`. 150ms.
- **Accent button hover:** background orange `#fc6d26` → red `#e24329`. 150ms.
- **Card hover:** ambient → standard shadow, translateY(-2px). 240ms.
- **Nav link hover:** text → `#6e49cb`, underline slides in. 150ms.
- **Input focus:** border `#dcd9e3` → `#6e49cb`, purple ring fades in. 150ms.
- **Eyebrow chip:** static; the tint does the work, no hover.
### Page Transitions
The homepage uses restrained on-scroll reveals — sections fade up from below (translateY(16px) → 0, opacity 0 → 1, 320ms, ease-entrance) as they enter the viewport. Mega-menu panels drop with a quick fade-and-scale from the trigger. The motion language is calm and editorial; nothing bounces.
### Reduced Motion
Respects `prefers-reduced-motion: reduce`. When set:
- Card hover lifts collapse to a color/shadow change only (no translate).
- On-scroll reveals become instant (opacity snaps, no translate).
- Mega-menu drops appear without the scale animation.
## 9. Accessibility & A11y
### Contrast Pairs
| Pair | Ratio | WCAG |
|---|---|---|
| `#171321` text on `#ffffff` canvas | 16.9 | AAA |
| `#171321` text on `#f2f1f5` soft | 15.6 | AAA |
| `#ffffff` on `#171321` dark CTA / ink panel | 16.9 | AAA |
| `#6e49cb` purple link on `#ffffff` | 6.6 | AA (AAA at large) |
| `#4d4a57` soft text on `#ffffff` | 8.6 | AAA |
| `#fc6d26` orange on `#ffffff` | 3.2 | AA for large text / UI elements only |
Note: the tanuki orange `#fc6d26` clears 3:1 — acceptable for large text, icons, borders, and UI accents, but **not** for small body copy on white. When orange must carry text, use the darker red `#e24329` (4.0:1) or white text on an orange fill.
### Focus Indicators
3px `rgba(110, 73, 203, 0.35)` ring paired with a 1px solid `#6e49cb` edge on the light canvas. Applied to every interactive element — buttons, links, inputs, nav, cards. Never `outline: none` without a replacement ring.
### ARIA Patterns
- **Menu:** mega-menu triggers use `aria-expanded` + `aria-controls`; panels are `role="region"` with a labelled heading.
- **Dialog:** `role="dialog"` + `aria-modal="true"` + focus trap on demo-request and sign-in modals.
- **Disclosure:** pricing FAQ accordions use `aria-expanded` on the trigger button.
- **Tablist:** `role="tablist"` for platform-overview tab navigation.
### Keyboard Nav
- Tab order strictly follows visual order.
- Skip-link present in header, visible on focus.
- Mega-menu navigable by arrow keys; Escape closes.
- Escape closes modals; standard tab cycle inside the focus trap.
### Screen Reader
- Decorative tanuki / gradient marks are `aria-hidden="true"`.
- Eyebrow chips include the section name as accessible text.
- Pipeline-status icons carry text alternatives ("Passed", "Failed") rather than relying on color alone.
### Reduced Motion
Honored — see §8.
## 10. Responsive Behavior
| Breakpoint | Range | Key Changes |
|---|---|---|
| Mobile | < 640px | display-hero 96→40px; grids 1-up; nav → hamburger; CTAs full-width stack |
| Tablet | 640–1024px | display-hero 56–64px; grids 2-up; CTAs inline |
| Desktop | 1024–1280px | display-hero 72–96px; grids 2–3-up; full mega-menu |
| Wide | > 1280px | Content caps at 1280px; hero gets maximum block padding |
### Touch Targets
- Primary CTA: 44px height — meets WCAG AA touch target.
- Nav links: padded to a 44px tap target on mobile.
- Cards: full card is the tap target where clickable.
### Collapsing Strategy
- Top nav collapses to a hamburger + slide-in panel below 1024px.
- Feature grids: 3-up → 2-up → 1-up.
- The 96px hero drops sharply (to ~40px) on mobile to stay on-screen; tracking loosens slightly at small sizes.
- CTAs stack full-width below 640px.
- Code blocks keep horizontal scroll (no wrap).
### Image Behavior
Product screenshots use `srcset` 1x/2x. Hero illustrations and the tanuki gradient mark scale fluidly; large media frames drop their 16px radius to full-bleed on mobile.
### Container Queries
Used inside large feature panels — internal layout reflows when the panel itself narrows below ~560px regardless of viewport.
## 11. Content & Voice
### Tone
Confident, plain-spoken, enterprise-credible. GitLab's voice sounds like a platform team explaining the whole software lifecycle in one breath — declarative, slightly grand at the headline ("Finally, AI for the entire software lifecycle."), then concrete and benefit-led in the body. Sentences trend medium-length; jargon is defined; the platform is positioned as one place that does everything.
### Microcopy Patterns
- **Button verbs:** "Get free trial", "Request a demo", "Contact sales", "Read the docs", "Explore the platform".
- **Error recipe:** `[What failed] — [Why] — [What to do]`. Example: "Pipeline failed. A test did not pass. Review the job log to retry."
- **Status confirmations:** terse and CI-flavored — "Passed", "Pending", "Failed", "Merged".
- **Empty states:** instructional — "No projects yet. Create one to start a pipeline."
### CTA Verb Conventions
- Primary: "Get free trial", "Start free", "Request a demo".
- Secondary: "Explore the platform", "See pricing", "Read the docs", "Talk to sales".
- Avoid: breathless superlatives, emoji-heavy CTAs, exclamation pile-ups.
### Empty States
GitLab's marketing rarely surfaces empty states; when they appear (search, resource filters), copy stays terse: "No results. Try a different filter." Illustrations, when used, are simple line work in the tanuki palette — never cluttered.
## 12. Dark Mode & Theming
GitLab's marketing site is **light-only** — there is no dark marketing chrome and no theme toggle on about.gitlab.com. The pure-white `#ffffff` canvas with near-black `#171321` ink is the brand surface. The product UI ships its own light and dark themes via the Pajamas design system, but those are product concerns; the marketing identity is deliberately the bright one.
The one inversion device the marketing chrome uses is the **ink statement panel** — a single section dropped to `#171321` with white text, the orange accent, and white-fill CTAs. This gives the page a high-contrast moment without committing to a full dark mode, and it is the closest the marketing surface comes to "dark."
If a dark variant were ever needed, the natural mapping would be: `bg` → `#171321`, `text` → `#ffffff`, `surface-soft` → a dark purple-grey, `border` → a light hairline, with the tanuki orange `#fc6d26` and purple `#6e49cb` carrying through unchanged. But this is hypothetical — the shipped marketing chrome is light.
## 13. Lineage & Influences
GitLab sits at the intersection of **Swiss editorial typography** (big type, tight grid, generous white space), **its own Pajamas design system** (the deeply-tokened language that powers both product and marketing), and the broader **2020s dev-tool marketing language** — which it joins by inverting. Where GitHub, Linear, Vercel, and Cursor all chose the near-black canvas, GitLab makes the opposite bet: a pure-white page that lets oversized GitLab Sans headlines and a single orange spark carry the whole brand. The choice is contrarian on purpose; in a sea of neon-on-black, bright-and-confident is itself a differentiator.
The type investment is the deepest single signal. GitLab commissioned and open-sourced GitLab Sans (and GitLab Mono) to replace its earlier licensed-Source-Sans era, and the custom 660 display weight — heavier than 600, lighter than 700 — is tuned specifically for the monumental 96px headlines that anchor every page. The chromatic identity is the tanuki: the fox's orange → red → purple gradient, with orange `#fc6d26` doing the day-to-day accent work the way a highlighter marks a page. There is no diff-green analog as on GitHub; instead the fox-fire orange is the one unmistakably-GitLab color, and the near-black ink itself carries a faint purple tint that quietly nods to the gradient's end-stop.
**Named influences:**
- **GitLab Pajamas Design System** — internal design system informing both product UI and marketing tokens.
- **GitLab Sans / GitLab Mono** — commissioned, open-sourced type families; the custom 660 weight is the fingerprint.
- **GitLab Tanuki brand** — the logo and its orange→red→purple gradient define the accent palette.
- **Swiss / International Typographic Style** — the big-type, tight-grid, white-space editorial lineage behind the oversized headlines.
- **GitHub** — the adjacent dev-platform marketing language GitLab deliberately inverts by choosing light over dark.
## 14. Do's and Don'ts
### Do
- **Do** anchor the canvas at pure white `#ffffff` — the bright canvas is the brand's contrarian signal.
- **Do** use near-black `#171321` ink everywhere, including for the default border. The faint purple tint matters.
- **Do** run hero headlines big — 96px GitLab Sans at the custom 660 weight with `-0.03em` tracking.
- **Do** treat tanuki orange `#fc6d26` as a sparing accent — a highlighter, not a fill-everything color.
- **Do** make primary CTAs flat dark-on-white blocks (or white-on-dark on ink panels) at a tight 4px radius.
- **Do** use the soft purple-grey `#f2f1f5` for secondary surfaces — wells, soft cards, code samples.
- **Do** lean on contrast and white space for depth; reserve shadow for floating elements (menus, modals).
- **Do** use tanuki purple `#6e49cb` for links and the focus ring.
- **Do** keep one ink statement panel per page for high-contrast rhythm.
- **Do** keep body comfortable at 16–18px — readability for a broad enterprise audience.
- **Do** scope orange-tinted eyebrow chips as the section-naming convention.
- **Do** use the 4 / 8 / 12 radius ladder: actions / fields / containers.
### Don't
- **Don't** default to a dark canvas. GitLab's whole position is the bright inversion of the dev-tool norm.
- **Don't** fill primary CTAs with orange by default — the default primary is the dark block; orange is the rare spark.
- **Don't** use small orange text on white — it fails contrast. Use red `#e24329` or white-on-orange instead.
- **Don't** push button radius beyond 4px. The tight corner is the precision signal.
- **Don't** flatten the type scale. The monumental jump from 96px hero to 16–18px body is the editorial signature.
- **Don't** run headlines at flat 700. The custom 660 weight is the voice.
- **Don't** introduce a third sans family beyond GitLab Sans and GitLab Mono.
- **Don't** scatter the full tanuki gradient across the page — it belongs on marks and the occasional statement, not chrome.
- **Don't** rely on heavy drop shadows for separation; hairline borders and soft fills do that work.
- **Don't** recolor strong text — emphasis is a weight bump on the same ink, not a hue change.
- **Don't** use uppercase outside eyebrows. Headlines and body stay sentence-case.
- **Don't** cramp the giant headlines — they need generous block padding to read as intentional.
## 15. Agent Prompt Guide
### Quick Color Reference
```
Background: #ffffff
Surface Soft: #f2f1f5
Ink Panel: #171321
Text / Ink: #171321
Text Soft: #4d4a57
Brand (Orange):#fc6d26
Brand Red: #e24329
Brand Purple: #6e49cb
Primary CTA: #171321 (text #ffffff)
Link: #6e49cb
Border: #171321 (structural) / #dcd9e3 (hairline)
```
### Example Component Prompts
- **"Create a hero section in the GitLab style"** — Pure-white `#ffffff` canvas, 96px GitLab Sans h1 at the custom 660 weight with `-0.03em` tracking in `#171321` ink, 20px body subhead at weight 400, two CTAs (dark `#171321`-on-white primary block + white-with-ink-border outline secondary), both at 4px radius. Generous block padding.
- **"Design a feature card in the GitLab style"** — Either a bordered card (`#ffffff` background, 1px `#dcd9e3` hairline, 12px radius, 24px padding) or a soft card (`#f2f1f5` fill, no border, 12px radius). h4 title in GitLab Sans 24/600, 16px body. Optional orange-tinted eyebrow chip above the title.
- **"Build a primary CTA in the GitLab style"** — `#171321` background, `#ffffff` text, 4px radius, `12px 20px` padding, 44px height, button font (16/600). Hover background `#2b2640`. The dark-on-white block is the default; reserve orange `#fc6d26` fill for the single key spark CTA.
- **"Make an inverted statement panel in the GitLab style"** — Drop a full-width section to `#171321` ink with `#ffffff` text, 12px radius, 32px padding. Large GitLab Sans headline, the tanuki orange `#fc6d26` as the in-panel accent, and a white-fill CTA. One per page for high-contrast rhythm.
- **"Add an eyebrow chip in the GitLab style"** — Pill (9999 radius), `4px 12px` padding, `rgba(252, 109, 38, 0.10)` background, `#e24329` text, uppercase eyebrow font (13/600/`0.08em` tracking). The section-naming convention.
- **"Render a code block in the GitLab style"** — `#f2f1f5` background, 1px `#dcd9e3` border, 8px radius, 16px padding, GitLab Mono 14/400. Optional filename header in mono 12/500/0.04em uppercase. Good for `.gitlab-ci.yml` config samples.
### Iteration Guide
1. Start with a pure-white `#ffffff` canvas — non-negotiable. GitLab's brand is the bright inversion.
2. Set GitLab Sans display at the custom 660 weight with `-0.03em` tracking, sized big (up to 96px hero). The fingerprint.
3. Use near-black `#171321` ink for text and structural borders — note the faint purple tint.
4. Make primary CTAs flat dark blocks at 4px radius. Keep orange `#fc6d26` as a sparing accent, not a fill-everything color.
5. Build sections in white / soft purple-grey `#f2f1f5` / occasional ink-dark `#171321` — never busy multi-color.
6. Use 4px on buttons, 8px on inputs, 12px on cards. Don't cross the ladder.
7. Reach for hairline borders and white space before shadow; reserve shadow for floating menus and modals.
8. Let tanuki purple `#6e49cb` carry links and the focus ring; if orange must hold text, switch to red `#e24329`.
---
*Theme-toggle audit: score=0, signals=[none]*
1. Visual Theme & Atmosphere
GitLab’s marketing canvas is a pure-white #ffffff page set in near-black #171321 ink — a black that is not quite neutral, carrying a faint purple tint that ties it back to the tanuki logo’s purple end-stop. In a developer-platform category that has overwhelmingly settled on the dark canvas (GitHub, Linear, Vercel, Cursor), GitLab is the deliberate bright contrarian. The page reads like a well-set technical document: high contrast, calm, confident, and structured around type rather than chrome.
The headline scale is the system’s loudest signal. Hero copy runs to 96px in GitLab Sans at a custom 660 weight — heavier than a typical 600, lighter than a full 700 — a register tuned specifically for oversized display that commands attention without tipping into black-weight shouting. At -0.03em tracking the giant type reads as engineered and intentional. The body settles at a comfortable 16–18px, so the page swings from monumental headlines to readable prose with very little in between, and that contrast in scale is the editorial tension that animates the whole layout.
What makes GitLab distinctive against its nearest neighbors is the inversion of the dark-mode default plus the concentration of color. Most dev tools soften a dark canvas with one neon accent. GitLab keeps a bright canvas and concentrates its chromatic energy in the tanuki gradient — orange #fc6d26 → red #e24329 → purple #6e49cb — with the orange #fc6d26 doing primary accent duty as the single spark. Primary CTAs are not orange; they are flat dark-on-white or white-on-dark blocks at a tight 4px radius. The orange is reserved, applied like a highlighter to the one thing that matters in a given view.
The chrome is disciplined and structural. Borders are high-contrast — a #171321 hairline that wraps outline buttons and key cards rather than a soft grey divider — and the dominant depth tool is contrast and white space, not shadow. Soft purple-grey washes (#f2f1f5) carry the secondary surfaces: content wells, soft buttons, code samples. The result is a page that feels like a single, coherent DevSecOps platform telling one story, where size and a flash of orange do the work that other tools hand to neon on black.
Reading the homepage feels like reading a confident broadsheet about software. There is no marketing-layer theatrics pretending to be a separate brand experience — the same GitLab Sans, the same ink, the same Pajamas tokens run from the product UI through to the hero. The brand’s restraint is the brand.
Key Characteristics:
- Pure-white
#ffffffcanvas — the bright contrarian in a dark-canvas category. - Near-black
#171321ink with a faint purple tint (nods to the tanuki purple). - Oversized GitLab Sans headlines — 96px hero at custom 660 weight,
-0.03emtracking. - Tanuki orange
#fc6d26is the brand accent; the full gradient is orange → red → purple. - Primary CTAs are flat dark-on-white / white-on-dark blocks at a tight 4px radius — never orange-filled by default.
- High-contrast
#171321structural borders; soft#f2f1f5purple-grey wash for secondary surfaces. - Contrast and white space carry depth — shadow is minimal and reserved.
- Body sits at 16–18px; massive scale jump from body to display is the editorial signature.
- Tanuki purple
#6e49cbcarries links and editorial accents. - Light-only marketing chrome — no dark variant, no theme toggle.
2. Color Palette & Roles
Primary
- Background (
#ffffff) [→ canvas]: pure-white marketing ground; the bright base of the entire system. - Text / Ink (
#171321) [→ text]: near-black with a faint purple tint; primary copy and the default border color. - Brand (
#fc6d26) [→ brand]: tanuki orange; the single accent spark, applied sparingly like a highlighter.
Brand & Gradient
- Tanuki Orange (
#fc6d26) [→ brand]: primary brand color; eyebrow chips, key spark, accent CTA fill. - Tanuki Red (
#e24329) [→ brand-red]: gradient mid-stop; also the hover/active state for orange. - Tanuki Purple (
#6e49cb) [→ brand-purple]: gradient end-stop; links, editorial accents, focus ring. - Tanuki Gradient (
linear-gradient(135deg, #fc6d26 0%, #e24329 50%, #6e49cb 100%)) [→ brand-gradient]: the logo gradient; used on decorative marks and the occasional large statement. - Brand Soft (
rgba(252, 109, 38, 0.10)) [→ brand-soft]: tinted orange wash behind eyebrow chips.
Accent / CTA
- CTA Dark (
#171321) [→ cta-bg]: primary CTA fill — the dark-on-white block (e.g. “Get free trial”). Text inverts to white. - CTA Light (
#ffffff) [→ cta-light-bg]: inverse CTA — white-on-dark or outline block (e.g. “Request a demo”). Text is ink. - CTA Hover (
#2b2640) [→ cta-hover]: lifted-ink hover for the dark primary CTA.
Interactive
- Link (
#6e49cb) [→ link]: tanuki purple; inline links and nav-hover color. - Link Hover (
#5a3aa8) [→ link-hover]: darker purple on hover. - Focus Ring (
rgba(110, 73, 203, 0.35)3px) [→ focus]: purple ring on light canvas, paired with a 1px solid purple edge.
Neutral Scale
- Text Strong (
#171321) [→ text-strong]: display emphasis — same ink as body; contrast comes from weight, not color. - Text (
#171321) [→ text]: primary copy. - Text Soft (
#4d4a57) [→ text-soft]: supporting copy, captions. - Text Muted (
#6e6b78) [→ text-muted]: secondary metadata, footer body. - Text Faint (
#9b99a3) [→ text-faint]: disabled and placeholder text.
Surface & Borders
- Surface (
#ffffff) [→ surface]: primary card surface — defined by border, not fill. - Surface Soft (
#f2f1f5) [→ surface-soft]: soft cards, content wells, code samples — a faint purple-grey wash. - Surface Ink (
#171321) [→ surface-ink]: inverted dark panel for high-contrast statement sections. - Border (
#171321) [→ border]: high-contrast structural border for outline buttons and key cards. - Border Soft (
#dcd9e3) [→ border-soft]: hairline divider — purple-grey. - Border Faint (
#ece9f1) [→ border-faint]: faintest rule — table rows, nested dividers.
Shadow
- Ambient (
rgba(23, 19, 33, 0.06) 0 1px 2px) [→ shadow-tint]: subtle card lift. - Standard (
rgba(23, 19, 33, 0.10) 0 4px 12px): hover elevation. - Elevated (
rgba(23, 19, 33, 0.14) 0 12px 32px): dropdowns, mega-menu panels. - Deep (
rgba(23, 19, 33, 0.18) 0 24px 48px): modals.
Semantic
- Success (
#108548) [→ semantic-success]: GitLab green — pipeline passed. - Warning (
#c17d10) [→ semantic-warning]: amber — pending / attention. - Danger (
#dd2b0e) [→ semantic-danger]: red — pipeline failed / error. - Info (
#6e49cb) [→ semantic-info]: purple — informational notes.
3. Typography Rules
Font Family
- Primary (display + body):
"GitLab Sans", system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif. The open-source variable family GitLab commissioned to replace its earlier licensed-Source-Sans era. The custom 660 display weight is the brand fingerprint. - Mono companion:
"GitLab Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace. Matched mono for code samples, CLI, and config. - OpenType features:
kern,ligaenabled site-wide;tnumon code for column alignment.
Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| display-hero | GitLab Sans | 96 | 660 | 1.0 | -0.03em | Homepage h1 — the signature oversized headline |
| display-lg | GitLab Sans | 72 | 660 | 1.02 | -0.028em | Large section opener |
| display-md | GitLab Sans | 56 | 660 | 1.05 | -0.022em | Sub-hero / feature lead |
| h1 | GitLab Sans | 48 | 660 | 1.1 | -0.02em | Page h1 |
| h2 | GitLab Sans | 40 | 600 | 1.15 | -0.015em | Section heads |
| h3 | GitLab Sans | 32 | 600 | 1.2 | -0.012em | Sub-section heads |
| h4 | GitLab Sans | 24 | 600 | 1.25 | -0.005em | Card titles |
| h5 | GitLab Sans | 20 | 600 | 1.3 | 0 | Small heads, list leads |
| body-lg | GitLab Sans | 20 | 400 | 1.55 | 0 | Hero subhead |
| body | GitLab Sans | 18 | 400 | 1.55 | 0 | Default marketing body |
| body-base | GitLab Sans | 16 | 400 | 1.55 | 0 | Dense body / nav |
| body-sm | GitLab Sans | 14 | 400 | 1.5 | 0 | Footer body, fine print |
| label | GitLab Sans | 14 | 600 | 1.0 | 0 | Form labels |
| eyebrow | GitLab Sans | 13 | 600 | 1.4 | 0.08em | Uppercase section eyebrow |
| caption | GitLab Sans | 13 | 500 | 1.4 | 0.01em | Supporting metadata |
| caption-sm | GitLab Sans | 12 | 500 | 1.4 | 0.02em | Footer microcopy |
| button | GitLab Sans | 16 | 600 | 1.0 | 0 | CTA button label |
| button-sm | GitLab Sans | 14 | 600 | 1.0 | 0 | Compact button |
| link | GitLab Sans | 16 | 500 | 1.5 | 0 | Inline link |
| code | GitLab Mono | 14 | 400 | 1.5 | 0 | Code block |
| code-label | GitLab Mono | 12 | 500 | 1.4 | 0.04em | Code-block filename header |
Principles
- The custom 660 weight is the brand fingerprint. Heavier than 600, lighter than 700 — GitLab Sans’s variable axis was tuned for oversized display at this register. Hero headlines never run at flat 700.
- Scale jumps are the editorial signature. The system swings from a 96px hero to 16–18px body with very little mid-range, creating monumental contrast on every page.
- Display tracking is tight. Headlines sit at
-0.02emto-0.03em, growing tighter as the size grows. The negative tracking makes giant type read as engineered, not loud. - Body is comfortable, not dense. At 16–18px with 1.55 line height, GitLab’s prose is more generous than GitHub’s 14px — a deliberate readability choice for a broad enterprise audience.
- Color emphasis comes from weight, not hue. Strong text is the same
#171321ink as body; emphasis is a weight bump, never a recolor (except the rare orange spark or purple link). - One family does display and body. GitLab Sans carries everything except code; GitLab Mono is the only secondary face. No third sans is introduced.
- Uppercase only for eyebrows. The
0.08emtracked uppercase eyebrow is the single uppercase register — body and headlines stay sentence-case.
4. Component Stylings
Buttons
Primary (Dark Block) — Background #171321, text #ffffff, 4px radius, padding 12px 20px, height 44px, button font (16/600). Hover background #2b2640. Use: primary CTA — “Get free trial”. The dark-on-white block is GitLab’s default primary.
Inverse / Outline (Light Block) — Background #ffffff with 1px #171321 border, text #171321, 4px radius. Hover background #f2f1f5. On dark sections this becomes a white fill with ink text. Use: secondary CTA — “Request a demo”.
Soft — Background #f2f1f5 (purple-grey wash), text #171321, 8px radius, no border. Hover background #e8e6ee. Use: tertiary in-page controls where a full outline would be too heavy.
Accent (Orange) — Background #fc6d26, text #ffffff, 4px radius. Hover background #e24329 (tanuki red). Use: the single high-energy spark CTA — used sparingly, never as the default everywhere.
Ghost — Transparent background, ink text, 4px radius, padding 12px 16px. Hover rgba(23, 19, 33, 0.05) background. Use: text-only tertiary action.
Cards
Standard Card — Background #ffffff, 1px #dcd9e3 hairline border, 12px radius, 24px padding. Defined by border rather than fill. Use: generic feature card.
Soft Card — Background #f2f1f5 (purple-grey wash), no border, 12px radius, 24px padding. Use: content wells, grouped lists, soft feature tiles.
Ink Card — Background #171321, text #ffffff, 12px radius, 32px padding. Use: inverted dark statement panel — a single high-contrast section against the white page. Orange accent and white-fill CTAs read well inside it.
Badges & Tags
Standard Badge — Background #f2f1f5, text #4d4a57, 9999 radius (pill), 4px 12px padding, caption font. Use: NEW / status pill.
Eyebrow Chip — Background rgba(252, 109, 38, 0.10), text #e24329 (tanuki red on tint), 9999 radius, 4px 12px padding, eyebrow font (uppercase, 0.08em tracked). The signature taxonomy label above a section heading — the one place orange consistently appears in chrome.
Inputs & Forms
Text Input — Background #ffffff, 1px #dcd9e3 border, 8px radius, padding 10px 12px, height 44px. Focus: border #6e49cb (tanuki purple), ring 0 0 0 3px rgba(110, 73, 203, 0.35). Label is label font (14/600) above the field.
Navigation
Top Nav — White background, 64px height, hairline #dcd9e3 bottom border on scroll. Layout: tanuki wordmark left, mega-menu triggers center (Platform / Solutions / Pricing / Resources), Sign in + “Get free trial” primary CTA right.
Nav Link — Transparent background, #171321 text, body-base font, padding 8px 12px. Hover: text shifts to #6e49cb purple, an underline appears. Mega-menu panels drop with the elevated shadow.
Decorative
Code Block — Background #f2f1f5 (surface-soft), 1px #dcd9e3 border, 8px radius, 16px padding, GitLab Mono 14/400. Optional filename header in mono 12/500/0.04em uppercase. Used for CLI / .gitlab-ci.yml config samples.
Hero Band — Full-width white band. display-hero (96/660/-0.03em) headline, body-lg (20/400) subhead, two CTAs (dark primary + outline secondary). 96px+ vertical padding.
5. Layout Principles
Spacing System
- Base unit: 4px.
- Scale: 0 / 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128.
- Section padding ladder: 48px (condensed) / 96px (normal) / 128px (spacious).
- Card padding: 24px standard, 32px for ink statement panels.
Grid & Container
- Max content width: 1280px.
- Prose width: 720px for long-form editorial passages.
- Hero region: generous block padding (96–128px) so the 96px headline has room to breathe.
- Feature grids: 2–3 columns at desktop with 24–32px gaps; collapse to 1-up on mobile.
- Footer: 4–5 column link matrix at desktop.
Whitespace Philosophy
GitLab’s white space is editorial, not minimalist-for-its-own-sake. The pure-white ground plus oversized type means the page leans on generous margins to keep the giant headlines from feeling cramped. Unlike GitHub’s deliberately dense 14px chrome, GitLab’s body is comfortable (16–18px) and sections are roomy — the white space is the calm counterweight to the monumental type.
Section Cadence
- White hero with 96px headline → feature grid (bordered + soft cards) → inverted ink statement panel → logos / social proof → pricing or platform breakdown → CTA band → footer.
- Tonal rhythm comes from alternating white, soft purple-grey (
#f2f1f5), and the occasional ink-dark panel — never a busy multi-color section.
6. Shapes & Radius Scale
| Token | Value | Tier | Use |
|---|---|---|---|
| micro | 2px | Micro | Inline chips, the smallest pills |
| sm | 4px | Standard | Buttons, CTAs — GitLab’s tight signature radius |
| md | 8px | Comfortable | Inputs, code blocks, soft buttons |
| lg | 12px | Relaxed | Cards, content wells |
| xl | 16px | Large | Large feature panels, media frames |
| pill | 9999px | Pill | Badges, eyebrow chips, status pills |
The radius story is defined by the tight 4px CTA corner. Where many 2020s SaaS sites push buttons to 8–12px or full pills, GitLab keeps primary actions at a crisp 4px — a small but consistent signal of engineered precision. Cards relax to 12px and inputs sit at 8px, so there is a clear ladder: 4 (actions) / 8 (fields) / 12 (containers). Pills stay scoped to badges and eyebrow chips.
7. Depth & Elevation
| Level | Treatment | Use |
|---|---|---|
| 0 — Flat | #ffffff canvas | Body bands, footer |
| 1 — Soft fill | #f2f1f5 purple-grey wash | Content wells, soft cards |
| 2 — Bordered | #ffffff + 1px #dcd9e3 hairline | Standard cards |
| 3 — Lifted | #ffffff + standard shadow | Hover state on interactive cards |
| 4 — Floating | #ffffff + elevated shadow | Mega-menu panels, dropdowns |
| 5 — Modal | #ffffff + deep shadow | Dialogs, lightboxes |
| Ink — Inverted | #171321 panel | High-contrast statement section |
Shadow Philosophy
GitLab leans on contrast and white space for depth, not shadow. On the bright canvas, separation is achieved primarily through hairline borders (#dcd9e3) and soft purple-grey fills (#f2f1f5); shadow is reserved for genuinely floating elements — mega-menu panels, dropdowns, and modals. The shadow color is a low-alpha ink tint (rgba(23, 19, 33, 0.10–0.18)) so it reads as a soft, neutral lift rather than a heavy drop. The inverted ink panel is its own elevation device: dropping to #171321 against white creates more separation than any shadow could.
8. Interaction & Motion
Easing & Duration
- ease-standard:
cubic-bezier(0.4, 0, 0.2, 1)— material default for color and position shifts. - ease-emphasized:
cubic-bezier(0.2, 0, 0, 1)— used for card hover lift and panel entrance. - ease-entrance:
cubic-bezier(0, 0, 0.2, 1)— on-scroll content reveal. - duration-fast: 150ms — color shifts on hover.
- duration-standard: 240ms — card lift, mega-menu drop.
- duration-slow: 320ms — section reveal on scroll.
Per-Component Micro-States
- Primary button hover: background
#171321→#2b2640, no transform. 150ms. - Outline button hover: background transparent →
#f2f1f5. 150ms. - Accent button hover: background orange
#fc6d26→ red#e24329. 150ms. - Card hover: ambient → standard shadow, translateY(-2px). 240ms.
- Nav link hover: text →
#6e49cb, underline slides in. 150ms. - Input focus: border
#dcd9e3→#6e49cb, purple ring fades in. 150ms. - Eyebrow chip: static; the tint does the work, no hover.
Page Transitions
The homepage uses restrained on-scroll reveals — sections fade up from below (translateY(16px) → 0, opacity 0 → 1, 320ms, ease-entrance) as they enter the viewport. Mega-menu panels drop with a quick fade-and-scale from the trigger. The motion language is calm and editorial; nothing bounces.
Reduced Motion
Respects prefers-reduced-motion: reduce. When set:
- Card hover lifts collapse to a color/shadow change only (no translate).
- On-scroll reveals become instant (opacity snaps, no translate).
- Mega-menu drops appear without the scale animation.
9. Accessibility & A11y
Contrast Pairs
| Pair | Ratio | WCAG |
|---|---|---|
#171321 text on #ffffff canvas | 16.9 | AAA |
#171321 text on #f2f1f5 soft | 15.6 | AAA |
#ffffff on #171321 dark CTA / ink panel | 16.9 | AAA |
#6e49cb purple link on #ffffff | 6.6 | AA (AAA at large) |
#4d4a57 soft text on #ffffff | 8.6 | AAA |
#fc6d26 orange on #ffffff | 3.2 | AA for large text / UI elements only |
Note: the tanuki orange #fc6d26 clears 3:1 — acceptable for large text, icons, borders, and UI accents, but not for small body copy on white. When orange must carry text, use the darker red #e24329 (4.0:1) or white text on an orange fill.
Focus Indicators
3px rgba(110, 73, 203, 0.35) ring paired with a 1px solid #6e49cb edge on the light canvas. Applied to every interactive element — buttons, links, inputs, nav, cards. Never outline: none without a replacement ring.
ARIA Patterns
- Menu: mega-menu triggers use
aria-expanded+aria-controls; panels arerole="region"with a labelled heading. - Dialog:
role="dialog"+aria-modal="true"+ focus trap on demo-request and sign-in modals. - Disclosure: pricing FAQ accordions use
aria-expandedon the trigger button. - Tablist:
role="tablist"for platform-overview tab navigation.
Keyboard Nav
- Tab order strictly follows visual order.
- Skip-link present in header, visible on focus.
- Mega-menu navigable by arrow keys; Escape closes.
- Escape closes modals; standard tab cycle inside the focus trap.
Screen Reader
- Decorative tanuki / gradient marks are
aria-hidden="true". - Eyebrow chips include the section name as accessible text.
- Pipeline-status icons carry text alternatives (“Passed”, “Failed”) rather than relying on color alone.
Reduced Motion
Honored — see §8.
10. Responsive Behavior
| Breakpoint | Range | Key Changes |
|---|---|---|
| Mobile | < 640px | display-hero 96→40px; grids 1-up; nav → hamburger; CTAs full-width stack |
| Tablet | 640–1024px | display-hero 56–64px; grids 2-up; CTAs inline |
| Desktop | 1024–1280px | display-hero 72–96px; grids 2–3-up; full mega-menu |
| Wide | > 1280px | Content caps at 1280px; hero gets maximum block padding |
Touch Targets
- Primary CTA: 44px height — meets WCAG AA touch target.
- Nav links: padded to a 44px tap target on mobile.
- Cards: full card is the tap target where clickable.
Collapsing Strategy
- Top nav collapses to a hamburger + slide-in panel below 1024px.
- Feature grids: 3-up → 2-up → 1-up.
- The 96px hero drops sharply (to ~40px) on mobile to stay on-screen; tracking loosens slightly at small sizes.
- CTAs stack full-width below 640px.
- Code blocks keep horizontal scroll (no wrap).
Image Behavior
Product screenshots use srcset 1x/2x. Hero illustrations and the tanuki gradient mark scale fluidly; large media frames drop their 16px radius to full-bleed on mobile.
Container Queries
Used inside large feature panels — internal layout reflows when the panel itself narrows below ~560px regardless of viewport.
11. Content & Voice
Tone
Confident, plain-spoken, enterprise-credible. GitLab’s voice sounds like a platform team explaining the whole software lifecycle in one breath — declarative, slightly grand at the headline (“Finally, AI for the entire software lifecycle.”), then concrete and benefit-led in the body. Sentences trend medium-length; jargon is defined; the platform is positioned as one place that does everything.
Microcopy Patterns
- Button verbs: “Get free trial”, “Request a demo”, “Contact sales”, “Read the docs”, “Explore the platform”.
- Error recipe:
[What failed] — [Why] — [What to do]. Example: “Pipeline failed. A test did not pass. Review the job log to retry.” - Status confirmations: terse and CI-flavored — “Passed”, “Pending”, “Failed”, “Merged”.
- Empty states: instructional — “No projects yet. Create one to start a pipeline.”
CTA Verb Conventions
- Primary: “Get free trial”, “Start free”, “Request a demo”.
- Secondary: “Explore the platform”, “See pricing”, “Read the docs”, “Talk to sales”.
- Avoid: breathless superlatives, emoji-heavy CTAs, exclamation pile-ups.
Empty States
GitLab’s marketing rarely surfaces empty states; when they appear (search, resource filters), copy stays terse: “No results. Try a different filter.” Illustrations, when used, are simple line work in the tanuki palette — never cluttered.
12. Dark Mode & Theming
GitLab’s marketing site is light-only — there is no dark marketing chrome and no theme toggle on about.gitlab.com. The pure-white #ffffff canvas with near-black #171321 ink is the brand surface. The product UI ships its own light and dark themes via the Pajamas design system, but those are product concerns; the marketing identity is deliberately the bright one.
The one inversion device the marketing chrome uses is the ink statement panel — a single section dropped to #171321 with white text, the orange accent, and white-fill CTAs. This gives the page a high-contrast moment without committing to a full dark mode, and it is the closest the marketing surface comes to “dark.”
If a dark variant were ever needed, the natural mapping would be: bg → #171321, text → #ffffff, surface-soft → a dark purple-grey, border → a light hairline, with the tanuki orange #fc6d26 and purple #6e49cb carrying through unchanged. But this is hypothetical — the shipped marketing chrome is light.
13. Lineage & Influences
GitLab sits at the intersection of Swiss editorial typography (big type, tight grid, generous white space), its own Pajamas design system (the deeply-tokened language that powers both product and marketing), and the broader 2020s dev-tool marketing language — which it joins by inverting. Where GitHub, Linear, Vercel, and Cursor all chose the near-black canvas, GitLab makes the opposite bet: a pure-white page that lets oversized GitLab Sans headlines and a single orange spark carry the whole brand. The choice is contrarian on purpose; in a sea of neon-on-black, bright-and-confident is itself a differentiator.
The type investment is the deepest single signal. GitLab commissioned and open-sourced GitLab Sans (and GitLab Mono) to replace its earlier licensed-Source-Sans era, and the custom 660 display weight — heavier than 600, lighter than 700 — is tuned specifically for the monumental 96px headlines that anchor every page. The chromatic identity is the tanuki: the fox’s orange → red → purple gradient, with orange #fc6d26 doing the day-to-day accent work the way a highlighter marks a page. There is no diff-green analog as on GitHub; instead the fox-fire orange is the one unmistakably-GitLab color, and the near-black ink itself carries a faint purple tint that quietly nods to the gradient’s end-stop.
Named influences:
- GitLab Pajamas Design System — internal design system informing both product UI and marketing tokens.
- GitLab Sans / GitLab Mono — commissioned, open-sourced type families; the custom 660 weight is the fingerprint.
- GitLab Tanuki brand — the logo and its orange→red→purple gradient define the accent palette.
- Swiss / International Typographic Style — the big-type, tight-grid, white-space editorial lineage behind the oversized headlines.
- GitHub — the adjacent dev-platform marketing language GitLab deliberately inverts by choosing light over dark.
14. Do’s and Don’ts
Do
- Do anchor the canvas at pure white
#ffffff— the bright canvas is the brand’s contrarian signal. - Do use near-black
#171321ink everywhere, including for the default border. The faint purple tint matters. - Do run hero headlines big — 96px GitLab Sans at the custom 660 weight with
-0.03emtracking. - Do treat tanuki orange
#fc6d26as a sparing accent — a highlighter, not a fill-everything color. - Do make primary CTAs flat dark-on-white blocks (or white-on-dark on ink panels) at a tight 4px radius.
- Do use the soft purple-grey
#f2f1f5for secondary surfaces — wells, soft cards, code samples. - Do lean on contrast and white space for depth; reserve shadow for floating elements (menus, modals).
- Do use tanuki purple
#6e49cbfor links and the focus ring. - Do keep one ink statement panel per page for high-contrast rhythm.
- Do keep body comfortable at 16–18px — readability for a broad enterprise audience.
- Do scope orange-tinted eyebrow chips as the section-naming convention.
- Do use the 4 / 8 / 12 radius ladder: actions / fields / containers.
Don’t
- Don’t default to a dark canvas. GitLab’s whole position is the bright inversion of the dev-tool norm.
- Don’t fill primary CTAs with orange by default — the default primary is the dark block; orange is the rare spark.
- Don’t use small orange text on white — it fails contrast. Use red
#e24329or white-on-orange instead. - Don’t push button radius beyond 4px. The tight corner is the precision signal.
- Don’t flatten the type scale. The monumental jump from 96px hero to 16–18px body is the editorial signature.
- Don’t run headlines at flat 700. The custom 660 weight is the voice.
- Don’t introduce a third sans family beyond GitLab Sans and GitLab Mono.
- Don’t scatter the full tanuki gradient across the page — it belongs on marks and the occasional statement, not chrome.
- Don’t rely on heavy drop shadows for separation; hairline borders and soft fills do that work.
- Don’t recolor strong text — emphasis is a weight bump on the same ink, not a hue change.
- Don’t use uppercase outside eyebrows. Headlines and body stay sentence-case.
- Don’t cramp the giant headlines — they need generous block padding to read as intentional.
15. Agent Prompt Guide
Quick Color Reference
Background: #ffffff
Surface Soft: #f2f1f5
Ink Panel: #171321
Text / Ink: #171321
Text Soft: #4d4a57
Brand (Orange):#fc6d26
Brand Red: #e24329
Brand Purple: #6e49cb
Primary CTA: #171321 (text #ffffff)
Link: #6e49cb
Border: #171321 (structural) / #dcd9e3 (hairline)
Example Component Prompts
-
“Create a hero section in the GitLab style” — Pure-white
#ffffffcanvas, 96px GitLab Sans h1 at the custom 660 weight with-0.03emtracking in#171321ink, 20px body subhead at weight 400, two CTAs (dark#171321-on-white primary block + white-with-ink-border outline secondary), both at 4px radius. Generous block padding. -
“Design a feature card in the GitLab style” — Either a bordered card (
#ffffffbackground, 1px#dcd9e3hairline, 12px radius, 24px padding) or a soft card (#f2f1f5fill, no border, 12px radius). h4 title in GitLab Sans 24/600, 16px body. Optional orange-tinted eyebrow chip above the title. -
“Build a primary CTA in the GitLab style” —
#171321background,#fffffftext, 4px radius,12px 20pxpadding, 44px height, button font (16/600). Hover background#2b2640. The dark-on-white block is the default; reserve orange#fc6d26fill for the single key spark CTA. -
“Make an inverted statement panel in the GitLab style” — Drop a full-width section to
#171321ink with#fffffftext, 12px radius, 32px padding. Large GitLab Sans headline, the tanuki orange#fc6d26as the in-panel accent, and a white-fill CTA. One per page for high-contrast rhythm. -
“Add an eyebrow chip in the GitLab style” — Pill (9999 radius),
4px 12pxpadding,rgba(252, 109, 38, 0.10)background,#e24329text, uppercase eyebrow font (13/600/0.08emtracking). The section-naming convention. -
“Render a code block in the GitLab style” —
#f2f1f5background, 1px#dcd9e3border, 8px radius, 16px padding, GitLab Mono 14/400. Optional filename header in mono 12/500/0.04em uppercase. Good for.gitlab-ci.ymlconfig samples.
Iteration Guide
- Start with a pure-white
#ffffffcanvas — non-negotiable. GitLab’s brand is the bright inversion. - Set GitLab Sans display at the custom 660 weight with
-0.03emtracking, sized big (up to 96px hero). The fingerprint. - Use near-black
#171321ink for text and structural borders — note the faint purple tint. - Make primary CTAs flat dark blocks at 4px radius. Keep orange
#fc6d26as a sparing accent, not a fill-everything color. - Build sections in white / soft purple-grey
#f2f1f5/ occasional ink-dark#171321— never busy multi-color. - Use 4px on buttons, 8px on inputs, 12px on cards. Don’t cross the ladder.
- Reach for hairline borders and white space before shadow; reserve shadow for floating menus and modals.
- Let tanuki purple
#6e49cbcarry links and the focus ring; if orange must hold text, switch to red#e24329.
Theme-toggle audit: score=0, signals=[none]
Drop gitlab into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add gitlab npx agentkit init --design gitlab