Skip to content

Neon Design System

Neon's serverless Postgres look as a DESIGN.md: black canvas, emerald #34d59a, tight Inter headlines at 80px and GeistMono code, for React and AI tools.

Primary color
#34d59a
Typeface
Inter
Shape
Sharp
Base radius
4px
Colors
25
Type tokens
11
Components
18
Spacing values
9

About Neon DESIGN.md

Curated by Dov Azencot, updated May 13, 2026. Source neon.com (opens in a new tab).

Neon's marketing surface is the inverse of the developer-database category. Where Supabase commits to a white canvas with a green accent and Postgres-the-marketing-site usually leans editorial-light, Neon defaults to true black (#000000) and lets a single emerald (#34d59a) carry every link underline, every code-keyword highlight, and the lit autoscaling-graph spikes that visualize the product. Type runs Inter at weight 400 across the entire display tier — the 80px hero pulls -3.2px tracking out of the geometric letterforms to compensate for the absent weight. There's no second accent color, no gradient mesh, no brand-blue link. The greens, the black, and the gray ladder from #94979e to #18191b are the entire palette.

This page packages that system into a single DESIGN.md file in the Google Labs open spec. Inside: 25 colors tokens (2 emerald variants, 8 grays, 4 surface fills, dark and light ink pairs, and the 4 Shiki syntax-highlight hues the brand reuses from its code blocks), 11 typography styles split between Inter and GeistMono, 4 radius tokens anchored at 4px, an 8-step spacing scale rooted on the brand's 4px grid, and 18 components recipes spanning the dark primary CTA, the inverted light-band autoscaling card, the GeistMono code block at #000000, and the underline-only nav link pattern that does most of the chrome work.

Feed the file to Claude, Cursor, or GitHub Copilot and the agent reproduces Neon's specific discipline — black-first marketing, weight-400 displays with aggressive negative tracking, emerald reserved for code and graphs, square 4px corners instead of pills. Reference the tokens directly inside a Tailwind config, or audit an existing React app against them. The system is worth studying because it proves a Postgres brand can ship a serious marketing track without a white canvas and without a single bold weight — the graph spikes do the work that bold type usually does.

What makes it distinct

5 highlights

  1. Black canvas as default#000000 carries hero, footer, and feature bands; the white sections are interruptions, not the baseline
  2. Inter at weight 400 / 80px / -3.2pxThe display tier refuses bold weights and earns presence by tracking compression instead
  3. Two greens, two jobs#34d59a (CSS --shiki-token-keyword) for code and links; #00e599 reserved for autoscaling-graph spikes
  4. Square 4px radii everywhere63 of 73 captured radius events resolve to 4px; pills exist only on a handful of badge chips
  5. GeistMono at 12px / 16px for technical labels and code blocksThe brand's developer DNA is visible in every snippet

Live at neon.com

Neon in production, as captured. Scroll the window to see the whole page.

Neon's website at neon.com

25 colors

Neon's system runs on #34d59a as its primary voltage, used in 1 of 18 components. Type is set in Inter across 11 tokens from 12px to 80px, weights 400–500. Shape language is sharp — components average 2px corner radius, favoring crisp rectangles.

Brand & Accent

Sparing, CTA-only voltage · 4

Surface

Page and card backgrounds · 7

Text

Headlines, body, captions · 8

Borders & Hairlines

Dividers, outlines, rules · 4

Other

Specialty colors · 2

11 type tokens

Set in Inter across 11 tokens, from 12px to 80px, weights 400–500. Shown in its own stack: where the font isn't installed, the fallback the file names stands in.

  • display-xl80px · weight 400 · lh 1 · tracking -3.2pxThe quick brown fox jumps over the lazy dog
  • display-lg48px · weight 400 · lh 1.125 · tracking -1.92pxThe quick brown fox jumps over the lazy dog
  • display-md28px · weight 400 · lh 1.375 · tracking -0.56pxThe quick brown fox jumps over the lazy dog
  • display-sm24px · weight 500 · lh 1 · tracking -0.96pxThe quick brown fox jumps over the lazy dog
  • body-lg18px · weight 400 · lh 1.5 · tracking -0.36pxThe quick brown fox jumps over the lazy dog
  • body-md16px · weight 400 · lh 1.5 · tracking -0.4pxThe quick brown fox jumps over the lazy dog
  • body-sm15px · weight 400 · lh 1.5 · tracking -0.3pxThe quick brown fox jumps over the lazy dog
  • button-md15px · weight 400 · lh 1.5 · tracking -0.15pxThe quick brown fox jumps over the lazy dog
  • caption13px · weight 400 · lh 1.25 · tracking -0.26pxThe quick brown fox jumps over the lazy dog
  • eyebrow-mono12px · weight 500 · lh 1 · tracking 0.1emThe quick brown fox jumps over the lazy dog
  • code16px · weight 400 · lh 1.5 · tracking -0.32pxThe quick brown fox jumps over the lazy dog

Radii and spacing

4 corner radii and 9 spacing values. Shape language: sharp, on a 4px base radius.

Radii4

  • none0px
  • sm4px
  • xl16px
  • full9999px

Spacing9

  • xxs2px
  • xs4px
  • sm8px
  • md12px
  • base16px
  • lg20px
  • xl24px
  • 2xl32px
  • 3xl80px

18 components

Each rendered from its tokens (color, type, radius, padding) on Neon's own canvas.

  • Button Primary
    Button Primarybutton-primary
  • Button Primary Hover
    Button Primary Hoverbutton-primary-hover
  • Button Secondary
    Button Secondarybutton-secondary
  • Button Ghost Dark
    Button Ghost Darkbutton-ghost-dark
  • Nav Link
    Nav Linknav-link
  • Link Emerald
    Link Emeraldlink-emerald
  • Top Nav
    Top Navtop-nav
  • Hero Headline
    Hero Headlinehero-headline
  • Section Heading Dark
    Section Heading Darksection-heading-dark
  • Card Feature Dark
    Card Feature Darkcard-feature-dark
  • Card Autoscale Light
    Card Autoscale Lightcard-autoscale-light
  • Badge Pill
    Badge Pillbadge-pill
  • Code Block
    Code Blockcode-block
  • Code Keyword
    Code Keywordcode-keyword
  • Type here…
    Text Inputtext-input
  • Caption Mute
    Caption Mutecaption-mute
  • Divider Hairline Dark
    Divider Hairline Darkdivider-hairline-dark
  • Graph Spike
    Graph Spikegraph-spike

The system, in use

Neon's tokens on the kind of product it builds.

Marketing heroThe homepage: its nav, a headline and the main call to action.
Neon
Sign up

The fastest way to build and ship software

Deploy from git in seconds, scale on demand and keep every environment in sync.

Start deployingRead the docs
NeonA
Requests2.4M
Deployments148
Error rate0.08%
p95 latency182ms
RequestsLast 30 days

Neon design system FAQ

Neon's tokens, its components and how to use this DESIGN.md in your project.

Use Neon in your project

One machine-readable file. Drop it into Claude Code, Cursor, VS Code or any AI tool that reads DESIGN.md.

Download DESIGN.md
  1. Download the DESIGN.md

    One machine-readable file: every color, type, radius, spacing, and component token of Neon.

  2. Feed it to your AI tool

    Drop it into Claude, Cursor, or GitHub Copilot. The agent writes React components and Tailwind classes that match Neon's visual language.

  3. Reference the tokens directly

    Or paste the values into your Tailwind config, CSS variables, or component library: every color, size and radius is a quoted, ready-to-copy value.

Read the full DESIGN.md overview, rationale, do’s and don’ts

Overview

Neon's marketing surface is the inverse of the developer-database category. Where most Postgres brands operate on a white canvas with a colored accent, Neon defaults to true {colors.canvas} (#000000) and treats white as the interruption — used only when a chart or product visualization needs a light backdrop to make the green graph spikes legible. The brand reads as phosphor-on-CRT: dark fields broken by emerald data lines, GeistMono captions, and Inter type compressed to editorial density.

Black-as-baseline: across the captured page, #000000 appears as a background in 8 contexts (hero, footer, code blocks, dark feature bands) and as a border or text color in 326 more. The system inverts the conventional polarity — the page IS dark, and any white surface is a deliberate spotlight on a graph or product mock.

Weight as restraint: Where most developer brands push 80px headlines to weight 600 or 700, Neon holds the hero {typography.display-xl} at weight 400 and earns presence through -3.2px tracking compression instead. The display tier never exceeds weight 500. This is not a brand that argues with bold type; it argues with letter-spacing math.

The single chromatic event is the emerald pair: {colors.primary} (#34d59a, declared in CSS as --shiki-token-keyword and --shiki-token-link) for code keywords and link underlines, and {colors.primary-bright} (#00e599) for the autoscaling-graph spikes. The two greens never overlap roles — one is for type, the other is for data viz. There is no second accent and no atmospheric gradient.

Key Characteristics:

  • Black canvas as default ({colors.canvas} #000000) — white surfaces appear only as interruptions for chart visualizations and the autoscaling band.
  • Single emerald voltage ({colors.primary} #34d59a) for code keywords and link text; {colors.primary-bright} (#00e599) reserved for graph spikes.
  • Display tier at Inter weight 400 with -3.2px tracking at 80px — no bold display anywhere on the page.
  • Flat 4px / 16px / pill radius scale — 63 of 73 captured radius events resolve to 4px.
  • GeistMono captions and code blocks running 12-16px against #000000, with Shiki syntax tokens (#ff990a parameter, #ffed9c string) reused as the only secondary chromatics.
  • A near-pure gray ladder from {colors.ink-faint} (#afb1b6) through {colors.ink-mute} (#94979e) down to {colors.hairline-darker} (#242628) and {colors.canvas-night} (#18191b) — eight steps, all neutral blue-cool, no warm grays.
  • Light-band interruptions for charts use a tinted mint surface ({colors.surface-mint} #e4f1eb) rather than pure white — the brand never quite leaves the green family.

Colors

  • Neon Emerald (#34d59a) — frequency 4. Used as text (1), bg (2), border (1). The brand voltage: declared in CSS as --shiki-token-keyword and --shiki-token-link. Reserved for code keywords and link underlines — never a CTA fill.
  • Spike Green (#00e599) — frequency 12. Used as text (6), border (6). A cooler, brighter emerald that carries the autoscaling-chart graph lines and a handful of stroke accents. Where #34d59a is for type, this one is for data viz.
  • Deep Emerald (#39a57d) — frequency 1, as gradient. The darker pair for hover and pressed states; never appears as a flat fill on the captured marketing track.
  • Mint Surface (#e4f1eb) — frequency 4. Background-only. The tinted off-white panel under the autoscaling chart — proves the brand never lands on pure white even when going light.
  • Pure White (#ffffff) — frequency 814. Used as text (413), bg (6), border (395). The dominant ink color, almost entirely as type on black canvas. Backgrounds are rare.
  • Pure Black (#000000) — frequency 339. Used as text (165), bg (8), border (163). The canvas voltage. Carries hero, footer, code blocks, and feature bands.
  • Mute Gray (#94979e) — frequency 159. Used as text (79), border (79). The workhorse mute color: secondary type on dark, hairlines on dark cards.
  • Deep Mute (#797d86) — frequency 118. Used as text (57), border (61). Carries the "Postgres for the AI Engineering era" section heading — proves the brand uses muted grays for headlines, not pure white.
  • Soft Gray (#c9cbcf) — frequency 44. Text and border ladder; appears in light-band interruptions.
  • Faint Gray (#afb1b6) — frequency 11. Background-leaning gray for input fills and inactive states.
  • Hairline Dark (#242628) — frequency 74. The 1px border color on every dark card — the visible scaffolding.
  • Canvas Night (#18191b) — frequency 18. Used as text (6), bg (3), border (9). The near-black surface for elevated cards on top of the pure-black canvas.

Typography

The system runs Inter for every text role and GeistMono for code, eyebrow chips, and technical labels. There is no third typeface and no display-only face. The variation across the 11 tokens is weight (300 / 400 / 500) and size (10-80px), not family.

Display sizes stair-step display-xl 80px → display-lg 48px → display-md 28px → display-sm 24px, with letter-spacing compressed from -3.2px at the top to -0.56px at the bottom. Every display tier sits at weight 400 except the 24px tier at 500. Weight as restraint: the 80px hero refuses the conventional bold display weight — the brand earns presence through tracking math instead of stroke thickness.

Body runs 15-18px at weight 400 with -0.3px to -0.4px tracking. The eyebrow chips use GeistMono at 12px / weight 500 / 0.1em tracking — wide, uppercase, technical. Code blocks render GeistMono at 16px against the black canvas, with Shiki syntax tokens ({colors.primary} for keywords, {colors.code-parameter} #ff990a for parameters, {colors.code-string} #ffed9c for strings).

Layout

The page operates on a --spacing token of 0.25rem (4px), which makes the entire grid divisible by 4. Captured spacing values cluster at 12px (32 occurrences), 8px (14), 20px (11), 24px (9), and a recurring 80px section gap (8 occurrences). The container scale tops out at --container-7xl (80rem) but most hero content sits inside the 6xl (72rem) container with 0px 32px horizontal padding (12 captured events).

Hero composition is single-column centered: the 80px headline sits in a ~832px measure, the subhead below in a ~960px measure. Feature bands alternate orientation — chart cards run 2-up at hero width, while text-led bands stack centered with the same 80px section gap separating them.

Elevation & Depth

Neon's elevation system is hairline-led, not shadow-led. Every elevated card on the dark canvas uses a single 1px border in {colors.hairline-dark} (#242628) or {colors.hairline-darker} (#303236) against a {colors.canvas-night} (#18191b) fill — the slightly lifted near-black on pure black gives ~2 perceptual levels of elevation without a single shadow declaration. The extracted CSS confirms it: the default --tw-shadow resolves to transparent zero across nearly every elevated surface.

The result is a card system that reads as flat-but-distinct — exactly the right register for a database product. Heavy shadows would feel material and consumer; the hairline ladder reads as technical and CRT-like.

Shapes

Neon's radius scale is the flattest in the directory. Of 73 captured radius events, 63 resolve to 4px ({rounded.sm}), 9 to the pill scale ({rounded.full} 9999px, used only for tiny status chips), and 1 to 100% (avatars). There is no 8px, no 12px, no 16px-card-radius intermediate. The CSS variables expose a --radius-xl at 12px and --radius-2xl at 16px from the Tailwind config, but the page itself almost never reaches for them.

The 4px square-ish corners read as engineered rather than friendly — the right register for a database product. Where Supabase lands at 6px and Vercel pushes marketing CTAs to fully-pilled 100px, Neon stays at 4px on buttons, cards, inputs, and code blocks alike. The flatness is the voice.

Components

Eighteen recipes mapped from the captured ground truth, anchored to the dark canvas:

  • button-primary: black-on-black with a {colors.hairline-darker} hairline border, 12px / 24px padding, Inter body-md type. The CTA reads as a lit panel inside the canvas, not as a colored chip.
  • button-secondary: white fill with {colors.hairline} border, dark ink — the inverted variant for light-band interruptions.
  • nav-link: ghost button with 0px 14px padding, 4px radius, sitting on the black top nav. No underline at rest; emerald appears on hover.
  • link-emerald: inline link in {colors.primary-link} (#47d18c) against black body text, no padding, no radius — pure text decoration.
  • hero-headline: 80px Inter at weight 400 with -3.2px tracking, white on black.
  • card-feature-dark: {colors.canvas-night} fill, {colors.hairline-dark} 1px border, 4px radius, 32px padding — the standard elevated surface.
  • card-autoscale-light: {colors.surface-mint} fill with {colors.surface-mint-soft} border, dark ink — the tinted mint panel under the chart band.
  • badge-pill: GeistMono eyebrow chip in a pill radius, near-black fill with hairline-dark border.
  • code-block: black fill with {colors.hairline-dark} border, GeistMono at 16px, syntax tokens in {colors.primary} / {colors.code-parameter} / {colors.code-string}.
  • text-input: {colors.canvas-night} fill with {colors.hairline-darker} border, Inter body-md.
  • graph-spike: the autoscaling-chart line itself — {colors.primary-bright} (#00e599) stroke against {colors.surface-mint} panel.

Do's and Don'ts

Do:

  • Default to {colors.canvas} (#000000) for marketing surfaces — the brand inverts the developer-database convention by treating black as baseline.
  • Hold display weights at 400 (or 500 at most) and compress letter-spacing to -3.2px at 80px — the typographic restraint is the voice.
  • Reserve {colors.primary} (#34d59a) for code keywords and inline link text; reserve {colors.primary-bright} (#00e599) for chart strokes. The two greens are not interchangeable.
  • Use {colors.hairline-dark} (#242628) 1px borders for card elevation instead of box-shadows — the captured CSS confirms the default --tw-shadow resolves to transparent zero.
  • Set GeistMono eyebrow chips at 0.1em letter-spacing in uppercase — the only place wide tracking appears.

Don't:

  • Don't fill the primary CTA with green — emerald is for type and chart lines, not buttons. The brand CTA is black-on-black with a hairline border; a green button would push the voice toward Slack or Linear rather than Neon.
  • Don't reach for an 8px or 12px radius on cards — 63 of 73 captured radii are 4px. Adding a rounded-lg (8px) softens the engineered voice the system depends on.
  • Don't pair #34d59a with white backgrounds — the green is calibrated for black canvas. On white it reads as a Slack/Notion-default green and loses the phosphor quality. Use {colors.primary-deep} (#39a57d) on light surfaces instead.
  • Don't use {colors.ink-mute-deep} (#797d86) for body text — it's a heading color that carries the muted "Postgres for the AI Engineering era" section title. For body, use {colors.ink} (#ffffff) on dark or {colors.ink-on-light} (#000000) on light.
  • Don't introduce a third typeface — the brand runs Inter and GeistMono only. Adding a serif or a second sans collapses the technical voice.

Known Gaps

  • In-product console chrome: the database explorer, SQL editor, branch view, and query-history densities live inside the product app and weren't captured on the public marketing surfaces.
  • Focus rings: no text input was visible on the captured landing page; the focus-ring color, width, and offset on :focus-visible aren't documented.
  • Hover and pressed states: beyond the implied {colors.primary-deep} (#39a57d) gradient color, hover-state lifts on buttons and cards weren't consistently observable on the static capture.
  • Empty / loading / skeleton screens: not visible on the captured marketing pages.
  • Toast and inline-alert system: semantic info / success / warning / error treatments aren't represented in the marketing track.
  • Secondary Shiki tokens: the operator (#ba8c5e), string-expression (#af93ea), and function (#f7b983) syntax colors appear in code blocks but weren't classified as brand layers — they exist in the spec but aren't exposed as top-level color tokens here.

Build it with Pro

The DESIGN.md files are free. Pro adds 6,000+ blocks, premium templates and the MCP server, so your AI editor builds in your system for you.

4.9/5 out of 5 · 150+ reviewsfrom 150+ founders and developers.

Billed once a year in USD. Cancel anytime.

Individual

For personal projects & open source

$32instead of $49/mo

$389 billed yearly

  • How many people can use the license.Seats: 1 seat
  • Client work, SaaS products and anything you charge for.Commercial use: Personal & open source only
  • Page sections in 56 categories, from heroes and pricing tables to dashboards and settings, on every framework and UI library, in your theme.Blocks: All 6,181 blocks
  • Complete Next.js sites for startups, SaaS, agencies and portfolios, every page designed, ready to ship.Templates: All 14 templates
  • Your AI agent searches, previews and installs any component, block, icon or DESIGN.md from a prompt: 22 tools in Claude Code, Cursor, VS Code and 35 more clients.MCP server: 38 AI clients
  • Buttons with motion and states of their own, from an arrow that slides in to a burst of confetti.Animated buttons: All 35 buttons
  • Typewriters, scrambles, counters and more, for headlines, labels and numbers.Text effects: All 97 effects
  • Animated backgrounds for heroes, sections and cards, from a soft aurora to a flock that flees the cursor. Most are pure CSS.Backgrounds: All 100 backgrounds
  • WebGPU shaders, from a slow aurora to a black hole, each drawing only while it's on screen.Shaders: All 100 shaders
  • One design and one theme on all four: the components, blocks and effects are built for each framework.Frameworks: React, Vue, Svelte, Solid
  • React on Base UI, Radix UI, React Aria or Ark UI: install the version for the library your project already uses. Vue, Svelte and Solid run on Ark UI.UI libraries: Base UI, Radix, Aria, Ark
  • From a button to a date picker, a color picker or a guided tour: accessible, typed in TypeScript, each with live demos.Components: All 174 components
  • Real-world patterns built from the components, in 53 galleries: forms, tables, menus, dialogs and more.Examples: All 1,103 examples
  • Area, bar, line, pie, radar and radial charts on TanStack Charts, on every framework. React also gets the Recharts originals.Charts: All 70 charts
  • Debounce, local storage, media queries and more: each hook is one typed file you own.React hooks: All 35 hooks
  • From 222 libraries, Lucide, Heroicons, Tabler and Material Symbols among them, as SVG or a React component in one command.Icons: 294k+ icons
  • Stripe, Linear, Apple and 497 more: a brand's colors, typography and components in one file your AI agent builds from.DESIGN.md files: All 500 brands
  • Restyle every component and block at once: 8 styles, 8 grays, 18 colors and 5 radii, shared as a shadcn preset code.Theme builder: 8 styles × 18 colors
  • Priority requests are answered first.Support: Standard

Team

Most popular

For freelancers, agencies & startups

$66instead of $99/mo

$789 billed yearly · ≈ $13/dev/mo

Everything in Individual, plus

  • How many people can use the license.Seats: Up to 5 seats
  • Client work, SaaS products and anything you charge for.Commercial use: Included
  • Priority requests are answered first.Support: Priority

Organization

For companies with larger teams

$132instead of $199/mo

$1,589 billed yearly

Everything in Team, plus

  • How many people can use the license.Seats: Unlimited seats
  • Secure checkout via Stripe
  • Code lives in your repo
  • Keep what you've shipped if you cancel
  • License terms

4.9 out of 5 from 150+ developers

Your system, built for you

Every block, template and icon, installed by your AI agent in your design system. The DESIGN.md files stay free.

Get Pro
  • Cancel anytime
  • Keep what you've shipped