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.
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.
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.
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-codeshttps://mru.space. Replace the file in place to update it./assets/readme/mru-github-dark.gifand-light.gif: used by every mruspace README./assets/readme/profile-*.pngandblank.png: the github.com/mruspace profile card. Editscripts/readme/profile.json, then runnpm run readme.npm run check:readmefails 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
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.
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 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.
# 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)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.
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/.
- 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.spaceare trademarks of Binns Pte. Ltd. and are not covered by these licenses. See TRADEMARK.md.
© Binns Pte. Ltd.