Skip to content
mruspacePublic

Repository files navigation

Mru

mru.space

The website for Mru: fault-tolerant software for systems that cannot be easily maintained or repaired, on Earth and in space. Static HTML built with Astro, served by GitHub Pages at https://mru.space. The documentation is a separate site, docs.mru.space, from mruspace/docs. The brand files (mark, lockup, colors, animations) are in mruspace/brand, shown at /brand/.

Systems that still run a thousand years after we're gone.

Questions, typos, ideas: contact@mru.space.

Build and check

Needs Node 22.12 or later.

npm ci
npm run dev          # http://localhost:4321
npm run build        # dist/: pages, share cards, Markdown twins, llms.txt, sitemap
npm run check        # everything CI runs (below)

npm run check runs, in order: astro check, ESLint and Prettier, the build (which fails on bad metadata or JSON-LD), html-validate on every page, the link checker, Playwright (every route at 390, 768, 1440 and 1920 px, light and dark, plus axe-core, the form and the quorum demo), Lighthouse CI, and the Worker's tests. Playwright needs npx playwright install chromium once.

Layout

src/pages/        routes (one folder per URL)
src/components/   header, footer, form, plates, seams, descent line, quorum demo
src/layouts/      the page shell: head tags, JSON-LD, analytics
src/data/         one source per fact: metadata.json (titles, descriptions,
                  JSON-LD types), use-cases.json, images.json, nav, quorum states
src/content/      research entries (MDX) and the Terms text (kept verbatim)
src/styles/       mru.css (the design system), fonts.css, site.css
public/           files served as-is at stable URLs (see below)
scripts/          share cards, Markdown twins and llms files, checks, fonts
tests/            Playwright and axe-core
worker/           the request-information Worker (api.mru.space/request)

Page copy is final and ported verbatim from the approved design. Content that repeats (use cases, photos, metadata, the quorum demo) lives in src/data/, so the pages, the Markdown twins, llms.txt, JSON-LD and the share cards all read the same source.

Stable URLs

These must keep working, byte for byte where they are files. They live in public/ and are copied unchanged:

  • /mru-whitepaper.pdf: the PDF hard-codes https://mru.space. Replace the file in place to update it.
  • /assets/readme/mru-github-dark.gif and -light.gif: used by every mruspace README.
  • /assets/readme/profile-*.png and blank.png: the github.com/mruspace profile card. Edit scripts/readme/profile.json, then run npm run readme. npm run check:readme fails when the PNGs are stale or a public repo is missing from the card.
  • /favicon.ico, /favicon.svg, /assets/favicon-light.png, /assets/favicon-dark.png, /apple-touch-icon.png, /site.webmanifest, /assets/og-image.png
  • /assets/mru.gif, /assets/mru-light.gif, /assets/mru.mp4, /assets/mru-light.mp4, and the header copies /assets/mru-96.gif, /assets/mru-light-96.gif, /assets/mru-144.gif, /assets/mru-light-144.gif
  • /terms/, CNAME (mru.space), .nojekyll

The animated mark

GIF has no alpha channel, so each frame ships on a flat backdrop and the page blends it away: the light art multiplies on paper, the dark art screens on ink. Anything that gives .mark-anim, or an element above it, its own stacking context (transform, filter, opacity, z-index) breaks the blend. The header and footer load 96 px and 144 px copies (about 125 KB and 230 KB, sharp at 2x and 3x) with the HTML, so the mark shows with the text; the 600 px originals (about 2 MB) load lazily where a page shows the mark large. With reduced motion or without JavaScript, the static SVG mark shows instead.

Search and AI crawlers

Every page has a title, description, canonical, Open Graph and Twitter tags, a share card (/og/<route>.png) and one JSON-LD graph, all from src/data/metadata.json. Every indexable page has a Markdown twin at <route>/index.md; /llms.txt and /llms-full.txt list and join them. robots.txt allows search engines and AI crawlers.

The request form

The form posts to the Worker in worker/, which checks the request (origin, rate limit, honeypot, Cloudflare Turnstile, fields) and emails contact@mru.space through Resend. Without JavaScript the form still posts and the Worker redirects to /contact/sent/. See worker/README.md. No secrets are in this repository.

Regenerating assets

# Fonts (WOFF2 subsets in public/fonts/; needs fonttools and brotli)
python3 scripts/fonts/build_fonts.py

# From public/: favicons and PWA icons, the OG image, the animated mark,
# README copies of the mark (needs ImageMagick, ffmpeg, gifsicle)
cd public
./assets/_gen_icons.sh
magick -background none assets/og-source.svg assets/og-image.png
./assets/_gen_logo_anim.py trace both
(cd assets && ./_gen_readme_gifs.sh)

Visual review

scripts/compare.mjs captures each page next to its design artboard at 390, 1440 and 1920 px in both themes, and scripts/review-page.mjs builds a side-by-side review page from the results.

Deployment

Merges to main build and publish to GitHub Pages with .github/workflows/deploy.yml. Pull requests run npm run check. The Worker deploys separately with npx wrangler deploy from worker/.

License

  • Site code: Apache License 2.0.
  • Content (the whitepaper and site copy): CC BY 4.0.
  • Photos: their own free licenses, listed on /credits/ and in src/data/images.json.
  • Fonts in public/fonts/: SIL Open Font License 1.1 (license files alongside).
  • The Mru name, logo and mru.space are trademarks of Binns Pte. Ltd. and are not covered by these licenses. See TRADEMARK.md.

© Binns Pte. Ltd.

Contributors

Languages