A framework for building several static sites that stay separate in content and in looks, on top of one technical core. This site is one of them; FreeOrbit.eu and Libernetics.eu are built from the same repository.
Two things hold it together. The first is that only infrastructure is shared – the build, the checks, the deployment. Identity, navigation, components and content stay with each site and must not drift into one another, because a visitor should see separate sites, not one portal with three tabs. The second is that the output is still just a static site: finished HTML, CSS, JavaScript and assets that a web server hands out with no application server, no database and no Node.js in production.
Moving on from Jekyll
I built static sites in Jekyll before this. The “template plus Markdown” model works there and is still enough for plenty of sites; this is a deliberate move elsewhere, not a repair of something broken.
I wanted to find out where static sites have moved. What a site built from components rather than templates can do now, how far the build tooling has come, and how much can be watched automatically – so that content validation, accessibility or security rules are not something a person has to remember on every change.
What the framework provides
- Static export through
adapter-staticwith full prerendering and no SPA fallback. Every page exists as a file. - Content in Markdown with a validated frontmatter. The schema is written down, so an unknown field, a missing translation or a link to an item that does not exist fails the build rather than the reader.
- Checks up front: lint, type checking, tests and content validation run on every commit, and CI calls the same target so the two cannot drift apart.
- Accessibility, contrast and performance budgets as automated gates over the finished artifact, not as a review afterwards.
- Security: a same-origin Content Security Policy without
unsafe-inline, and a check of the finished build for sourcemaps, internal paths, secret shapes and foreign origins. - Search through Pagefind, which runs at build time over the finished HTML. Production stays static; the index is just another file.
- Deployment as a pull: the server fetches the release from a registry, verifies the checksum, checks the build-complete marker and switches a symlink atomically. No write channel and no deploy key lead into the server.
Adding another site means adding a workspace. The checks, tests, gates and deployment are already there.
How it is built
Every decision about a shared contract has its own ADR, and the implementation has to be traceable back to it. Rules that apply in more than one place do not live in someone's head but in a registry with a machine check: runtime versions, where the gates run, the available content fields, the displayed version numbers. When two records of the same thing diverge, the lint fails – not the site.