Skip to content

Repository files navigation

Impact Orbit

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.

Stack

  • 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, sharp for images

Getting started

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.

Architecture

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

Information architecture

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]

Content collections

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.

SEO

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.

Future integrations

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.

CI

  • 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

Validation status

This repository has been validated end-to-end in a clean environment:

  • npm install — succeeds
  • npm run build — 35 pages build with 0 errors, sitemap and RSS generated
  • npx astro check — 0 type errors, 0 warnings
  • npx biome check . — 0 lint/format errors

Notes on this scaffold

  • The original stub tree placed pages/, data/, lib/, styles/ and types/ at the repo root; they've been moved under src/ since Astro requires this by default.
  • components/navigation, components/footer and components/hero from the original tree have been consolidated into components/layout/Header.astro, components/layout/Footer.astro and components/sections/Hero.astro — fewer, more reusable pieces rather than one-off per-section folders.
  • src/pages/api/og.ts is a static SVG placeholder for now; swap in satori/resvg (or a Cloudflare Worker) if true per-request dynamic OG images are needed later — that requires a server/hybrid adapter.

Releases

Packages

Used by

Contributors

Languages