Design system
Roost design system
Every token and component the site is built from. Components on this page are rendered with the same live data as the real pages, so this is what ships.
Rules
- Pages only compose macros from
templates/partials/ui.html. A new visual element becomes a macro first, then appears here. - Colours come from theme tokens. No hex values and no Tailwind palette colours in templates.
- Type sizes come from the scale (
text-2xstotext-5xl), radii fromrounded-sm,-md,-xland-full. - No inline styles, except
view-transition-namefor the bird that flies between pages. - In Roost's own UI, blue means Bowerbird and nothing else. Provider logos keep their brand colours on a light tile.
- Numbers: tabular figures, right-aligned, always with a source footnote. Unknown is written out with its reason, never left blank.
- Personality lives around the data (birds, branches, microcopy), never in labels, headings or numbers.
- Data first: a page leads with numbers (stats, the wire, tables). Copy is one short line per section at most; method details go in a
method_notewith a link, not in paragraphs. tests/design.rsfails the build when a template breaks rules 2–4.
Colour
Tokens from styles/app.css. Each swatch shows light | dark; the page itself follows your system theme.
Surfaces
-
--paper
#f4eddc · #141529
-
--surface
#fbf7ec · #1b1d38
-
--sunk
#ece3cc · #10111f
-
--tile
#ffffff · #f3eee2
-
--tile-dark
#221d16
Ink
-
--ink
#221d16 · #eee6d4
-
--muted
#6c6252 · #a6a1b8
-
--rule
#d6c9ab · #34365a
Accents
-
--moss
#46603a · #a3c58f
-
--amber
#b5701a · #f2a950
-
--warn
#9a3b1f · #f08a6a
Bowerbird (reserved)
-
--bower
#2456d6 · #7fa3ff
-
--bower-deep
#173a99 · #2f4cb0
-
--bower-soft
#dfe7fb · #1e2853
-
--bower-eye
#8b5cf6
Sky
-
--sky-top
#f4eddc · #0f1024
-
--sky-glow
#f0d9a8 · #3a2a3f
Plumage
-
--bird-0
#c8862a · #dda04a
-
--bird-1
#b5583a · #d07556
-
--bird-2
#6f8f4e · #8fb06c
-
--bird-3
#8c8172 · #a89d8e
-
--bird-4
#8a5a7a · #b27ea1
-
--bird-5
#d9c39a · #e2d0aa
-
--bird-6
#5f9a7d · #7cb89a
-
--bird-7
#8b5a3c · #b07a55
-
--bird-8
#d4a62a · #e4bb4a
-
--bird-9
#8a8b3a · #aaab55
-
--bird-10
#d9785b · #e8957a
-
--bird-11
#b9a48a · #cdb99e
-
--breast
#f3dfb4 · #f7e7c4
-
--eye
#1b1712
-
--glint
#ffffff
Type
Fraunces for display, the system sans for text, tabular figures everywhere.
text-2xs
0.66rem · Plate labels, table headers
One 5-minute job costs $0.03
text-xs
0.72rem · Badges, captions, sublines
One 5-minute job costs $0.03
text-sm
0.8125rem · Secondary text, facts, sources
One 5-minute job costs $0.03
text-base
0.9375rem · Body text and table numbers
One 5-minute job costs $0.03
text-lg
1.0625rem · Lead text, card titles
One 5-minute job costs $0.03
text-xl
1.25rem · Section titles
One 5-minute job costs $0.03
text-2xl
1.5rem · Stats
One 5-minute job costs $0.03
text-3xl
1.9rem · Page titles (mobile)
One 5-minute job costs $0.03
text-4xl
2.3rem · Page titles
One 5-minute job costs $0.03
text-5xl
2.8rem · Home hero
One 5-minute job costs $0.03
plate
Small caps label
Plate 1 · CI runners
Shape
Radius tokens. Pills are rounded-full; inline marks rounded-sm; swatches rounded-md; every frame (cards, tables, figures) rounded-xl.
- rounded-sm
- rounded-md
- rounded-xl
- rounded-full
Spacing follows Tailwind's 4 px steps. Inside components: 1–3. Between blocks: 4. Between sections: 8–12. Page header: pt-8 pb-4.
Brand
logo
partials/logo.html · header, footer
icons
favicon.svg (follows theme), favicon.ico, apple-touch-icon, manifest icons
og.png
Social share image, 1200×630
birds
Generated per provider (src/birds.rs): plumage, wing, crest, tail and beak follow from the slug. Personality, and the fallback mark when Roost has no logo for a provider.
- kestrel
- wren
- heron
- finch
- robin
- starling
- magpie
- swift
- bowerbird (reserved)
branch
Section divider
Icons
24 px line icons in partials/icons.html, stroke 1.8, drawn in currentColor. ui.icon(name, class).
- cpu
- clock
- calendar
- wallet
- hourglass
- layers
- pulse
- archive
- alert
- external
- arrow
- download
- doc
- braces
- table
- check
- question
- key
- coin
- minus
- scale
Badges
badge(label, tone, icon)
The primitive: neutral, caveat, warn, bower, muted
caveat(c)
One per BWB-484 term; the icon follows the key, the tooltip carries the detail
caveat_list(list)
Caveats with their full explanation (provider pages: What to know)
- $150/mo planThis price only applies on a plan of at least $150 a month.
unpublished(notes)
A cost built on unknown terms (shown with ≥)
status_badge(p) · bower_badge() · provider_badges(p)
Status only shows when not active; Bowerbird's badge is blue
mark(m)
Yes / no / unknown in comparison tables; unknown carries its reason as a tooltip
fn(n)
Footnote marker, links to the sources list
Layout
page_header(plate, title, intro)
size: page | hero
Plate 1 · CI runners
CI runner prices: Linux x64, 2 vCPU
Across 15 providers, one 5-minute job on a Linux x64, 2 vCPU runner costs between ≥ $0.0015 (boat) and ≥ $0.05 (GitLab.com), with prices checked 31 Oct 2026.
section_title(id, title, sub, action)
Price board
Every ranking on Roost.
arrow_link(href, text)
pill_nav(items, label)
shape_nav(groups)
Ranking shapes, one row per platform
stats(items, fill)
label, value, optional sub and link; fill stretches cells (provider glance)
- Providers
- 23
- Lowest price
- $0.006 /min
- ubuntu-latest
- Checked
- 31 Oct 2026
method_note(text, href, link)
One muted line under a table: how the numbers were made, plus a link
Cost = price per minute × (run time + billed setup), rounded up to the billing increment. Method
card() · callout(title)
callout is for rare asides; data pages use method_note
Card
A bordered surface for grouped content.
provider_mark(p, size)
The provider's own logo on a light tile (sm, lg); its bird when there's no logo
provider_cell(p, vt, sub)
Mark + name + subline, links to the provider
provider_tile(p, vt, show_summary)
empty(text)
No birds here yet.
Data
wire(svg, caption)
Dot plot from $0; one logo per provider; stacked when labels would collide
ci_table(rows, minutes, caption)
Live rows from /ci-runners/
| Provider and size | 5-min job | Caveats |
|---|---|---|
|
|
≥ $0.0015 |
$20/mo plan
Not published: setup, minimum
|
Celestocelesto-standard
$0.03 /h[2] · 4 GB RAM
Setup billed
Prepaid
Max job 2 h
Max 10 jobs
Not published: setup, rounding, minimum
|
≥ $0.0025 |
Setup billed
Prepaid
Max job 2 h
Max 10 jobs
Not published: setup, rounding, minimum
|
Celestocelesto-memory
$0.04 /h[2] · 8 GB RAM
Setup billed
Prepaid
Max job 2 h
Max 10 jobs
Not published: setup, rounding, minimum
|
≥ $0.00333 |
Setup billed
Prepaid
Max job 2 h
Max 10 jobs
Not published: setup, rounding, minimum
|
|
$0.0012 /min[3] · 8 GB RAM
Prepaid
|
$0.006 |
Prepaid
|
Ubicloudubicloud-standard-2
$0.00125 /min[4] · 8 GB RAM
Not published: setup, minimum
|
≥ $0.00625 |
Not published: setup, minimum
|
Ubicloudubicloud-standard-2 (premium runners enabled)
$0.002 /min[4] · 8 GB RAM
Not published: setup, minimum
|
≥ $0.01 |
Not published: setup, minimum
|
|
$0.0024 /min[3] · 8 GB RAM
Prepaid
|
$0.012 |
Prepaid
|
|
|
$0.0125 |
$5/mo plan
Max job 4 h
|
|
$0.003 /min[6] · 4 GB RAM
Max job 3 h
|
$0.015 |
Max job 3 h
|
|
$0.004 /min[7] · 8 GB RAM
Not published: setup, rounding, minimum
|
≥ $0.02 |
Not published: setup, rounding, minimum
|
|
$0.004 /min[8] · 6 GB RAM
Not published: minimum
|
≥ $0.02 |
Not published: minimum
|
Tenkitenki-standard-small-2c-4g
|
$0.02 |
Prepaid
Max 5 jobs
|
WarpBuildwarp-ubuntu-latest-x64-2x
$0.004 /min[10] · 8 GB RAM
|
$0.02 |
None on record
|
|
$0.006 /min[11] · 8 GB RAM
$20/mo plan
|
$0.03 |
$20/mo plan
|
|
$0.006 /min[12] · 8 GB RAM
|
$0.03 |
None on record
|
|
$0.006 /min[12] · 8 GB RAM
Team plan
|
$0.03 |
Team plan
|
|
$0.006 /min[6] · 8 GB RAM
Max job 3 h
|
$0.03 |
Max job 3 h
|
|
$0.006 /min[13] · 8 GB RAM
Not published: setup, rounding, minimum
|
≥ $0.03 |
Not published: setup, rounding, minimum
|
BuildkiteLINUX_AMD64_2X4 (Small)
$0.008 /min[14] · 4 GB RAM
$30/mo plan
|
$0.04 |
$30/mo plan
|
GitLab.comsaas-linux-small-amd64
|
≥ $0.05 |
Prepaid
Max job 3 h
Not published: rounding, minimum
|
table(caption)
The frame every table uses; .num right-aligns tabular figures
hero(plate, title, intro)
Home only; caller() fills the aside
A field guide to build compute
Honest, dated prices.
Every number links to its source.
facts(list) · fact(f)
Key/value rows flowing into columns; unknown says why
fact_groups(groups)
Terms in titled groups, as in the provider page sidebar
notes(list)
- Plain, sourced remarks that don't fit a field yet.
- Shown under the table they belong to.
sources(list)
Numbered, deduplicated per page
Sources
- 1 actuated.com/pricing · 31 Oct 2026
- 2 docs.actuated.com/faq · 31 Oct 2026
- 3 actuated.com/blog/autoenrollment-caching-custom-billing-fractional-cpu · 31 Oct 2026