This site runs on Astro 6, TypeScript, vanilla CSS with Open Props tokens, and Cloudflare Pages. There is no React runtime on content pages, no Tailwind, no CMS, and no third-party analytics script. The choices are not unusual because unusual is good; they are unusual only where the defaults would have added weight, lock-in, or noise.
Why Astro
Astro is a static site framework that outputs plain HTML by default. No JavaScript ships to the browser unless a specific component genuinely needs it. For a content-led business site — articles, product pages, pricing, services — that is exactly the right default.
We considered Next.js briefly. It is a good framework for applications, but it brings React’s runtime to every page and assumes you want server-side rendering or client-side hydration as the baseline. For a site that is mostly text and links, that machinery adds weight without benefit.
Astro’s content collections let us define typed schemas for articles, validate frontmatter at build time, and generate pages from Markdown and MDX files. The build takes under two seconds.
Why vanilla CSS over Tailwind
Tailwind is popular and productive. We did not use it because we wanted the CSS to be readable as a source document, not as a stream of utility abbreviations. When a component’s style is written as scoped CSS with named properties, anyone reading the code — including the person who wrote it six months later — can follow the intent without a reference card.
We use Open Props for baseline design tokens: spacing, radii, shadows, easing curves. Our own CSS variables sit on top for brand-specific colours, type sizes, and weights. The result is a lightweight system that is portable and does not depend on a build plugin or framework convention.
The trade-off is real: Tailwind is faster for prototyping and enforces consistency through constraints. Vanilla CSS requires discipline. We are willing to pay that cost because the source stays legible and the output stays small.
Why self-hosted fonts
This site uses Equity B (serif) for article body text, Concourse (sans-serif) for headings and product pages, and Space Mono for code and metadata. All are served from the same origin — no requests go to Google Fonts or any external CDN.
Self-hosting fonts removes a third-party network request. That means one fewer DNS lookup, no referrer or user-agent data sent to Google’s servers, and no render-blocking cross-origin fetch. German courts have ruled that embedding Google Fonts without consent violates GDPR. Whether or not you agree with the interpretation, the simplest compliance path is to serve fonts yourself.
The cost is minimal: download the font files once, configure them in your build, and update manually if the typeface changes. For most sites, the fonts never change.
Why Cloudflare Pages
Cloudflare Pages is a static hosting service with global edge distribution, automatic HTTPS, and straightforward deployment from a Git repository. We use it because it works well for static sites and costs nothing at our scale.
We are not making an ideological claim about Cloudflare. It is a US-based company, and routing European traffic through their network is a pragmatic choice, not a sovereignty statement. If and when running on a European provider like Hetzner with Caddy makes operational sense, we can move. The site is static HTML — hosting is portable.
What we skipped
A CMS. Articles are MDX files in a Git repository. There is no external content service, no API calls at build time, no vendor dependency for publishing. This keeps the content portable and the build fast.
Third-party forms. The contact page is a direct email link. No form service, no embed, no vendor dependency for something as simple as reaching a person.
Client-side frameworks everywhere. Solid.js is available as an Astro integration for pages that need real interactivity — site search uses it. But shared layouts, navigation, articles, and product pages are static Astro components. No hydration, no bundle, no loading spinners.
Google Analytics. We use Plausible instead — lightweight, private, no consent banner needed.
How articles are written
Articles are authored in SEML using Semnote and published through its export-to-web pipeline. The content lives in a Git repository — version-controlled, portable, and independent of any external content service.
The result
The full site builds in under two seconds, ships zero JavaScript on most pages, loads no third-party resources, and costs nothing to host. Every page is a static HTML file. The source is readable, typed, and version-controlled.
If you are building a business site and want the same approach, Leanersoft’s services cover exactly this kind of work. If you are interested in the document tool that powers the publishing, Semnote is free to try.