The documentation site for H.O.T EARTH, built with Astro + Starlight. Dark-first, static, keyless, with Pagefind search.
cd website
npm install
npm run dev # http://localhost:4321npm run build # static output to ./dist, builds the Pagefind index + sitemap
npm run preview # serve ./dist locallyThe logo and icons are hand-authored SVGs in ../brand/ (the source of truth).
PNG app icons and the default OG image are generated from them:
npm run icons # writes public/icons/* and public/og-default.png (gitignored)Run npm run icons before a build if you change the brand SVGs.
Set via environment variables (all optional):
| Variable | Purpose | Default |
|---|---|---|
SITE_URL |
Canonical site URL (sitemap, OG, JSON-LD) | the Vercel URL |
PUBLIC_GA_ID |
Google Analytics 4 id. No analytics ship unless set. | unset (off) |
Deploy as its own project:
- Root directory:
website - Framework preset: Astro
- Build command:
astro build, Output:dist
Add a build step to regenerate icons if you want them fresh on each deploy:
npm run icons && astro build.
Once a custom domain is attached, serve these docs at /docs with a rewrite in
the main app, so the docs share the primary domain for SEO. See
docs/deploy-to-vercel.
lighthouserc.json gates Accessibility and SEO at 100 and warns below 0.9 on
performance. After a build:
npm run lighthouseMeasured on the production build (desktop, 2026-07-29):
Two honest notes:
- Performance varies run to run on a local machine (one outlier run scored the home page 78 before three consecutive 100s). Treat a single local run as indicative, not definitive.
- One axe rule,
label-content-name-mismatch, still flags Starlight's own search button: its visible "Search" label isaria-hiddenupstream, so axe compares the accessible name against the "Ctrl K" shortcut hint. The rule carries zero weight in the Accessibility score and the button's accessible name is correct. - On Windows,
lhci autoruncan crash during Chrome cleanup (anEPERMinchrome-launcherremoving its temp profile) after the audit has finished. The scores are still produced; re-run or audit against a manually launched Chrome if that bites.
Content lives in src/content/docs/, organised by the
Diátaxis framework (Tutorials, How-To, Reference,
Explanation). Custom components are in src/components/, theme tokens in
src/styles/.
