The production Astro repository for Impact Orbit — the parent group behind Green Orbit Digital, Green Orbit Academy, Space Impact Forum and Leicester Space Week.
Built to be maintained for 5–10 years: fully static, zero client-side JS by default, WCAG 2.2 AA-oriented, and structured around Astro Content Collections rather than a headless CMS.
- Astro 7 (static output, no adapter required)
- Content Layer API (
src/content.config.ts) — Markdown/MDX + JSON collections - TypeScript strict mode, path aliases (
@components,@layouts,@lib,@data,@styles) - Biome for linting/formatting (replaces ESLint + Prettier)
@astrojs/sitemap,@astrojs/rss,@astrojs/mdx,sharpfor images
npm install
npm run dev # http://localhost:4321
npm run build # → dist/
npm run preview
npm run check # astro check (types + template diagnostics)
npm run lint # biome check .Copy .env.example to .env and set PUBLIC_SITE_URL at minimum.
src/
components/ # layout, seo, sections, cards, forms, ui, blog, academy, case-studies, shared
content.config.ts # Content Layer schemas (Zod) for every collection
content/ # insights, case-studies, programmes, workshops, resources,
# events, reports, team, authors, testimonials
data/ # branding, navigation, footer, services, sectors, site config
layouts/ # BaseLayout → PageLayout / PostLayout
lib/ # seo.ts, schema.ts (JSON-LD), formatters, reading-time, rss, pagination
pages/ # route tree — see below
styles/ # tokens.css design system, reset, typography, prose, utilities
Organised around the customer journey rather than internal service names:
//about/methodology/manifesto/impact/careers/contact/digital+/digital/[slug]— Strategy, SEO, Content, Analytics, AI Enablement, Websites/academy/academy/programmes(+[slug])/academy/workshops/academy/resources/sectors+/sectors/[slug]— Space, Sustainability, Future Technology, Manufacturing, Public Sector, Mission-led/work+/work/[slug]— case studies/insights+/insights/[slug]+/insights/rss.xml/events+/events/[slug](Space Impact Forum, Leicester Space Week)/resources+/resources/[slug]
Every collection lives under src/content/<name>/ and is validated by a Zod
schema in src/content.config.ts: insights, case-studies, programmes,
workshops, resources, events, reports, team, authors (JSON),
testimonials (JSON). Add a new Markdown/JSON file and it's automatically
picked up — no code changes required for new entries.
src/components/seo/SEO.astro auto-generates canonical URLs, Open Graph,
Twitter Cards, and JSON-LD (Organization site-wide; Article, Event, FAQPage,
BreadcrumbList, Service as needed per page) via helpers in src/lib/schema.ts.
A sitemap and an Insights RSS feed are generated at build time.
src/pages/api/ is reserved for future endpoints (contact handling, dynamic
OG images, and eventually HubSpot / MailerLite / Luma / Ticket Tailor /
Notion / Airtable / Supabase / Cloudflare Workers integrations). The contact
form (src/components/forms/ContactForm.astro) already posts to a
configurable PUBLIC_CONTACT_ENDPOINT so a Worker or third-party form
handler can be dropped in without touching the frontend.
deploy.yml— build and deploy to GitHub Pages (swap for Cloudflare Pages/Workers as needed)lighthouse.yml,links.yml,spellcheck.yml,formatting.yml— quality gates on PRs
This repository has been validated end-to-end in a clean environment:
npm install— succeedsnpm run build— 35 pages build with 0 errors, sitemap and RSS generatednpx astro check— 0 type errors, 0 warningsnpx biome check .— 0 lint/format errors
- The original stub tree placed
pages/,data/,lib/,styles/andtypes/at the repo root; they've been moved undersrc/since Astro requires this by default. components/navigation,components/footerandcomponents/herofrom the original tree have been consolidated intocomponents/layout/Header.astro,components/layout/Footer.astroandcomponents/sections/Hero.astro— fewer, more reusable pieces rather than one-off per-section folders.src/pages/api/og.tsis a static SVG placeholder for now; swap insatori/resvg(or a Cloudflare Worker) if true per-request dynamic OG images are needed later — that requires a server/hybrid adapter.