Design system

Everything the Rerun interface is made of, rendered by the same components the product ships, next to the exact values behind them. Colors are authored in oklch and resolved here to the sRGB your tools understand. Click a swatch to copy it.

The system is built for both themes. Almost every value on this page changes when you switch, so read it twice before deciding what a shot should look like.

Color

One saturated accent on an achromatic base. Everything else earns its color by meaning: agent status, success, danger, a question waiting on a human.

Brand

The violet is the only chromatic note in the chrome. It never fills a large surface, it marks one thing at a time.

Brand#4d34f7The one saturated accent
Brand light#b7a8ffTint, beams, gradient start
Brand deep#220fa0Gradient end
Charcoal 700#343434
Charcoal 900#202020

Hero gradient

A radial gradient clipped to the text, anchored above the headline so the light appears to fall from off screen. Stops: #b7a8ff at 25%, brand at 75%, #220fa0 at 160%, centered at 50% -80%.

Agents on autopilot

Neutral ramp

Authored in oklch with zero chroma, so it is a true grayscale, not a tinted one. The values below are the sRGB the screen actually shows. Switch the theme at the top of the page to read the other set.

Backgroundvar(--background)var(--background)
Foregroundvar(--foreground)var(--foreground)
Cardvar(--card)var(--card)
Popovervar(--popover)var(--popover)
Primaryvar(--primary)var(--primary)
Primary foregroundvar(--primary-foreground)var(--primary-foreground)
Secondaryvar(--secondary)var(--secondary)
Mutedvar(--muted)var(--muted)
Muted foregroundvar(--muted-foreground)var(--muted-foreground)
Accentvar(--accent)var(--accent)
Bordervar(--border)var(--border)
Inputvar(--input)var(--input)
Ringvar(--ring)var(--ring)
Destructivevar(--destructive)var(--destructive)
Dividevar(--divide)var(--divide)Landing only, section rules

In dark mode borders and inputs are translucent white rather than a solid gray. That is what gives surfaces their soft glass edge instead of a drawn outline.

Agent status

The five states an agent block can be in on the board. Color, glow and opacity all carry the state.

Idle#165dfcglow rgba(59,130,246,0.4)
Working#f59e0bglow rgba(245,158,11,0.6)
Error#ef4444glow rgba(239,68,68,0.6)
Waiting for a human#06b6d4glow rgba(6,182,212,0.5)
Offlinevar(--iso-tile-muted)var(--iso-tile-muted)opacity 0.45, no glow

Semantic

Used by toasts, switches and the current running through cables.

Success#34d399Toast success, switch on
Danger#f87171
Questionrgb(34, 211, 238)Toast question
Cable current#4ade80Comet head
Inforgb(161, 161, 170)Toast info

Typography

Two families only. Inter carries everything an eye reads as prose or chrome, DM Mono carries everything that reads as a machine talking: values, ids, logs, tile labels.

Ag--font-primary

Inter

Interface and prose. Loaded as a variable font.

Regular 400 · Agents that ship work while you sleep

Medium 500 · Agents that ship work while you sleep

Semibold 600 · Agents that ship work while you sleep

Ag--font-mono

DM Mono

Weights 400 and 500 only. Values, ids, tile labels, toasts.

400 · agent.run("rerun")

500 · Found 24 sources

Scale

Headings sit at 500, never bold. Display sizes carry tracking-tight, everything else stays at normal tracking.

Page headline (h1)

36 / 48 / 72 px

Agents on autopilot

Section headline (h2)

24 / 30 / 36 px

Agents on autopilot

Subheadline

14 / 16 px

Agents on autopilot

Card title

18 px

Agents on autopilot

Body

14 px

Agents on autopilot

Micro / eyebrow

12 px

Agents on autopilot

Tile label (board)

8 px

Agents on autopilot

SansInter, next/font/google, subsets latin, display swap
Mono (landing)DM Mono, weights 400 and 500
Mono (product app)Geist Mono
Heading fontsame as sans, no separate display face
Heading weight500
Display trackingtracking-tight (-0.025em)

The marketing site and the product app do not share the same mono. The landing sets DM Mono, the app sets Geist Mono. For launch material, follow the landing and use DM Mono.

Shape, depth and surfaces

Nothing in the system is a flat rectangle with a hard border. Containers are softly rounded, surfaces are separated by a hairline ring rather than a drawn box, and anything clickable carries a physical relief.

Radius

A single base of 10px, scaled. Containers take xl, controls take lg, menu items take md, pills go full.

sm6px
md8px
lg10px
xl14px
full9999px

The product app extends the same scale with 2xl 18px, 3xl 22px and 4xl 26px for its outer frame and panels.

Relief

Light falls from above. A filled button gets a bright inner stroke on its top and sides, a diffuse veil under the top edge, and a drop shadow below. It is built entirely out of box-shadow layers because that is the only property in the set that interpolates, so hovering it moves rather than jumps. The translucent secondary button follows the theme rather than the surface behind it, which is why it disappears on the inverted tile below. That is intended: it is never placed on a surface that fights it.

background
card
muted
pure black
pure white
gradient
--relief-cta, at rest
--relief-cta-hover
--relief-ctaLarge marketing button. 2px inner strokes, 22px veil, 14px drop shadow.
--relief-solidFilled button inside the app, about half the height. 1px strokes, tighter veil.
--relief-subtleTranslucent or light fills. Top stroke and a shallow shadow, nothing else.
Transition150ms on background-color, border-color, box-shadow and color
Pressactive:scale-[0.98], applied outside the transition so it lands instantly

The relief flips polarity between themes. In light mode a white veil builds up on hover. In dark mode the fill is already white, so the relief comes from a dark veil at the bottom that fades away on hover: the button appears to switch on. Toggle the theme above and hover the buttons to see it.

Surfaces

Panels are separated from the page by a hairline ring and a change of value, never by a heavy shadow.

card + hairline ring
glass chrome
muted fill
Panelrounded-xl bg-card ring-1 ring-foreground/10
Floating chromerounded-full bg-neutral-900/80 backdrop-blur-md border border-neutral-700/50 shadow-2xl
Dialog overlaybg-black/10 with backdrop-blur-xs, barely there
Page framemax-w-7xl with a 1px rule on both sides, 8px square markers at the corners
Section splita single 1px horizontal rule, no gap, no shadow

Iconography

Icons are thin outline glyphs, never filled and never colored. When one needs presence it is seated in a framed box that carries the same grid and light as the logo tile, which is what ties a third party logo back into the system.

Framed icon

Three stacked layers: a faint square grid faded by a radial mask, a soft central reflection, then the glyph.

xs · 20px
sm · 32px
md · 40px
lg · 48px
xl · 64px

Service logos

Third party logos keep their official colors. Only a mark whose measured contrast is too low is rendered white on a dark surface.

Slack
Notion
Linear
Stripe
GitHub
Glyph setNucleo outline 18, one weight, no filled variants
Default size in controls16px
Grid cellabout a quarter of the box, 0.5px stroke
Grid faderadial mask, opaque at the center to transparent at 78%
Brand logo treatmentofficial colors; auto-white only below 3:1 contrast on dark surfaces

Components

The border beam is the signature. It is a conic gradient masked down to a one pixel ring, spinning behind the edge of a card, a pill, a button or a badge. Wherever the system needs to say something is alive, it puts a beam on it rather than a color.

Beam patterns

Two shapes, available in every tone. The angle at which a static beam is pinned is chosen per element so a row of cards never lights up in unison.

ring
brand
white
neutral
green
red
orange
cyan
yellow
arcs
brand
white
neutral
green
red
orange
cyan
yellow

Badges

A pill with a beam ring and text tinted to the same tone. Used for status, plan tiers and section eyebrows.

brandwhiteneutralgreenredorangecyanyellow
xssmmdlgoutlineAnimated with shimmer
Defaultring pattern, brand tone, static ring, glow on
Status pillsize xs, glow off
Shimmera light sweep across the text, 5s linear, spread in px

Buttons

Two variants only. A filled primary that carries the full relief, and a translucent default that follows the theme rather than the surface behind it.

Heightssm 32, default 36, lg 40, xl 48, xxl 56 px
Radiusrounded-xl, 14px
Beamarcs, brand tone, glow, width 1.5, 4s spin, sitting on the 1px border
Hover150ms on color and relief
Pressscale 0.98, immediate

Card

Cards are grouped by shared rules rather than individual boxes, and each carries a static beam pinned at its own angle.

Card title

Static beam pinned at 35 degrees.

Card title

Static beam pinned at 160 degrees.

Card title

Static beam pinned at 290 degrees.

Motion

Motion here is physical and quiet. Things settle rather than bounce, loops run slowly enough to be ignored, and nothing ever moves to decorate. If an element animates, it is because its state changed or because it is alive.

Easing

Four curves cover the whole system. The first one is the house curve: a fast start that decelerates hard, so an element arrives almost instantly and then eases into place.

Standardcubic-bezier(0.22, 1, 0.36, 1)Every physical transition: toasts, panels, handles, letter swaps
LinearlinearAnything that loops: beams, marquees, cable current, orbits
Ease in outcubic-bezier(0.42, 0, 0.58, 1)Breathing loops: shimmer, pulses, the logo fill
Deceleratecubic-bezier(0, 0, 0.2, 1)Ping rings expanding out of a tile
House curvecubic-bezier(0.22, 1, 0.36, 1)
Spring, when usedstiffness 260, damping 26, no overshoot worth noticing
Never usedelastic, back, or any curve that overshoots and returns

Durations

Every duration in the system, with its frame count at the usual rates. Interactions live between 150 and 400ms, ambient loops between 2 and 7 seconds, background motion above 20.

MotionDuration24 fps30 fps60 fps
Button color and relief150ms3.64.59
Dropdown open180ms4.35.410.8
Tile lift200ms4.8612
Container hover220ms5.36.613.2
Toast in280ms6.78.416.8
Side panel slide300ms7.2918
Letter swap, resize handles320ms7.79.619.2
Toast out400ms9.61224
Scramble decrypt520ms12.515.631.2
Error pulse800ms19.22448
Tile drop in1s243060
Cable current1.2s28.83672
Water ripple1.4s33.64284
Logo, one shot1.8s43.254108
Ping rings2s4860120
Toast shimmer2.4s57.672144
Logo, looping2.8s67.284168
Dashed outline crawl3.2s76.896192
Toast hold3.5s84105210
Tile shimmer, selection ring4s96120240
Border beam spin6s144180360
Conic shine7s168210420
Orbit24s5767201440
Marquee40s96012002400

Nothing pulses in unison

This is the rule that gives the product its living feel. Every repeating element gets its own duration and its own offset, derived from its id so it stays stable between renders. Five identical dots, five different rhythms.

Cable comettravel 1.7 to 3.2s, then a rest of 0.5 to 2.5s, both drawn from a hash of the link id
Tile shimmerthe three faces are offset by 0 / 0.5 / 1s so the sweep wraps the block
Ping ringsthe second ring starts 0.6s after the first
Static beamseach card pins its gradient at its own angle

Ambient loops

Running examples of the loops that carry the brand when nothing is happening.

beam, 4s
beam, 11s
Text shimmer sweep

Everything above is gated behind the reduced motion setting. When it is on, loops stop on their last frame, the cable comets are hidden entirely, and transitions are removed rather than shortened. Any launch material should have a version that reads without motion.

The isometric board

This is the product, and it is the brand. Agents are blocks sitting on an isometric grid, grouped inside spaces, wired to each other and to the tools they use. Everything else on this page exists to support it.

How the projection is built

It looks like 3D but there is none, which matters if this has to be rebuilt in a 3D tool. Each block is a flat diamond clipped out of a square, with two parallelograms sheared underneath it and darkened by a fixed amount. There is no perspective and no light source, so the geometry stays pixel sharp at any zoom.

Tile56 x 28 px, a 2:1 diamond, clip-path polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)
Block height7px, the two side faces
Left faceskewY(26.565deg) from its top left, brightness 0.7
Right faceskewY(-26.565deg) from its top right, brightness 0.5
Grid positionleft = (col - row) x 28, top = (col + row) x 14
Agent footprint2 x 2 cells, so 112 x 56 px
Flat planerotateX(60deg) rotateZ(45deg), no perspective, to lay artwork on the top face
EdgesSVG polygon, 1px stroke at 0.2 white, plus verticals at 0.15
Depth orderz-index = col + row, so anything further back is drawn first
Default zoom1.8 on desktop, 1.0 on mobile

26.565 degrees is not arbitrary: it is the angle whose tangent is 0.5, which is exactly what a 2:1 diamond needs for its side faces to meet the top without a seam. Same reason the flat plane uses 60 degrees, whose cosine is 0.5.

Agent states

Five states, each with its own color, glow and behaviour. Working shimmers, error pulses, waiting sends out ping rings and raises a hand, offline just dims. Press replay to watch them land.

Space
Idle
Working
Error
Waiting
Offline
agent-drop-in, 1s: falls 100px, scales 0.92 to 1, blur 6px to 0
Idle#165dfc, stripes on hover only
Working#f59e0b, shimmer sweep 4s, faces offset by 0.5s and 1s
Error#ef4444, red overlay pulsing 0.15 to 0.5 alpha, 0.8s
Waiting for a human#06b6d4, two ping rings 2s apart by 0.6s, cyan hand 18px above
Offlinemuted gray at 0.45 opacity, no glow
Liftselected or hovered rises 6px in 200ms, dragged rises 12px and scales 1.05

Links

Two kinds of wire, routed as right angles along the isometric axes so the board reads like a circuit. A beam is one agent calling another. A cable is an agent talking to an outside tool.

Beamsheath at 0.12 white width 3, a blurred glow in the space color width 2, and a dashed current
Beam currentdash 6 16, stroke-dashoffset animated over 1.2s, endlessly
Cablea single hairline at 0.18 white, corners rounded at 5px
Cometa 2.5px green streak riding the path, from transparent to #4ade80 at the head
Comet traillength is 16% of the cable, clamped between 8 and 26px
Comet timingtravel 1.7 to 3.2s, rest 0.5 to 2.5s, both derived from the link id

Toasts

What an agent says while it works. A small pill floats above the block, its text scrambling into place like a decrypt, a light sweeps across it, then it leaves upward.

Position38px above the tile
In280ms on the house curve, from y +6 and scale 0.92
Hold3.5s
Out400ms ease-in, to y -5 and scale 0.96
Decrypt520ms, characters resolving left to right out of !<>-_/[]{}=+*#%&@$
Shimmera 110 degree sweep across the pill, 2.4s
Successtext rgb(52,211,153) on rgba(6,78,59,0.82)
Questiontext rgb(34,211,238) on rgba(8,51,68,0.82)
Infotext rgb(161,161,170) on rgba(24,24,27,0.82)
Typemono, 8px, tabular numbers, white at 95%

A full board

Three agents, each wired to the tools it uses. This is the shape the product takes once someone has actually built something.

Rules

The short version. Everything above is detail, this is what breaks the brand when it is ignored.

Do

  • Let things settle. Motion decelerates into place and stops.
  • Give every repeating element its own tempo and offset.
  • Keep one saturated color on screen at a time.
  • Separate surfaces with a hairline and a change of value.
  • Set headings at weight 500, with tight tracking on display sizes.
  • Treat light and dark as equals. Both are shipped, both are used.
  • Write copy in English, sentence case, no exclamation marks.
  • Use the real product board. It is the strongest asset the brand has.

Do not

  • No zoom or scale on hover, on an image or on a card. Feedback is color, border or opacity.
  • No em dashes anywhere in copy.
  • No easing that overshoots and comes back.
  • No drop shadow used as decoration. Depth comes from the relief tokens.
  • No large surface filled with the brand violet.
  • No recoloring a third party logo by hand. Keep official colors; use auto-white only for dark monochrome marks on dark surfaces.
  • No perspective on the isometric board. It is a flat 2:1 projection.

Your first agent is
three minutes away

Start for free
Rerun

Run your work on agents. Build them, watch them work, and keep your eyes on everything.

Rerun - Build, monitor and share self-improving autonomous agents | Product Hunt

© 2026 Rerun. All rights reserved.