# Astro: brand book and build spec

A dark-first web framework brand: a rocket-flame 'A' and a wide, heavy lowercase wordmark; a navy-black night sky lit by four two-stop 'gem' gradients; Obviously for display, Inter Light for reading, MDIO for code; pill buttons; Houston, a square, whimsical mascot reserved for Astro's own use; and plain developer copy with sourced numbers.

From unfairly.ai/brand-guidelines/astro, checked 2026-10-31. Unofficial study; not affiliated with Astro.

Every value is labelled with where it came from: **published** (the brand says it), **observed** (measured or seen on its live site, with the date), **our reading** (inferred from the evidence) or **our recipe** (how we apply the system). Files beside this one: tokens.css, tokens.json (DTCG 2025.10), kit.json.

**Thesis (our reading):** The early web, launched into space. Astro wraps a plain-HTML idealism in a night-sky look: dark grounds, gem gradients that glow like nebulae, and a rocket in the logo, so a framework about shipping less feels like a mission rather than a tool. Based on: From the rebrand: the brand is rooted in early-internet idealism, set out not to look like every other devtool, and chose a dark-mode site with a unique palette; the rocket mark, Houston, Ready For Takeoff and the space glows carry the metaphor.

## Purpose

Mission: Empower the web development community to build a better web (paraphrase; core phrase quoted from the post). (published; https://astro.build/blog/welcome-world/)

Story: Astro started about three years before 2023 with a one-page manifesto and a hidden console.log easter egg that led to a secret early-access Discord. In 2023, after three months of community interviews with Streiloff & Co, it refreshed the logo, chose Obviously and MDIO, paired a dark-mode site with its own palette and illustration, and promoted Houston, a CLI 'blob' by Nate Moore, to mascot. (published)

| Value | What it means in the work | Source |
|---|---|---|
| Early-web idealism | Being a web developer as a superpower: create and share instantly, worldwide (paraphrase). | published: https://astro.build/blog/welcome-world/ |
| Performance | Make every Astro site, and the whole web, faster (paraphrase). | published: https://astro.build/press/ |
| Together | Community-built, open source, sponsor-funded; 'build the web we want, together'. | published: https://astro.build/press/ |

## Fixed and flexible

Never changes:
- The 2023 logo, unmodified and in its own colors
- Dark night-sky grounds
- The four gem gradients, used whole
- Obviously for display, Inter for text, MDIO for code
- Houston is Astro's own, never in others' materials

The one thing that varies: How much glow: from a plain #0D0F14 page with white Obviously titles (press page, blog) to a violet-bloom hero with stardust and gem icons (homepage). Nothing published sets the level.

## Positioning

- **Statement**: The web framework for content-driven websites. (observed)
- **Category**: JavaScript web framework (homepage); web framework for content-rich sites (press). (published)
- **Audience**: Developers and teams building content-rich sites where performance matters: marketing sites, blogs, e-commerce, docs, portfolios (paraphrase). (published)
- **Problem**: Most frameworks are designed for web apps and ship JavaScript content sites don't need (paraphrase). (published)
- **Promise**: Faster sites: lightweight server-rendered HTML with zero unnecessary JavaScript, content from anywhere, deploy everywhere (paraphrase). (published)
- **Differentiators**: Astro Islands: page-load performance the homepage says no other framework matches.; Zero JavaScript by default; server-first rendering.; Zero lock-in: bring React, Vue, Svelte, Preact, Solid and more.; Content from any source (files, API, CMS) and deployment adapters for major hosts.; MIT-licensed open source with a community and partner agencies.
- **Alternatives**: WordPress, Gatsby, Next.js and Nuxt: the comparison set in the homepage Core Web Vitals chart.; Frameworks designed for web apps (press page framing).

## Messaging

Boilerplate (published): Astro is a web framework that takes the best of the early internet, plain HTML and CSS, and runs it on a next-generation architecture so every Astro site, and the web as a whole, gets faster. Where most frameworks target web apps, Astro is built for content-rich sites where performance matters most: content can come from anywhere and deploy everywhere.

Taglines:
- The web framework for content-driven websites (Homepage H1)
- Build the web you want. (Homepage social image alt text (og image))
- let's build the web we want, together (Closing line of the press page's This is Astro paragraph)

| Pillar | Claim | Proof | Label |
|---|---|---|---|
| Server-First | Render components on the server and send lightweight HTML, with no unnecessary JavaScript. | 71% of real-world Astro sites have good Core Web Vitals, vs WordPress 48%, Gatsby 45%, Next.js 35%, Nuxt 28% (HTTP Archive and Chrome UX Report, as shown on the homepage). | observed |
| Content-Driven | Built to work with your content wherever it lives: files, an API or a CMS. | Logo wall 'used by the largest companies': Google, Unilever, Visa, Microsoft, Porsche, OpenAI, Netlify, NordVPN, Cloudflare, NBC News, The Guardian, Michelin, Proton, Webflow. | observed |
| Customizable | Bring your own UI components, CSS, themes and integrations; zero lock-in. | Supports React, Vue, Svelte, Preact, Solid (homepage tabs), plus Angular and Qwik in UI Integrations. | observed |

They never claim:
- Use only Astro's own published numbers, with their dataset named (the CWV chart).
- Third parties may use the logo to link to Astro, show built-in Astro support, or in posts and videos about Astro; not as their own icon or inside their logo.
- Don't sell products featuring the Astro logo without permission.
- Houston must not be used in your own materials.

## Voice

Tone words: Whimsical, Approachable, Friendly.

Traits:
- Whimsical, but not Childish (published)
- Approachable, but not Generic (published)
- Friendly, but not Salesy (published)
- Idealistic, but not Retro (published)
- Fast, but not Boastful (our reading)

- The rebrand gives Houston, and through him Astro, three words: whimsical, approachable, friendly.
- Idealism of the early web: building for the web is framed as a shared, almost heroic craft ('let's build the web we want, together').
- Plain developer English on the homepage: say what it does (server-first, content-driven, zero JavaScript by default), then show a command to run.
- Numbers are always sourced on the page itself (the Core Web Vitals chart cites HTTP Archive and the Chrome UX Report).
- Space puns are part of the voice (Ready For Takeoff, See You Out There, Astronaut; the Houston mascot), used in headings, not in product claims.
- No written voice guideline is published; everything beyond the three Houston traits is observed.

Rules a copy check enforces:
- Whimsical, approachable and friendly: Houston's personality, chosen to reflect Astro itself
- Sentence case headlines
- Section titles, eyebrows and feature names in Title Case (Zero Lock-in, Fully Featured, Best-In-Class Performance)
- Every performance number carries its dataset and a link to it
- Pair the main CTA with the literal install command, npm create astro@latest
- Lowercase 'astro' in the wordmark only; the name is 'Astro' in copy

Their words: content-driven, server-first, islands, fast.

## Color

| Name | Hex | Role | Use |
|---|---|---|---|
| astro-dark-900 | #060913 | paper | Homepage ground; the night sky |
| black | #0D0F14 | night | Press and blog ground, nav backing |
| astro-dark-800 | #0C0F19 | surface | Panels and cards |
| astro-gray-600 | #23262D | surface | Panel and input fill (.panel) |
| astro-gray-100 | #F2F6FA | ink | Headings and primary text on dark |
| astro-gray-200 | #BFC1C9 | ink_muted | Body copy, nav, descriptions |
| white | #FFFFFF | on_accent | Logo on dark, primary pill fill |
| astro-blue | #3245FF | accent | Blue-purple gradient start |
| astro-purple | #BC52EE | extra | Purple gem shade |
| astro-pink | #F041FF | accent_secondary | Red-pink gradient end; eyebrows; gradient flame |
| astro-red | #D83333 | extra | Red-pink gradient start |
| astro-green | #4AF2C8 | extra | Blue-green gradient start |
| yellow (token astro-orange) | #F8E42E | extra | Orange-yellow gradient start; token name says orange |
| orange (token astro-yellow) | #FF7D54 | extra | Orange-yellow gradient end; token name says yellow |
| astro-pink-light | #E8C4F9 | extra | Focus ring, hover tint |
| astro-gray-700 | #17191E | extra | Ink of the logo-on-light file; press asset tiles |

## Typography

| Role | Their face | Licence | Open stand-in (Google Fonts) | Fallback |
|---|---|---|---|---|
| display | Obviously | Proprietary (OH no Type Company); licensed by Astro, not supplied | Hubot Sans | "Hubot Sans", Archivo, Verdana, system-ui, sans-serif |
| body | Inter | Open (SIL OFL 1.1); variable woff2 in the fonts folder | Inter | Inter, Arial, system-ui, sans-serif |
| mono | MDIO | Proprietary (Mass-Driver); not supplied | IBM Plex Mono | ui-monospace, SFMono-Regular, Menlo, "IBM Plex Mono", monospace |

| Role | Token | Face | Desktop | Phone | Line height | Tracking | Weight |
|---|---|---|---|---|---|---|---|
| Hero H1 | --text-display-xl-* | Obviously (stand-in Hubot Sans wdth 120 wght 750) | 48px | 30px | 1.1 | 0px | 700 |
| Final CTA H2 | --text-display-l-* | Obviously (stand-in Hubot Sans wdth 120 wght 750) | 36px | 20px | 1.111 | 0px | 700 |
| Intro statement | --text-statement-* | Obviously light wide (stand-in Archivo wdth 125 wght 350, letter-spacing 0.015em; bold word Hubot Sans 120/700) | 36px | 24px | 1.111 | 0px | 290 |
| Section title | --text-display-m-* | Obviously (stand-in Hubot Sans wdth 120 wght 750) | 30px | 24px | 1.2 | 0px | 700 |
| Chart label | --text-title-s-* | Obviously (stand-in Hubot Sans wdth 115 wght 700, not the heading 120/750) | 20px | 20px | 1.4 | 0px | 700 |
| Lead | --text-lead-* | Inter | 18px | 18px | 1.5 | 0px | 300 |
| Eyebrow | --text-eyebrow-* | system ui-sans-serif | 16px | 16px | 1.5 | 0px | 600 |
| Card / point title | --text-title-xs-* | system ui-sans-serif | 16px | 16px | 1.5 | 0px | 600 |
| Body / description | --text-body-* | system ui-sans-serif | 16px | 16px | 1.5 | 0px | 300 |
| Button / tab label | --text-button-* | system ui-sans-serif | 16px | 16px | 1.5 | 0px | 400 |
| Nav link | --text-nav-* | system ui-sans-serif | 16px | 20px | 1.5 | 0px | 300 |
| Chart score | --text-score-* | system ui-sans-serif | 30px | 24px | 1.2 | 0px | 600 |
| Footer heading | --text-footer-h-* | system ui-sans-serif | 16px | 16px | 1 | 0px | 600 |
| Small / pill | --text-small-* | system ui-sans-serif | 14px | 14px | 1.4286 | 0px | 300 |
| Install command | --text-code-* | ui-monospace (Menlo on macOS) | 14px | 14px | 1.4286 | 0px | 300 |
| Code sample | --text-code-s-* | ui-monospace | 13.6px | 13.6px | 1.65 | 0px | 400 |
| Mono label | --text-label-mono-* | MDIO (stand-in IBM Plex Mono 400) | 12px | 12px | 1.333 | 0.3px | 400 |
| Big zero | --text-numeral-* | system ui-sans-serif | 200px | 200px | 1 | 0px | 700 |

## Layout

Measured on https://astro.build/press/: Astro publishes no brand PDF. Logo law from the press page (astro.build/press/, read 2026-10-31); brand idea, faces and mascot from the 2023 rebrand post; tokens from the open-source site repo github.com/withastro/astro.build (sparse clone, main, read 2026-10-31); voice and proof from the homepage (observed 2026-10-31).

| Measure | Desktop (1440) | Phone (390) |
|---|---|---|
| Page margin | 112px | 16px |
| Section padding | 144px | 80px |
| Container max width | 1280px | full |
| Hero text width | max 704px | full |
| Grid columns | 3 | 1 |
| Gutter | 16px | 8px |
| Card gap | 16px | 16px |
| Navigation height | 80px | 80px |

Breakpoints from Astro's CSS: 640, 768, 1024, 1280, 1536px.

Homepage bands, top to bottom (observed):
1. Navigation
   - Desktop: 1440x80 at y 0, content x 112-1328, links centred 48px apart
   - Phone: 390x80: logo + hamburger
   - Not sticky
   - No CTA button in the bar
2. Hero
   - Desktop: y 80-844, centred 768px column, H1 48px
   - Phone: y 80-804, H1 30px in 3 lines, logo wall fades out via mask
   - Glow bleeds up under the nav
   - Logo wall is static
3. Intro
   - Desktop: y 988-1386, 3 columns 373px, 48px gap
   - Phone: y 884-1672, stacked
   - Gem gradients: blue-green, red-pink, orange-yellow
4. Astro Islands
   - Desktop: y 1530-2140, panel 1216x430
   - Phone: y 1752-2382, labels hidden
   - Astro bar blue-green gradient, others #343841
5. Zero Lock-in
   - Desktop: y 2284-3071, code 805x392 + window 395x462 raised 72px
   - Phone: y 2462-3534, window first then code
   - Active tab colour drives the Add to cart button
6. Fully Featured
   - Desktop: y 3215-4714, 395px columns, 16px gaps
   - Phone: y 3614-6883, one column, 8px gaps
   - Cards #0C0F19, 1px rgba(133,139,152,0.2), radius 16px
7. Themes
   - Desktop: y 4857-5617, tiles 392x249
   - Phone: y 6963-8365, tiles 348x221 stacked
   - Sixth tile is Browse more themes
8. Partner agencies
   - Desktop: y 5761-6116, tiles 237x124
   - Phone: y 8445-8919, 2x2 tiles 175x92
   - Tile order is random per build
9. Final CTA
   - Desktop: card 1216x706 at y 6260, padding 160px
   - Phone: card 358x386 at y 9000, H2 20px
   - Same buttons as the hero
10. Sponsors
   - Desktop: y 7110-8296
   - Phone: y 9466-11262, cells stack
   - Last cell is a red heart Sponsor Astro
11. Spacer
   - Desktop: 144px (y 8296-8440)
   - Phone: 80px
   - sm:h-36
12. Footer
   - Desktop: y 8440-8870 (430px), container 1376px
   - Phone: y 11342-12288, licence row last
   - Wider container than the body (1536 max)

## Page anatomy

How Astro's own landing pages are built, part by part (observed; https://astro.build/, 2026-10-31). A homepage pattern, not a brand law: follow it for landing pages.

**Navigation**
- summary: One 80px bar, not sticky (it scrolls away): monochrome astro logo at left, five centred text links (three open dropdowns), GitHub icon at right. Phone: logo left, 24px hamburger right.
- ground: rgba(13,15,20,0.3) (#0D0F14 at 30%, class bg-black/30) laid over the hero glow, which bleeds up under it, so the bar reads deep violet-navy at left and purple at right; box-shadow 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px -1px rgba(0,0,0,0.1). No border, no backdrop blur.
- height: 80px at both widths (repo h-header 5rem)
- border: none
- position: static (position: static; it is NOT fixed or sticky). The hero section starts at y 80 directly under it.
- container: nav max-width 1280px centred (x 80-1360) with 32px side padding, so content runs x 112-1328 (1216px) on desktop; 16px padding on phone (x 16-374)
- logo: variant monochrome wordmark+mark in #F2F6FA (nav-astro-logo.svg, 114x30); not the gradient logo; px 114x30; position x 112, y 25 desktop; x 16, y 25 phone
- links: count 5; labels Documentation,Blog,Resources,Community,Enterprise; hrefs https://docs.astro.build,/blog/,dropdown,dropdown,dropdown; size 16px/24px system ui-sans-serif 300; weight 300; color #BFC1C9; hover #FFFFFF (color transition 300ms ease-out); alignment a centred flex group x 438-1063, 48px gaps (Documentation x 438, Blog x 596, Resources x 676, Community x 820, Enterprise x 970), top y 28; dropdown marker 12x12 chevron (icon-chevron) after Resources, Community and Enterprise, 8px after the label, #BFC1C9; dropdowns Resources: Themes, Integrations, Site showcase, Playground, Tutorials; Community: Discord, Sponsors, Merch; Enterprise: Agencies (with a small "New" badge: 14px, background rgba(50,69,255,0.4)), Case studies. closed at rest (animation only on open): a vertical list under the label, each item 158x38, 15px line icon then label 16px/16px 400 #BFC1C9
- actions: GitHub mark only: 28x28 white #FFFFFF icon (nav-github-FFFFFF.svg) centred in a 52x52 hit area at x 1276, y 14. No buttons and no search in the bar.
- sticky: false
- phone: shows logo 114x30 at x 16, y 25; hamburger (three 1.5px lines, 24x24) at x 350, y 28 in #BFC1C9; menu full-width drawer under the bar on the dark #0D0F14 ground: rows Blog, Resources, Community, Enterprise at 20px/28px 300 #BFC1C9 with 24px padding and 1px #343841 dividers (the last three are accordions with a chevron at right); then a row of eight 48x48 white social icons (Bluesky, Discord, GitHub, LinkedIn, Mastodon, Reddit, X, YouTube); then a full-width "Read the docs" pill 342x56, blue-purple gradient fill (83.21deg #3245FF to #B845ED), white 16px 500 Inter label; cta none in the bar; only the drawer's Read the docs pill
- weight note: Nav links Documentation/Blog and the Resources/Community/Enterprise buttons are the system UI stack at 300 (SF Pro Light on macOS), 16px/24px, #BFC1C9; the GitHub icon is #FFFFFF 28px. Release pill 14px system 300; install command ui-monospace 14px (Menlo has no light, so it renders regular 400). Use the system stack, never Inter, for these; on the dark ground keep -webkit-font-smoothing auto (subpixel default), not antialiased, so the light strokes keep their density (observed 2026-10-31)

**Hero**
- summary: Centred, text-only hero on a blurred violet-to-indigo glow: a two-part release pill, a two-line 48px bold display headline, a two-line light Inter lead, a white Get Started pill stacked on a dark install-command block, then "Used by the largest companies around the world:" over a two-row wall of 14 white company logos. No product image.
- desktop: section y 80-844 (764px tall), full width; inner column max-width 768px (sm:max-w-screen-md) centred with 32px padding, margin-top 96px; column split single centred column; everything text-align center; vertical anchors release pill y 176-212 (219x36, x 611); H1 y 244-350 (2 lines of 52.8px); lead y 366-420 (2 lines of 27px); Get Started y 452-494; install block y 502-544; "Used by..." line y 640-664; logo row 1 y 688-744, row 2 y 776-812; section ends y 844; gaps 32px between pill, title block and button stack (lg:gap-8); H1 to lead 16px (mb-4); button to install block 8px (grid gap-2); 96px from install block bottom to the "Used by" line (mt-16 + 32px padding); text max width H1 704px box (x 368-1072; repo sm:max-w-[24ch] in Obviously; use 704px with the stand-in, not ch), text-wrap balance, breaks after "for": "The web framework for / content-driven websites" (lines 637px and 677px wide); lead 704px box, breaks after "marketing" (line 1 "Astro powers the world's fastest marketing", line 2 "sites, blogs, e-commerce websites, and more."); media none in the column: the only image is the blurred background glow (hero-background.webp); cta size Get Started 278x42 and the install block 278x42, both x 581-859 (a 278px grid column centred)
- phone: order release pill (left segment only), H1, lead, Get Started, install block, "Used by" line, logo wall; alignment centred, 16px gutters; sizes section y 80-804 (724px); pill 104x36 at x 143, y 144; H1 30px/33px in 3 lines ("The web framework / for content- / driven websites", the hyphen breaks), y 200-299, 358px wide; lead 18px/27px 3 lines y 315-396; Get Started 278x42 at x 56, y 416; install block 278x42 at y 466; "Used by the largest companies around the world:" y 556 (one line, 352px); logo wall from y 596; logo wall smaller logos (Google 74x24, Unilever 33x36, Visa 49x16, Microsoft 83x16, Porsche 120x8, OpenAI 74x24, Netlify 78x32, NordVPN 92x20, Cloudflare 119x24, NBC News 109x12, The Guardian 61x20, Michelin 123x24, Proton 63x16, Webflow 96x16) wrapping into 7 centred rows with 24px row gap and 32px column gap; the wall is capped at 256px tall and masked linear-gradient(to bottom, white 0, white 33%, transparent) over 16rem, so rows 5-7 fade out (The Guardian, Michelin, Proton are dim, Webflow invisible); -64px bottom margin
- at rest: ground page ground #060913; behind the hero an <img> hero-background.webp (256x214 source, quality 10) stretched to 2353x1969, object-fit cover, centred horizontally on the page (left -456px at 1440 wide), top at page y -684px at 1440 (that is 764px above the hero section, whose top is y 80, so it also lights the nav); at 390 its top is page y -644 (724px above the section) and left -981.5px, still centred, filter blur(16px), z-index -50. Sampled from the capture, it reads indigo #1A146A at top-left, violet #34157C at centre, saturated purple #6019A5 at right, fading to #140C32 at the section bottom (y 844); the nav bar over it samples #111140 at left. Place the file; do not redraw it with CSS gradients. Higher-resolution original: hero-background-source.png (same art).; animation none at rest. The logo wall is static (not a marquee).
- media: hero-background.webp (blurred glow) and the 14 logo-wall SVGs; no screenshot or illustration
- type: h1 Obviously 700, 48px/52.8px (line-height 1.1) desktop (36px at md, 30px/33px phone), tracking normal, #F2F6FA, centred, text-wrap balance; font-feature-settings calt, cv09, liga, salt, ss06, ss11. Stand-in: Hubot Sans wdth 120 wght 750 (see kit.typography.calibration); lead Inter 300, 18px (CSS asks 200, but the served Inter face spans 300-600, so it renders at 300; build 300, never 200)/27px, #BFC1C9, centred (the only Inter on the hero); pill 14px/20px system ui-sans-serif 300: left segment "Astro 7.4" in #FFFFFF, right segment "Available now!" in #F2F6FA; used by 16px/24px system ui-sans-serif 300, #F2F6FA, centred
- cta: Get Started: white #FFFFFF pill 278x42, border 1px transparent, padding 8px 16px, label 16px/24px 400 system font set as blue-purple gradient text (linear-gradient(83.21deg, #3245FF, #B845ED) clipped to text); links to https://docs.astro.build/. Under it, 8px gap: the install block, 278x42, background rgba(6,9,19,0.55), radius 12px, padding 8px 16px: a 12px chevron (rotated to point right) #BFC1C9, 8px gap, "npm create astro@latest" in ui-monospace 14px/20px 300 #BFC1C9 (renders Menlo on macOS; IBM Plex Mono 400 if you need a webfont), then a 20x20 copy icon #BFC1C9 at the right (x 819).
- release pill: Above the H1: a 36px-tall pill (radius 9999px) on rgba(6,9,19,0.55), two segments with no gap: left segment px 12px, background linear-gradient(to top right, #1321AC, #881ABD), radius 9999px, white "Astro 7.4"; right segment px 12px, "Available now!" then 8px gap then a 16px right arrow #F2F6FA. 219x36 desktop. Phone hides the right segment and shows the arrow inside the left segment (104x36). Links to the latest release blog post. The version text changes with releases; keep the two-segment structure.
- proof: Logo wall, desktop: 14 monochrome #F2F6FA logos in two centred rows inside a 1376px flex-wrap box (x 32-1408, padding 0 16px, gap 32px row / 40px column, align-items center). Row 1 (y 688-744): Google 111x36, Unilever 51x56, Visa 74x24, Microsoft 124x24, Porsche 210x14, OpenAI 111x36, Netlify 118x48, NordVPN 147x32. Row 2 (y 776-812): Cloudflare 178x36, NBC News 181x20, The Guardian 98x32, Michelin 185x36, Proton 94x24, Webflow 143x24. Heights are per logo (repo classes sm:h-9/h-14/h-6/h-3.5/h-12/h-8/h-5), width auto. Files: logo-wall-logos-*.svg (the -F2F6FA copies are already recoloured).

**Intro: What is Astro?**
- summary: Left-aligned statement in a light wide display face with the bold word "Astro", then three gem-icon points in a 3-column row.
- ground: #060913 (page ground); a faint violet bloom from the hero glow still tints the top-right corner
- desktop: band section y 988-1386 (398px), margin-top 144px (sm:mt-36) after the hero; container max-width 1280px, padding 32px, so content x 112-1328; eyebrow "What is Astro?" y 1023, 16px/24px 600 system font, red-pink gradient text (linear-gradient(66.77deg, #D83333, #F041FF) clipped), 110x18 box; h2 y 1048, max-width 1024px, 2 lines of 40px: "Astro is a JavaScript web framework optimized / for building fast, content-driven websites." Obviously 36px/40px, font-variation-settings wdth 490 wght 290 (light, wide) in #F2F6FA; the first word "Astro" is <strong> at wdth 490 wght 475 (bold). Line 1 is 968px wide. Stand-in: Archivo wdth 125 wght 350, letter-spacing 0.015em, with "Astro" at Hubot Sans wdth 120 wght 700; points 3 equal columns 373px wide at x 112, 533, 955 (48px gap, lg:grid-cols-3), top y 1160 (32px below the H2, space-y-8): gem icon 62x62, 12px gap, title y 1234, description y 1258
- phone: band y 884-1672, margin-top 80px, padding 16px; h2 24px/32px in 4 lines, 358px wide (y 928-1056); points one column, 32px apart: gem 52x52 (2px ring, 48px disc, 20px glyph), titles at y 1152, 1368, 1560
- anatomy:
  - Eyebrow sits 4px above the title (space-y-1); the eyebrow is the only gradient text in the block
  - Gem icon: outer circle 62px with 3px padding filled by the gem gradient (the ring); inner 56px disc #0D0F14 overlaid with a to-bottom-right tint of the same pair at low alpha; 28px white line glyph centred (gem-ri-*-FFFFFF.svg). Server-First = blue-green (247.23deg #4AF2C8 to #2F4CB3; tint #3245FF 25% to #4AF2C8 25%), Content-Driven = red-pink (66.77deg #D83333 to #F041FF; tint 20%), Customizable = orange-yellow (266.93deg #F8E42E to #FF7D54; tint 15%)
  - Point title 16px/24px 600 #FFFFFF ("Server-First", "Content-Driven", "Customizable"); description directly under it 16px/24px 300 #BFC1C9, text-wrap balance, 3-4 lines in 373px
- components:
  - eyebrow
  - gem_icon

**Astro Islands: Core Web Vitals bar chart**
- summary: Section copy (eyebrow, white title, half-width description) over a dark rounded panel holding a five-row horizontal bar chart: Astro's bar in the blue-green gradient with a glowing mint score, four competitors in flat grey; a sourced footnote under it.
- ground: #060913 with ONE compact teal haze behind the chart panel (GreenishStardust.astro): two full-width rounded-full blocks of base height 384px at lg+ (320 md, 224 below), placed in normal flow just above the panel and pulled behind it (-z), rotate(-7deg); block 1 scaleX 1.5 scaleY 2.5 at opacity 0.75, block 2 scaleX 2.5 scaleY 4.2 at opacity 0.5; both filled linear-gradient(270deg, rgba(64,222,191,0.3), rgba(51,75,169,0.3)) and masked by the brand radial mask (layout.radial_mask: alpha 0.8 at centre, 0.36 at 31.5%, 0 at 60%). The two blocks overlap into a single soft haze centred on the panel; at 30% colour x 0.8 mask x 0.75 the brightest point is a dim teal-blue, the section copy above stays on near-black, and no haze reaches the neighbouring sections. Never render it as two distinct glows or as a band of light across the section
- desktop: band section y 1530-2140, margin-top 144px; container 1280px with 32px padding (content x 112-1328); copy eyebrow "Best-In-Class Performance" y 1533; H2 "Astro Islands" y 1558 (Obviously 30px/36px, the <strong> renders 700, #FFFFFF); description y 1606, width 608px (lg:w-2/3 xl:w-1/2), 3 lines of 16px/24px 300 #BFC1C9; panel y 1710-2140, x 112-1328 (1216x430), background #0C0F19, 1px solid rgba(133,139,152,0.2) border, radius 16px, padding 32px; margin-top 32px under the description; chart caption "% of real-world sites with good Core Web Vitals" at y 1743, 16px/24px 400 #858B98; rows start y 1799 and repeat every 56px (row tops 1799, 1855, 1911, 1967, 2023); each row: label column x 145, 144px wide, right-aligned, Obviously 20px/28px 700 #F2F6FA (stand-in Hubot Sans wdth 115 wght 700); 16px gap; track x 305-1295 (990x40), radius 8px, outline 1px offset 4px (Astro #545864, others #343841); fill bar from the track's left edge, height 40px, radius 8px, width = score % of the track (Astro 71% = 703px, WordPress 48% = 475px, Gatsby 45% = 446px, Next.js 35% = 347px, Nuxt 28% = 277px); fill colour Astro = blue-green gradient (247.23deg #4AF2C8 to #2F4CB3, so mint at the right end), others #343841; inside the fill at 8px from its left, the framework logo 19-24px #F2F6FA; 8px after the fill, the score: Astro "71%" 30px/36px 600 #4AF2C8, others 20px/28px 600 #858B98; footnote y 2086, 20px below the last row: "View the full dataset · Based on real-world performance data from HTTP Archive and the Chrome UX Report." 16px/24px #858B98; the three links #F2F6FA, underline offset 2px, decoration #858B98 (hover white)
- phone: band y 1752-2382, padding 0 16px; copy H2 24px/32px; description 4 lines; panel y 1952, 358x430, radius 12px, padding 16px; chart labels hidden (lg:block only), so each row is just the track: 324px wide, 32px tall, rows every 48px from y 2049; outline offset 2px; Astro score 24px/32px, others 18px/28px
- anatomy:
  - Section copy pattern used by every section from here on: eyebrow (gradient text) 4px above a white Title Case Obviously title, 12px to a half-width description, then 16px to an optional secondary pill CTA
  - The panel is the proof: real numbers with the source named and linked under them, never a number without its dataset
  - Only the Astro row is coloured; competitor rows are flat #343841 with grey scores
- components:
  - eyebrow
  - panel
  - bar_chart_row

**Zero Lock-in: framework tabs, code and cap**
- summary: Section copy with a secondary pill CTA, a row of five round framework tabs (React active), a full-bleed hairline, then a two-panel stage: a syntax-highlighted Astro code card (2 columns wide) and a fake browser window showing a product card with the Astro cap and an Add to cart button.
- ground: #060913
- desktop: band section y 2284-3071 (full width; inner blocks in the 1280 container); copy eyebrow "Maximum Flexibility" y 2287; H2 "Zero Lock-in" y 2312; description y 2360 (2 lines); secondary button "Integrate your favorite framework" 275x42 at y 2424; tabs row at y 2502, x from 112, 24px gaps (96px pitch): each tab 72x108 = a 72px circle (4px ring, 64px #0D0F14 disc, 32px logo) and a 16px/24px 500 label 12px below (y 2586). Order: React, Vue, Preact, Svelte, Solid; rule 1px #23262D line across the full 1440px at y 2646 (32px under the tabs); stage grid of 3 columns (394.7px each, 16px gap) starting y 2679: code card spans 2 columns (x 112-917, 805x392); browser window in column 3 (x 933-1328, 395x462) pulled up 72px (lg:-mt-[4.5rem]) to y 2607 so it overlaps the rule and rises beside the tabs
- phone: band copy y 2462-2664; tabs y 2684 (52px circles, 2px ring, 48px disc, labels 16px, 68px pitch, horizontally scrollable row); rule y 2792; stage one column, 12px gap; the browser window comes FIRST (order-first): 358x385 at y 2809 with the cap 197x160; then the code card 358x328 at y 3206, code clipped on the right (horizontal scroll)
- anatomy:
  - Tab states: active (React) ring #61DAFB, disc tinted #61DAFB at 20%, logo in colour, label #61DAFB; inactive rings #858B98, logos grayscale, labels #858B98; hover ring #BFC1C9. Active colours per framework: React #61DAFB, Vue #41B883, Preact #673AB8, Svelte #FF3E00, Solid #76B3E1
  - Code card: outer frame #07040F, padding 4px, radius 20px; inside it a <pre> 797x384 on #17191E with a 1px rgba(133,139,152,0.2) border and radius 16px; code 13.6px/22.44px ui-monospace, padding about 24px; lines 2 and 12 highlighted (line 2 = the BuyButton import, line 12 = the <BuyButton ... client:load /> line; counting the frontmatter fence as line 1) with full-width rgba(38,74,137,0.5) bars (#264A89) and a 2px left marker. Syntax colours: frontmatter fences --- #8B909D, keywords (import, from, const, await) #54B9FF, identifiers #4BF3C8, strings #FFD493, punctuation #EEF0F9, components/variables #ACAFFF, function call #00DAEF. The code (verbatim, it is product UI): ---, import BuyButton from '../components/BuyButton.jsx';, import { getProductDetails } from "ecommerce-package";, import ProductPageLayout from '../layouts/ProductPageLayout.astro';, blank, const product = await getProductDetails(Astro.params.slug);, ---, blank, <ProductPageLayout>, <img src={product.imageUrl} alt={product.imageAlt} />, <h2>{product.name}</h2>, <BuyButton id={product.id} client:load />, </ProductPageLayout>
  - Browser window: #07040F fill, 1px #23262D border, radius 16px; top bar 39px tall with a 1px #23262D bottom border and three 12px #23262D dots (12px from the left, 8px apart); body 421px tall, overflow hidden, content bottom-aligned: a device frame 262px wide (x 1000-1262, from y 2719 to the bottom edge, cut off) #23262D with radius 24px 24px 0 0 and 12px padding; inside it a #17191E screen (238px wide, radius 16px 16px 0 0, padding 16px) holding the cap image (zero-lockin-astro-cap.webp, 206x224, radius 12px, object-fit contain), then a row "Snapback Cap" left and "$25.00" right (16px/24px 500 #858B98), then an "Add to cart" button 206x40, #61DAFB fill, #030712 text 16px 400, radius 8px (the button colour follows the active tab)
  - The hairline is full-bleed while everything else stays in the 1216px column
- components:
  - eyebrow
  - button_secondary
  - framework_tab
  - code_card
  - browser_window

**Fully Featured: feature card grid**
- summary: Section copy, then a dense 3-column grid of 14 dark rounded cards: five carry small product illustrations (docs being scanned, a giant 0, view-transition tiles, image placeholders, a 3D file tree, a component grid), two carry logo rows, six are text only.
- ground: #060913
- desktop: band section y 3215-4714 (container 1280, content x 112-1328); copy eyebrow "Everything you need" y 3218; H2 "Fully Featured" y 3243; description y 3291 (2 lines); grid 3 columns 395px with 16px gaps (x 112, 523, 933), grid-auto-flow dense, starting y 3371 (32px below the description). Placement (x, y, w x h): Content Collections 112,3371 395x378 (tall, art on top); Zero JavaScript, By Default 523,3371 395x378 (art on top); View Transitions 933,3371 395x378 (art on top); Optimized Images 112,3765 805x203 (wide, 2 inner columns: text left, art right); UI Integrations 933,3765 395x203 (text then logo row); File-Based Routing 112,3984 395x370 (tall, text then art); Middleware 523,3984 395x157; Actions 933,3984 395x157; Deployment Adapters 523,4157 395x197 (text then logo row); Simple Templating 933,4157 395x386 (tall, text then art); Instant Page Loads 112,4370 395x173; AI-Ready 523,4370 395x173; Environment Variables 112,4559 395x154; Dev Toolbar 523,4559 395x154. Rows are content-height; the third column ends at y 4543 and the grid ends y 4713; card background #0C0F19, 1px solid rgba(133,139,152,0.2) border, radius 16px, overflow hidden; text block padding 24px with 8px between title and description; title 16px/24px 600 #FFFFFF (the title is the card link, stretched over the whole card); description 16px/24px 300 #BFC1C9, text-wrap pretty
- phone: band y 3614-6883, padding 0 16px; grid one column 358px, 8px gaps (gap-2), cards in the same order; text padding 16px, radius 12px; descriptions 14px/20px 300; art keeps its size (Content Collections 314px tall, Zero JS 334, View Transitions 314, Optimized Images 334 with art first, UI Integrations 155)
- anatomy:
  - Content Collections art (top, min-height 208px, padding-top 24px at lg): the art row is split into two halves of the 395px card (about 197px each), both overflow hidden. LEFT half (transparent): a row of 64x80 unscanned docs (#6B7AAB/#2F3854 page with three #6B7AAB 4px text bars) with 32px gaps, anchored right: 4px; each doc has an 18px #D83333 circle with a white 14px x at bottom -6px right -8px. At rest (paused marquee, translateX(0)) exactly TWO full docs are visible: doc A at x 129-193 and doc B at x 33-97 of the left half, vertically centred; the next doc ends at x 1, so only a sliver of its red badge peeks at the left edge. RIGHT half: ground #0C0F19, a 1px scanner line on its left edge, and beside it a 48px-wide blurred glow (blur 24px, height 2/3 of the art, linear-gradient(42deg, rgba(50,69,255,0.3), rgba(188,82,238,0.3))) that reads as a restrained violet light; the scanned docs start at left -952px, so at rest the right half shows NO docs, only the dark ground and the glow. Animation only: a 50s linear marquee
  - Zero JavaScript art (top, 208px), RESTING STATE: the big "0" dominates and reads as a smooth dark charcoal numeral: system font 700, 200px/200px, text filled with linear-gradient(to bottom, #545864, rgba(35,38,45,0.5)) via background-clip:text, the whole numeral at opacity 0.7, a 2px rgba(255,255,255,0.06) text stroke and drop-shadow(0 10px 8px rgba(0,0,0,0.04)) drop-shadow(0 4px 3px rgba(0,0,0,0.1)). Behind it a dot field that is barely visible: dots are 1px (radial-gradient(#fff 0.5px, transparent 0.5px) as a mask, mask-size 5px 5px) filled with the blue-purple gradient, the whole layer at opacity 0.3 AND masked by radial-gradient(closest-side, #fff 40%, transparent 100%). Never make the dots larger than 1px or the layer brighter than 0.3: in the capture the field is a faint grey-violet texture, not a visible purple pattern. Hover/in-viewport only: opacity 0.7 and a green-blue fill (animation only)
  - View Transitions art (top, padding 16px 16px 0, at xl padding-top 24px): five rounded 12px tiles in two rows, 8px gaps: three 115x96 then two 176x96. The tile gradients (to top right) are #211F2F->#074170, #184560->#08203E, #000328->#103783, #243748->#0A3431, #133A94->#08203E, BUT the whole tile group has mix-blend-mode: luminosity at rest, so over the dark card it renders as desaturated charcoal greys, never blue or teal. Build it with mix-blend-mode: luminosity (or filter: grayscale(1)) on the wrapper. Colour returns only on hover (animation only)
  - Optimized Images art (right half of the wide card): dot grid as above; a sharp 120x90 image placeholder (feature-image-placeholder-png-120x90.svg, radius 8px, soft drop shadow) labelled "3600px • PNG" in MDIO 12px/16px 400 #858B98 tracking 0.3px, overlapped to the right by a blurred grayscale 90x68 copy (filter blur(6px) grayscale(1), opacity 0.75) labelled "800px • WEBP" in #FFFFFF
  - UI Integrations and Deployment Adapters: after the text, a row of seven 28px logos with 24px gaps, padding 0 24px 24px, shown grayscale at opacity 0.65 (full colour on hover). UI: React, Vue, Svelte, Angular, Preact, Solid, Qwik. Adapters: Node.js, Cloudflare, Vercel, Netlify, SST, Deno, AWS (feature-logos-*.svg)
  - File-Based Routing art (bottom, max-height 224px, padding 16px): a 224px-wide file-tree card in a perspective wrapper (perspective 500px, perspective-origin 50% 30%) transformed rotateZ(-10deg) rotateY(20deg) rotateX(40deg) translateX(5%) translateY(-10%) translateZ(50px) at rest; 1px rgba(255,255,255,0.2) border, radius 8px, background linear-gradient(to top right, #1D2025, #2D3039), padding 6px 0 80px 8px, mask-image linear-gradient(to bottom, white 0%, white 33%, transparent 90%); rows 14px/25.4px #BFC1C9, tree lines 1px #545864, everything grayscale(1) at rest. On top of the whole art area sits a full overlay linear-gradient(to bottom, transparent, transparent, #0C0F19), so the lower half of the tree fades into the card ground. Luminance target: the tree must read as a dim, subordinate diagram (brightest pixels the #BFC1C9 labels in its top third only); the dot field is the same 0.3-opacity 1px dots as Zero JS and the two glows (blue-purple 320px circle, red-pink 208px circle, both radial-masked) are at opacity 0.05, effectively invisible
  - Simple Templating art (bottom, 208-224px tall): a 16-column x 8-row grid over the art box; 1px white lines at opacity 0.10 on rows 2/4/6/8 and columns 2/4/.../16, each fading out at its ends. AT REST exactly ONE chip is visible: <Logo>, spanning columns 2-7 and rows 2-3 (about 139x44), radius 8px, 1px rgba(255,255,255,0.1) border, background linear-gradient(to top right, #17191E, #282C34), padding 10px, MDIO (stand-in IBM Plex Mono) 12px #BFC1C9. The other chips (<NavLinks>, <Hero>, <Article>, <Video>) are opacity 0 at rest: never draw them. Glows: one blue-purple 320px radial-masked circle top -50% right -96px at opacity 0.25 and grayscale(1) (a soft grey haze top right), two more at opacity 0.05 (invisible). No bright central glow
  - Text-only cards (Middleware, Actions, Instant Page Loads, AI-Ready, Environment Variables, Dev Toolbar) are just the 24px-padded text block
  - Hover: border goes to rgba(133,139,152,0.4); art brightens (animation/hover only)
  - Resting state rule for every feature card: the art is quiet and mostly grayscale; colour, brighter dots, extra chips and untilted trees are hover/in-viewport states only (animation only). When in doubt, dimmer is right. Source: github.com/withastro/astro.build src/pages/_components/landing-page/feature-cards/*.astro
- components:
  - eyebrow
  - feature_card

**Themes: category tabs and theme grid**
- summary: Section copy, a row of six pill tabs (Trending active, white), a full-bleed hairline, then a 3x2 grid of theme screenshots where the sixth tile is a dimmed "Browse more themes" card with a pill button; a purple stardust haze behind.
- ground: #060913 with a faint purple stardust haze (PurpleStardust.astro): two full-width (1440px) rounded-full blocks, height 704px at xl (384px lg, 320px below lg), absolutely positioned at the bottom of the section, rotate(-7deg), scaled 1.5 and 2.5, both filled with a flat rgba(188,82,238,0.1) (the repo gradient puts both stops at 100%, so it renders as that single 10% violet, never a 30% blue) and masked by the brand radial mask (see layout.radial_mask). Measured bounding boxes at 1440: x -416 y 4609 2273x1311 and x -1174 y 4172 3788x2186, i.e. centred on the tile grid, NOT above the heading. Visible result: a barely-there violet lift behind the theme grid, the section copy sits on near-black
- desktop: band section y 4857-5617; copy eyebrow "Ecosystem" y 4860; H2 "Themes" y 4885; description y 4933 (2 lines); no CTA button; tabs y 5017, x from 112, 16px gaps: Trending 112x40 (active), E-Commerce 144x40, Blogs 89x40, Docs 85x40, Portfolios 117x40, Landing Pages 155x40; padding 8px 24px, radius 9999px, label 16px/24px 400; rule 1px #23262D full-bleed line at y 5077 (16px under the tabs); grid y 5094-5617: a 1216px grid with 4px padding, 3 columns of 392px, 16px gaps; tiles 392x249 at x 116, 524, 932 and y 5098, 5364; each tile is a link with a 1px rgba(133,139,152,0.2) border and radius 12px containing the screenshot (object-fit cover, radius 12px). Trending order: Starlight, AstroShip, Upstart, Prima Persona, Darkrise, then the more-themes card
- phone: band y 6963-8365; tabs y 7103, same pills, horizontally scrollable (only Trending, E-Commerce and part of Blogs visible); rule y 7163; grid one column, 4px padding, 16px gaps: four screenshots 348x221 at y 7185, 7424, 7662, 7901 (Starlight, AstroShip, Upstart, Darkrise; Prima Persona is hidden below md), then the more-themes card 350x222 at y 8139
- anatomy:
  - Active tab: #FFFFFF fill with the label as blue-purple gradient text; inactive: rgba(44,44,44,0.3) fill (#2C2C2C at 30%), label #BFC1C9; hover inactive fill #2C2C2C at 70%. 500ms ease-in-out
  - More-themes tile: theme-more-themes.webp (a dim collage of category labels) with an overlay linear-gradient(transparent, rgba(6,9,19,0.2) 30%) and a centred pill "Browse more themes" + 18px right arrow: 219x42, background rgba(44,44,44,0.5), 1px rgba(133,139,152,0.3) border, padding 8px 16px, Inter 16px/24px 400 #BFC1C9
  - Each screenshot tile has a hover-only "View Theme" pill (eye icon) over it; at rest none shows
- components:
  - eyebrow
  - category_tab
  - theme_tile

**Partner agencies**
- summary: Section copy with a secondary pill CTA, then a row of four agency logo tiles; a red-pink glow behind.
- ground: #060913 with a red-pink haze: one block inset -600px left/right (-300px right at lg) and -128px top/bottom around the tile row (measured 1805x594 at x -129, y 5756 at 1440; 1672x956 at x -641, y 8344 at 390), rotate(-7deg), filled with the red-pink gradient (66.77deg, #D83333 -> #F041FF) at opacity 0.3 and masked by the brand radial mask (layout.radial_mask). Because the mask peaks at alpha 0.8 in the centre and is already below 0.36 at 31.5% of the radius and 0 at 60%, the visible haze is a compact dark-magenta glow hugging the four tiles (about 1000x330 visible), never a broad pool reaching the section copy or the neighbouring sections
- desktop: band section y 5761-6116; copy eyebrow "Astro Partner Agencies" y 5764; H2 "Get professional Astro support" y 5789 (one line, 537px); description y 5837 (2 lines); secondary button "Explore partner agencies" 214x42 at y 5901; tiles y 5991: a grid with 8px gaps whose tracks are 237px (5 tracks fit, 4 used): tiles 237x124 at x 112, 357, 602, 846; images radius 8px with a 1px inset outline rgba(255,255,255,0.2). The space after the fourth tile stays empty
- phone: band y 8445-8919; copy H2 2 lines ("Get professional / Astro support"); tiles 2x2 grid, 175x92 tiles, 8px gaps, y 8727 and 8827
- anatomy:
  - The four tiles are randomly ordered on each build; the capture shows Bejamas, Bits&Letters, Lucky Media, Seibert Group GmbH. Each tile is the agency's own card art (agency-*.webp), not a logo on a shared ground
  - Hover: tile opacity 0.8, outline rgba(255,255,255,0.65), 300ms ease-out
- components:
  - eyebrow
  - button_secondary
  - agency_tile

**Final CTA**
- summary: A rounded 1216px card filled with a teal-and-blue starfield image, centred two-line bold headline, the same Get Started pill and install block as the hero.
- ground: card image final-cta.webp (1280x634, object-fit cover) over a #1A3E57 fallback; page ground #060913 around it
- desktop: band section margin-top 144px; card y 6260-6966, x 112-1328 (1216x706), 1px solid rgba(133,139,152,0.2) border, radius 16px, overflow clip; content flex column centred, padding 160px, gap 48px, min-height 704px; H2 y 6503 (2 lines: "Start building with / Astro today", 388px wide box) Obviously 36px/40px 700 #F2F6FA; Get Started 278x42 at y 6631; install block 278x42 at y 6681
- phone: band card y 9000-9386 (358x386), radius 16px; content padding 32px, gap 32px, min-height 384px; H2 20px/28px 700, 2 lines (y 9103); buttons 278x42 at y 9191 and 9241
- anatomy:
  - The line break after "with" is hard-coded (<br>)
  - Image reads (sampled): teal #2D7D8B upper left, blue #275A8D right, deep #16354A centre-bottom, fine white star specks; place the file, do not paint it
- components:
  - button_primary
  - install_block

**Sponsors**
- summary: Centred bold heading over one bordered dark panel of sponsor cells in four bands: 2 large, 3, 2, then a 7-cell small row that ends with a red heart "Sponsor Astro" cell; white sponsor logos (some in brand colour).
- ground: #060913; panel #0C0F19
- desktop: band section y 7110-8296 (margin-top 144px); h2 "Astro is free, open-source software made / possible by these wonderful sponsors" y 7110, centred, max-width 768px, Obviously 30px/36px 700 #FFFFFF, 2 lines (715px and 659px); panel y 7222-8296, x 272-1168 (896px, max-w-4xl), 40px under the H2, #0C0F19, 1px rgba(133,139,152,0.2) border, radius 16px, overflow hidden; bands band 1 y 7223, 2 cells 447x240 (Netlify logo 415x74, Cloudflare 414x68); band 2 y 7463, 3 cells 298x240 (Mux 266x26, ImageKit 265x32, CloudCannon 265x44); band 3 y 7703, 2 cells 447x240 (Mintlify 415x32, Cloudways 414x40); bands separated by 1px rgba(133,139,152,0.2) lines and cells by vertical dividers of the same colour; band 4 y 7943-8296: flex-wrap cells 176px tall: row a 4 cells (ArcJet 191x64, Datadog 191x60, Databento 191x25, BairesDev 192x18) at 224px wide, row b 3 cells 298px wide (N-iX 265x20, DigiNeat 265x30, Sponsor Astro); cells each cell is a link: logo centred, padding 16px, logo width 100% of the cell minus padding at its set height; hover background rgba(242,246,250,0.05)
- phone: band H2 y 9466, 24px/32px 700, 4 lines centred; panel y 9627, 356px wide; bands every large cell stacks full width at 160px tall (Netlify, Cloudflare, Mux, ImageKit, CloudCannon, Mintlify, Cloudways), then the small sponsors in a 2-column grid of 178x128 cells; the last odd cell (Sponsor Astro) spans both columns
- anatomy:
  - Sponsor Astro cell: 24x24 heart outline in #D83333 above "Sponsor Astro" in 16px #BFC1C9, links to https://opencollective.com/astrodotbuild
  - Logos keep their own colours where the file has them (Netlify teal mark, Cloudflare orange cloud, Mintlify green leaf, BairesDev and DigiNeat red marks); white parts render #F2F6FA
  - Then a spacer of 144px (sm:h-36) before the footer
- components:
  - panel
  - sponsor_cell

**Footer**
- summary: Dark footer under a 1px hairline: newsletter block at left, four link columns at right, then a hairline and a bottom row with the Astro mark + MIT licence line at left and eight white social icons at right.
- ground: #060913 with a 1px rgba(133,139,152,0.2) top border
- anatomy:
  - Container max-width 1536px (max-w-screen-2xl) with 32px padding: content x 32-1408 at 1440 wide (wider than the 1216px body column)
  - Top nav: padding 48px 0, flex row space-between, gap 80px. Newsletter at x 32, 384px wide: "Let's keep in touch" 20px/28px 600 #F2F6FA (y 8489); "Enter your email to stay up to date with the latest updates from Astro." 16px/24px 400 #BFC1C9 (2 lines); email input 384x40 at y 8589 (placeholder "your@email.com", #060913 fill, 1px #23262D border, radius 8px, padding 4px 12px, 16px text); 8px under it a "Subscribe to our newsletter" button 384x40, radius 9999px, background rgba(35,38,45,0.8), 1px rgba(133,139,152,0.1) border, 16px 300 #F2F6FA centred
  - Link columns at x 671, 875, 1080, 1284 (124px wide, about 204px pitch), headings y 8489 16px/16px 600 #FFFFFF; links start 32px below, every 32px, 16px/24px 300 #BFC1C9 (hover #F2F6FA)
  - Resources: Docs, Themes, Integrations, Playground, Site showcase, Starter templates
  - About: Blog, Case studies, Partner with us, Press, Agencies
  - Community: Contributing, Sponsors, Wallpapers, Swag Shop
  - Legal: Telemetry, Privacy Policy, Terms of Service
  - Hairline: 1px #343841 rule x 32-1408 at y 8753
  - Bottom row (padding 32px 0): left: Astro logomark 20x20 #F2F6FA (footer-logos-astro-F2F6FA.svg) at x 32, then "MIT License © 2026" (links to the LICENSE) and "Astro Contributors" (links to the contributors graph), 16px/24px 300 #BFC1C9, 16px apart; right: eight 28x28 white icons in 52x52 hit areas, 56px pitch from x 964: Bluesky, Discord, GitHub, LinkedIn, Mastodon, Reddit, X, YouTube
  - Copyright line verbatim: "MIT License © 2026 Astro Contributors". No street address, phone number or company legal name is published
- phone: One column, padding 16px: newsletter first (title 16px/24px 600; input and Subscribe 358x40), then the link columns as a 2x2 grid (Resources and About at y 11639, Community and Legal at y 11903; columns x 16 and 192, 128px wide), hairline at y 12087, then the social icons wrap in two rows (six then two, 48x48 cells from x 16) and the licence row comes LAST, centred, 14px/20px (flex-col-reverse). Footer y 11342-12288 (946px).

**On dark grounds**
- secondary button: Translucent dark pill: rgba(44,44,44,0.3) fill, 1px rgba(133,139,152,0.3) border, #BFC1C9 16px 400 label, padding 8px 16px, 42px tall; hover border rgba(133,139,152,0.6), label #F2F6FA (Integrate your favorite framework, Explore partner agencies)
- link: #F2F6FA underlined (offset 2px, decoration #858B98) inside copy; nav and footer links #BFC1C9 without underline, hover #FFFFFF / #F2F6FA
- muted text: #BFC1C9 for descriptions and links; #858B98 for captions, scores and inactive labels
- hairline: 1px rgba(133,139,152,0.2) on panels, cards and the footer top; 1px #23262D for the full-bleed tab rules and browser frame; 1px #343841 for the footer divider and phone menu rows
- logo variant: monochrome #F2F6FA wordmark in the nav and #F2F6FA logomark in the footer (not the gradient logo the press page recommends for dark grounds; see voices for scope). Customer and sponsor logos are single-colour #F2F6FA or their own brand colours

## Components

- **button primary** (observed): fill #FFFFFF, text blue-purple gradient text (#3245FF to #B845ED), border 1px solid transparent, radius 9999, padding 8px 16px, height 42, width 278, padding x 16, font size 16, weight 400, face system, text style 16px/24px system ui-sans-serif 400, background linear-gradient(83.21deg, #3245FF 0%, #B845ED 100%) clipped to text, example Get Started (278x42, hero and final CTA), anatomy Always stacked on the install block, 8px above it, same 278px width
  - hover (observed): fill #F2F6FA, text #3245FF (solid)
  - focus (observed): outline 2px solid, outline-offset 2px
- **install block** (observed): fill rgba(6,9,19,0.55), text #BFC1C9, radius 12, padding 8px 16px, height 42, width 278, text style ui-monospace 14px/20px 300, example > npm create astro@latest [copy], anatomy 12x12 chevron (icon-chevron-BFC1C9.svg) rotated -90deg, 8px gap,command text flex 1,20x20 copy icon (icon-copy-BFC1C9.svg), hover #F2F6FA and scale 1.1; a "Copied!" tooltip (14px, rgba(13,15,20,0.5), radius 4px) appears only after clicking
  - hover (observed): copy icon #F2F6FA
- **button secondary** (observed): fill rgba(44,44,44,0.3), text #BFC1C9, border 1px solid rgba(133,139,152,0.3), radius 9999, padding 8px 16px, height 42, padding x 16, font size 16, weight 400, face system, text style 16px/24px system ui-sans-serif 400, example Integrate your favorite framework (275x42), Explore partner agencies (214x42)
  - hover (observed): border rgba(133,139,152,0.6), text #F2F6FA
- **release pill** (observed): fill rgba(6,9,19,0.55), radius 9999, height 36, example Astro 7.4 | Available now! → (219x36), anatomy left segment: padding 0 12px, linear-gradient(to top right, #1321AC, #881ABD), radius 9999px, "Astro 7.4" 14px/20px 300 #FFFFFF,right segment (sm and up): padding 0 12px, "Available now!" 14px/20px 300 #F2F6FA, 8px gap, 16px arrow #F2F6FA; hover underlines the text,phone: right segment hidden, a 16px white arrow joins the left segment (104x36)
- **eyebrow** (observed): text red-pink gradient text: linear-gradient(66.77deg, #D83333 0%, #F041FF 100%) background-clip text, text style 16px/24px system ui-sans-serif 600, example What is Astro?, Best-In-Class Performance, Maximum Flexibility, Everything you need, Ecosystem, Astro Partner Agencies, anatomy Title Case, 4px above the section title
- **gem icon** (observed): size 62px desktop / 52px phone, ring px 3px desktop / 2px phone, disc #0D0F14 plus a to-bottom-right tint of the gem pair (25% blue-green, 20% red-pink, 15% orange-yellow), glyph 28px white (20px phone) Remix line icon
- **panel** (observed): fill #0C0F19, border 1px solid rgba(133,139,152,0.2), radius 16, padding 32px desktop / 16px phone, example Islands chart panel, sponsors panel, radius note 16px desktop / 12px phone
- **bar chart row** (observed): track 990x40 desktop / 324x32 phone, radius 8px, outline 1px #343841 offset 4px (Astro row #545864), fill Astro: linear-gradient(247.23deg, #4AF2C8, #2F4CB3); others #343841; width = score %, logo 19-24px #F2F6FA, 8px inside the fill, score Astro 30px/36px 600 #4AF2C8; others 20px/28px 600 #858B98, label Obviously 20px/28px 700 #F2F6FA (stand-in Hubot Sans wdth 115 wght 700), right-aligned in a 144px column (desktop only)
- **framework tab** (observed): size 72px desktop / 52px phone, ring px 4px desktop / 2px phone, disc #0D0F14 64px (48px phone), tinted with the framework colour at 20% when active, label 16px/24px 500, 12px below
  - active (observed): ring #61DAFB, label #61DAFB, logo full colour
  - rest (observed): ring #858B98, label #858B98, logo grayscale
  - hover (observed): ring #BFC1C9, label #BFC1C9
- **category tab** (observed): fill rgba(44,44,44,0.3), text #BFC1C9, radius 9999, padding 8px 24px, height 40, text style 16px/24px system 400
  - active (observed): fill #FFFFFF, text blue-purple gradient text
  - hover (observed): fill rgba(44,44,44,0.7)
- **feature card** (observed): fill #0C0F19, border 1px solid rgba(133,139,152,0.2), radius 16, padding 24px desktop / 16px phone, title 16px/24px 600 #FFFFFF, description 16px/24px 300 #BFC1C9 (14px/20px below xl), gap 8, radius note 16px desktop / 12px phone
  - hover (observed): border rgba(133,139,152,0.4)
- **code card** (observed): frame #07040F, padding 4px, radius 20px, pre #17191E, 1px rgba(133,139,152,0.2) border, radius 16px, code ui-monospace 13.6px/22.44px, highlight rgba(38,74,137,0.5) full-width line
- **browser window** (observed): fill #07040F, border 1px solid #23262D, radius 16, bar 39px, 1px #23262D bottom border, three 12px #23262D dots
- **theme tile** (observed): border 1px solid rgba(133,139,152,0.2), radius 12, size 392x249 desktop / 348x221 phone
  - hover (observed): overlay "View Theme" pill: rgba(44,44,44,0.5) fill, 1px rgba(133,139,152,0.6) border, Inter 16px #F2F6FA, eye icon
- **agency tile** (observed): radius 8, outline 1px rgba(255,255,255,0.2) inset (-1px offset), size 237x124 desktop / 175x92 phone
  - hover (observed): opacity 0.8, outline-color rgba(255,255,255,0.65), transition all 0.3s ease-out
- **sponsor cell** (observed): padding 16, divider 1px rgba(133,139,152,0.2), height 240 (large) / 176 (small) desktop / 160 / 128 phone
  - hover (observed): background-color rgba(242,246,250,0.05)
- **nav link** (observed): text #BFC1C9, text style 16px/24px system 300
  - hover (observed): color #FFFFFF, transition color 0.3s cubic-bezier(0, 0, 0.2, 1)
- **newsletter** (observed): input 384x40 (358 phone), #060913, 1px #23262D, radius 8px, padding 4px 12px, placeholder your@email.com, button Subscribe to our newsletter, 384x40, radius 9999px, rgba(35,38,45,0.8), 1px rgba(133,139,152,0.1), 16px 300 #F2F6FA
- **text link** (observed): text #F2F6FA, decoration underline, offset 2px, colour #858B98
  - hover (observed): text-decoration-color #FFFFFF

## Motion tokens

| Name | Easing | Duration | Use | Label |
|---|---|---|---|---|
| float | ease-in-out | 6000ms | Infinite float of translateY -8px to +8px (animate-float) | published |
| card-hover | ease-out | 300ms | Link cards scale to 1.03 on hover | published |
| link | ease-out | 300ms | Link color from astro-gray-200 to white (.link) | published |
| button | ease-in-out | 500ms | Pill buttons; primary label swaps gradient text for astro-blue on hover | published |
| logo-reveal | ease | 500ms | Integration logos go from grayscale at 65% opacity to full color on hover | published |

## Icon tokens

Grid 24px viewBox (custom src/icons); Remix Icon line set (ri/*) for feature gems, stroke not published; glyphs are filled outline shapes, white on black (published).
| Name | Size | Use |
|---|---|---|
| gem-glyph | 20px | Glyph inside a 48px gem circle (size-5 in size-12); 28px in 56px at lg |
| ui | 24px | Custom UI icons (rocket, chevron, arrows), filled outline shapes in currentColor |

## Signature moves

### Four gem gradients

Where: Feature icon rings, eyebrow labels, the primary button, card fills and background glows.
Do: Only four two-stop gradients: blue-purple 83.21deg #3245FF to #B845ED; blue-green 247.23deg #4AF2C8 to #2F4CB3; red-pink 66.77deg #D83333 to #F041FF; orange-yellow 266.93deg #F8E42E to #FF7D54. Each is used whole, never mixed with another. One gradient per element; a section may use a different gem than its neighbor.
Don't: invent new gradient pairs, blend three stops, or put gray in a gradient.
Example: "Server-First".

### Gradient-text eyebrow over a white title

Where: Above every homepage section title (What is Astro?, Best-In-Class Performance, Maximum Flexibility, Ecosystem).
Do: A short Title Case label (16px/24px weight 600, system UI font as served; Inter SemiBold in the repo intent) clipped to the red-pink gradient (#D83333 to #F041FF), then a white Obviously title (30px bold), then a 16px light description in #BFC1C9 at half width. One eyebrow per section.
Don't: gradient the title itself or the body copy.
Example: "Maximum Flexibility Zero Lock-in", with "Maximum Flexibility" set as color.

### Get Started plus the install command

Where: Hero and final CTA.
Do: A white 278x42 pill whose Get Started label is blue-purple gradient text (#3245FF to #B845ED), stacked 8px above a same-width dark install block (rgba(6,9,19,0.55), radius 12px) holding a chevron, npm create astro@latest in ui-monospace 14px (Menlo on macOS; MDIO in the repo intent) and a copy icon. Hero and closing CTA only.
Don't: drop the command, or fill the primary pill with flat brand blue.
Example: "Get Started", with "Get Started" set as color.

### Night sky with nebula glow

Where: Hero ground, section backdrops (stardust), final CTA starfield, press-page header grid.
Do: Deep navy-black ground (#060913) lit by large, soft, rotated gradient glows masked radially (e.g. red-pink at 30% opacity, -7deg) and star specks; the hero blooms violet from the gem gradients. Optional 100px grid (bg-grid.png) faded top and bottom by a mask. One glow per band.
Don't: set the brand on a flat white page or a hard-edged gradient band.
Example: "Start building with Astro today".

## Messaging: rules

One line leads: 'The web framework for content-driven websites', backed by three pillars (Server-First, Content-Driven, Customizable) and Title Case section promises (Astro Islands, Zero Lock-in, Fully Featured). The press page adds the boilerplate and the closing 'build the web we want, together'.

Why it works: The category claim narrows Astro to content sites, which is where its performance argument wins.

- Lead with the category line; follow with the speed claim and the install command
- Back performance claims with the named dataset (HTTP Archive, Chrome UX Report)
- Use the press boilerplate for third-party descriptions

Sources: https://astro.build/, https://astro.build/press/, github.com/withastro/astro.build src/pages/_components/landing-page/Intro.astro (main, read 2026-10-31)

## Voice: rules

No voice guide is published. The rebrand names Houston's personality (whimsical, approachable, friendly) as Astro's own; the site writes plain, short developer sentences, sentence-case heroes, Title Case section names, and space puns in headings.

Why it works: A friendly, lightly playful voice keeps a performance-focused framework welcoming to its community.

|  |  |
|---|---|
| Traits | Whimsical, approachable, friendly |
| Hero case | Sentence case (observed) |
| Section titles | Title Case (observed) |

- Plain, specific developer language: what it does, then how to start
- Light space humor in headings only (Ready For Takeoff)
- Name the data source for every number
- Speak to the community as 'we' and 'together'
- Don't claim speed without a dataset
- Don't imitate generic devtool hype

Do and don't:
- Do: "71% of real-world Astro sites have good Core Web Vitals.". A number with its dataset beside it.
- Don't: "The fastest framework ever built, period.". Speed claimed without data.

Real examples, to look at on Astro's own pages (not for reuse):
- Houston iterations; the original CLI line sets the playful tone: https://astro.build/blog/welcome-world/

Sources: https://astro.build/blog/welcome-world/, https://astro.build/

## Logo: rules

The 2023 logo pairs a rocket-flame 'A' mark with a wide lowercase 'astro' wordmark. Press files come in dark ink for light grounds, white with a red-pink gradient flame for dark grounds (the default on dark), and monochrome white when a single color is essential. The logomark alone is for very small uses. The 2021 logo is retired.

Why it works: The refresh centered the mark and improved the wordmark's readability; the gradient flame turns the A into a launching rocket.

|  |  |
|---|---|
| Clear space | adequate on all sides; diagram uses the lowercase 'a' as the unit (shown, not stated as a rule) |
| Minimum | 24px tall digital; 1/8 inch tall print |
| Default on light | astro-logo-dark (ink #17191E) |
| Default on dark | astro-logo-light-gradient (flame #D83333 to #F041FF) |
| Logomark | very small uses only |

- On light: the dark logo in most cases; on dark: the gradient logo in most cases
- Monochrome white logo on dark only when monochrome is essential
- Logomark only for very small representations; in illustrations only with Astro's written consent
- Clear space: keep adequate space on all sides; the press diagram measures it with the wordmark's lowercase 'a'
- Minimum height 24px digital, 1/8 inch print, for logo and logomark
- Allowed: link to Astro's site or repo, show built-in Astro support, blog posts and videos about Astro
- Use the 2023 logo, never the 2021 version
- Starlight has its own logo for the documentation theme
- Don't use the Astro logo as your app or website icon
- Don't include the Astro logo in your own logo
- Don't modify the logo or change its colors
- Don't sell products featuring the logo without permission

Do and don't:
- Do: "astro". Gradient or white logo on dark.
- Don't: "astro". Don't change the logo's colors.

Real examples, to look at on Astro's own pages (not for reuse):
- Gradient logo for dark grounds: https://astro.build/press/
- Logo for light grounds: https://astro.build/press/
- Press page: allowed uses, things to avoid, 2021 vs 2023, spacing and minimum size: https://astro.build/press/
- Old and new logo, and the mark on the red-pink gradient: https://astro.build/blog/welcome-world/

Sources: https://astro.build/press/, https://astro.build/blog/welcome-world/

## Color: rules

Dark grounds (#060913 homepage, #0D0F14 press and blog) with off-white #F2F6FA headings and #BFC1C9 body text. Color arrives as four two-stop gem gradients (blue-purple, blue-green, red-pink, orange-yellow) in icon rings, eyebrows, button text and soft glows. The rebrand palette image shows grays from white to charcoal above the four gradient bars.

Why it works: Keeping text neutral on a dark sky lets the saturated gradients read as light sources: the brand's own way not to look like other dark-mode devtools.

|  |  |
|---|---|
| blue-purple | 83.21deg #3245FF to #B845ED |
| blue-green | 247.23deg #4AF2C8 to #2F4CB3 |
| red-pink | 66.77deg #D83333 to #F041FF |
| orange-yellow | 266.93deg #F8E42E to #FF7D54 |
| Grounds | #060913 / #0D0F14 / #0C0F19 |

- Ground: navy-black (#060913) or black (#0D0F14); panels #0C0F19 or #23262D with a 1px low-opacity border
- Text: #F2F6FA headings, #BFC1C9 body, #858B98 captions
- Gradients only as the four published pairs, each at its own angle
- Eyebrow labels in red-pink gradient text; primary button label in blue-purple gradient text
- Focus ring astro-pink-light #E8C4F9
- Repo token names astro-orange and astro-yellow are swapped: #F8E42E is yellow, #FF7D54 is orange
- Don't set body copy in a gradient or a saturated color
- Don't build a light-mode page as the default
- Don't mix stops from different gems

Not published: color proportions or ratios; contrast rules; print values (CMYK, Pantone).

Do and don't:
- Do: "Get Started". White pill with blue-purple gradient label on the night sky.
- Don't: "Get Started". Flat blue button on a white page: the generic devtool look the rebrand avoided.

Real examples, to look at on Astro's own pages (not for reuse):
- Visual elements and color palette: grays plus four gradient bars: https://astro.build/blog/welcome-world/
- Homepage hero bloom and gem icons (observed 2026-10-31): https://astro.build/

Sources: github.com/withastro/astro.build tailwind.config.ts (main, read 2026-10-31), https://astro.build/blog/welcome-world/, https://astro.build/ (2026-10-31)

## Typography: rules

Obviously, a wide variable grotesk, sets headlines: bold 700 for the hero and closing CTA, a light 290 for the intro statement with the brand name in 475, 380 on press and blog headings. Inter Light (200-300) carries reading text; MDIO Light sets code. Headings are often centered in the hero and left-aligned in sections.

Why it works: A wide, confident display face against airy light Inter gives the 'vibrant personality' the rebrand asked for while keeping long text legible.

|  |  |
|---|---|
| Hero | Obviously 700, 48/30px, 1.1 |
| Section title | Obviously 400 (wght 475 via strong), 30/24px |
| Heading weights | 290 / 380 / 475, wdth 490 |
| Body | Inter 300, 16px, 1.5 |
| Lead | Inter 300, 18px (CSS asks 200, but the served Inter face spans 300-600, so it renders at 300; build 300, never 200) |
| Code | MDIO light, 14px |

- Display: Obviously, width 490, weights 290 light / 380 normal / 475 bold (repo), 700 for the hero
- Hero 48px desktop, 30px phone, line-height 1.1 (observed)
- Section titles 30px desktop, 24px phone (observed)
- Mix weights inside one statement: light sentence, bold brand name (Intro)
- Body as served on the homepage: system UI stack (ui-sans-serif, system-ui, sans-serif) at 16px/24px 300; Inter 300 18px only on the hero lead (repo intent: Inter throughout)
- Code as served: ui-monospace 14px (Menlo on macOS); MDIO only on 12px image labels (repo intent: MDIO for code)
- Don't set long text in Obviously
- Don't use heavy Inter for body copy
- Don't synthesize bold or italic (font-synthesis none)

Real examples, to look at on Astro's own pages (not for reuse):
- Type system: Obviously sizes, Inter, MDIO: https://astro.build/blog/welcome-world/

Sources: https://astro.build/blog/welcome-world/, github.com/withastro/astro.build src/styles/fonts.css (main, read 2026-10-31), github.com/withastro/astro.build src/styles/tailwind.css (main, read 2026-10-31), https://astro.build/ (2026-10-31)

## Graphic elements: rules

Gem icons (gradient ring, black disc, white glyph), pill buttons and tabs, translucent dark panels with hairline borders, a stacked CTA of white pill and code block, nebula glows and stardust, and a faded 100px grid on page headers.

Why it works: Each element is a small light source or a terminal, so the page reads as both space and code.

|  |  |
|---|---|
| Panel radius | 12-16px |
| Button | pill (rounded-full) |
| Grid | 100px, bg-grid.png |

- Gem icon: 48px circle (56px lg), 2-3px gradient ring, tinted black disc, 20-28px white glyph
- Panels: #23262D fill, #343841 border, large shadow; homepage panels #0C0F19 with 20% border
- Buttons: pills only
- Code block: dark at 55%, rounded-xl, chevron prompt, copy button
- Grid: 100px squares, masked top and bottom
- Don't square buttons
- Don't hard drop shadows on dark

Real examples, to look at on Astro's own pages (not for reuse):
- The bg-grid tile used behind page headers: github.com/withastro/astro.build public/assets/bg-grid.png (main, read 2026-10-31)
- Feature card grid on the homepage (observed 2026-10-31): https://astro.build/

Sources: github.com/withastro/astro.build tailwind.config.ts (main, read 2026-10-31), github.com/withastro/astro.build src/components/GemIcon.astro (main, read 2026-10-31), https://astro.build/ (2026-10-31)

## Iconography: rules

Feature icons are Remix Icon line glyphs (server, file list, dashboard) set white inside gradient-ringed gem circles. The repo's own UI icons are 24px filled-outline shapes in currentColor. No icon guideline is published.

|  |  |
|---|---|
| Gem | 48/56px |
| Glyph | 20/28px |
| UI icons | 24px viewBox |

- White glyph, centered, in a gem circle with one gem gradient
- Use a line-style set consistent with Remix Icon
- Don't color the glyph itself
- Don't mix icon styles in one row

Real examples, to look at on Astro's own pages (not for reuse):
- Three gem icons under What is Astro? (observed): https://astro.build/

Sources: github.com/withastro/astro.build src/components/GemIcon.astro (main, read 2026-10-31), github.com/withastro/astro.build src/icons/ (main, read 2026-10-31)

## Illustration: rules

The rebrand introduced an original illustration style: blurred concentric rings, bursts of colored light streaks, a comet and stacked cards, all in the gem colors on dark. Houston, a square screen-faced mascot with a gradient outline, can be dressed for any occasion or emotion. Houston is for Astro's own community use only.

Why it works: Soft glowing light on a dark field makes code abstractions feel cosmic and friendly.

|  |  |
|---|---|
| Houston | square screen face, blue-green/purple gradient outline |

- Glowing, blurred light forms in gem colors on dark
- Houston: simple square face, gradient outline; Astro use only
- Don't use Houston in your own materials
- Don't flat, hard-edged corporate illustration

Real examples, to look at on Astro's own pages (not for reuse):
- Rebrand cover: the mark in a ring of gradient light: https://astro.build/blog/welcome-world/
- Ahoy Houston: expressions: https://astro.build/blog/welcome-world/
- Visual elements: rings, burst, comet: https://astro.build/blog/welcome-world/

Sources: https://astro.build/blog/welcome-world/, https://astro.build/press/

## Photography: rules

Not published, and the homepage uses no photography: product screenshots (themes), partner-agency tiles and a starfield image fill the visual slots.

|  |  |
|---|---|
| Photography | not published |

- Prefer product screenshots and illustration over photos
- Don't stock photography of people at laptops (not seen anywhere in the system)

Real examples, to look at on Astro's own pages (not for reuse):
- Theme screenshots, agency tiles and the starfield CTA (observed): https://astro.build/

Sources: https://astro.build/ (2026-10-31)

## Motion: rules

The repo defines a slow 6s float and gentle 300-500ms ease-out transitions; cards grow 3% on hover and logo rows gain color on hover. The rebrand launched with a video by Streiloff & Co.

|  |  |
|---|---|
| float | 6s ease-in-out infinite, +/-8px |
| hover | 300-500ms ease-out |
| card | scale 1.03 |

- Slow, floaty, ease-out; nothing snappy
- Hover reveals color rather than moving content
- Don't fast or bouncy motion

Sources: github.com/withastro/astro.build tailwind.config.ts (main, read 2026-10-31)

## Interface and layout: rules

Centered hero, then left-aligned sections inside a 1280px container (max-w-screen-xl) with 16px (phone) and 32px (desktop) gutters; generous vertical gaps (mt-20 to mt-36); 1-2-3 column card grids with 8-16px gaps.

- Container 1280px, 16/32px side padding (repo .container)
- Hero centered; sections left-aligned with eyebrow, title, half-width description
- Header height 80px (repo h-header 5rem)
- Prose max width 768px, line-height 1.8125

Not published: a grid or spacing scale in guideline prose (repo values only).

Sources: github.com/withastro/astro.build tailwind.config.ts (main, read 2026-10-31), https://astro.build/ (2026-10-31)

## Rules: rules

- Use the latest (2023) logo, gradient on dark, dark on light
- At least 24px tall digitally, 1/8 inch in print
- Keep clear space around logo and logomark
- Dark grounds, neutral text, gem gradients for color
- Don't use the logo as your icon or inside your logo
- Don't modify or recolor the logo
- Don't sell logo products without permission
- Don't use Houston in your own materials
- Don't use the logomark large or in illustrations without written consent

Sources: https://astro.build/press/, https://astro.build/blog/welcome-world/, github.com/withastro/astro.build tailwind.config.ts (main, read 2026-10-31)

## Campaigns

### Welcome, World: the 2023 rebrand (2023)

Announced March 6, 2023 by Mark Peck: a refined logo, Obviously and MDIO type, a dark-mode site with a unique palette and illustration, and Houston as mascot, made with Streiloff & Co after three months of community interviews.

How the system shows: Gradient-flame logo, gem gradients, glowing illustrations and space-themed headings.
Why it works: It keeps the early-web idealism and makes Astro visibly unlike other devtools.
Channels: identity system, web, video, blog. Source: https://astro.build/blog/welcome-world/

## Applications

| Format | What | Source |
|---|---|---|
| web page | Homepage: violet-bloom hero, centered Obviously H1, white Get Started pill over the npm command, logo wall, gradient-eyebrow sections, CWV chart panel, feature card grid, themes tabs, agency tiles, starfield final CTA. | https://astro.build/ |
| press page | Plain #0D0F14 page with grid header, asset tiles on white or #17191E, gradient PNG/SVG pills. | https://astro.build/press/ |
| blog post | Dark article with Obviously headings, Inter body, framed illustrations with a small caption bar. | https://astro.build/blog/welcome-world/ |
| CLI | Houston appears in the npm create astro helper. | https://astro.build/blog/welcome-world/ |

## By format

How our engine applies Astro's system to each format. This is our recipe built from their published sources, not something Astro publishes. Level = how much glow and gradient the format carries (0 plain, 5 full nebula). Loudness runs 0 (nothing but the essentials) to 5 (the signature moves at full volume).

| Format | Loudness 0–5 | Must appear | What varies |
|---|---|---|---|
| Landing page | 4 | Build it the way astro.build is built (kit.spec.page): #060913 ground; an 80px non-sticky bar with the monochrome #F2F6FA logo; a centred hero on the blurred violet glow image with a release pill, a 48px bold display H1 in #F2F6FA, an 18px Inter 300 lead in #BFC1C9, a white pill whose Get Started label is blue-purple gradient text over the dark install-command block, then a monochrome logo wall; then left-aligned sections in a 1216px column, each a red-pink gradient eyebrow, a 30px white Title Case title and a half-width #BFC1C9 description, followed by real proof in #0C0F19 panels and cards with 1px rgba(133,139,152,0.2) hairlines and 16px radii; pill buttons and tabs only; a starfield closing CTA card; a sponsors panel; the four-column footer. Homepage voice, not the campaign voice | number of sections and cards, which proof each section shows, which gem gradient per point, stardust glows |
| Deck | 3 | Dark grounds, Obviously titles, Inter Light body, gradient logo on dark, one gem gradient per slide | a glow or illustration on title slides |
| Proposal page | 2 | #0D0F14 ground, Obviously headings, Inter Light body, white pill CTA, sourced numbers only | one gem icon row |
| Social post | 4 | Dark ground, gradient glow, Obviously headline, gradient logo | illustration light forms |
| Email | 1 | Dark or white body per client, Inter text, one pill button, logo per ground rule | a small gradient header |
| Error message | 0 | Plain, friendly sentence, Inter on dark | none (Houston is Astro's own, so not in third-party work) |

## Checks before anything ships

- **Logo hidden**: Cover the logo. It should still read as Astro: a navy-black sky, gem-gradient glows and rings, wide Obviously headlines over light Inter, and a pill plus install command.
- **Swap test**: Put another framework's logo on it. If the night sky, the four gems and the cited speed number don't feel out of place, it's generic, and it goes back.

## Make it your own

Keep the system: color roles and proportions, type, layout, components, the signature moves, the voice traits and rules. Replace everything that is Astro's own: name and logo, positioning, pillars, proof, taglines, boilerplate and any real line quoted above. kit.json lists these under make_it_yours.

## Not published

- Color proportions or ratios: not published.
- Color roles in guideline prose: not published; roles here come from repo tokens and observed homepage use.
- Contrast or accessibility rules: not published.
- Print colors (CMYK, Pantone): not published.
- Clear-space value: not published as a number; the press diagram shows the lowercase 'a' as the unit.
- Logo placement, co-branding and partner lockups: not published.
- Type scale in guideline prose: not published; sizes are repo classes and observed homepage values.
- Obviously and MDIO are proprietary and not supplied; the open stand-ins (Hubot Sans wdth 120 for Obviously bold, Archivo wdth 125 for its light weights, IBM Plex Mono for MDIO) are calibrated by rendered width and ink, but none reproduces Obviously's letterforms.
- Iconography grid, stroke and style rules: not published; Remix Icon use is observed in the repo.
- Illustration construction rules: not published beyond the rebrand's description and images.
- Photography: not published; none used on the homepage.
- Motion principles: not published as guidance; only repo animation values and the 2023 launch video.
- Voice and style guide (case, punctuation, banned words): not published; only Houston's three traits.
- Repo color token names astro-orange (#F8E42E, a yellow) and astro-yellow (#FF7D54, an orange) are swapped; the repo also notes white should become a brand off-white (TODO).
- Trademark statement: not published.

Logos and reference images belong to Astro. Look at them on Astro's own pages; don't reuse them.
