Why this site has no backend

I am hired to make systems simpler to run. It would be strange to build my own site as a system that needs running.

So the constraints were fixed before the first line: cheap to host, fast on a phone in a train, impossible to break at two in the morning, and still legible in five years. Those constraints rule out a server.

The first load is about 70 KB — 6.6 KB of HTML, 9 KB of CSS, two font files. No JavaScript.

What runs

  • Astro builds static HTML. Component syntax without shipping a framework to the browser.
  • Content collections: posts are Markdown files. The build validates the front matter (title, description, date, draft flag) and generates pages and RSS from the same source.
  • Cloudflare Workers static assets: a push builds the site and publishes it to the edge. No container, no server.
  • One Worker of twelve lines turns www into a 301 to the apex; everything else it serves is a file that already existed.
  • Self-hosted fonts: no request to a font CDN, no third-party cookie.
  • Cookieless analytics: page views without a consent banner.

Why not WordPress

WordPress is the right answer far more often than developers admit. It gives editors a familiar interface, a plugin for everything, and a large pool of people who can maintain it. When five people publish content every day, a static site is the wrong tool.

For a single author with a handful of pages, though, WordPress brings a PHP runtime, a MySQL database, a login page exposed to the internet, plugins that need updating, and a hosting bill that follows. That is a second system to maintain so that I can type text into a form instead of into a file.

Why not Next.js

Next would work. It also brings a server runtime, a routing framework and build configuration for features this site does not have: no authentication, no per-request personalisation, no database. Astro ships HTML and a stylesheet — that is the entire deployment.

Why the blog is a folder

src/content/blog/en and src/content/blog/fr. Each post is a Markdown file with a header. The build turns them into pages, and a missing title fails the build instead of shipping broken metadata. No database, no admin panel, nothing to log into.

The trade-off is real: publishing means committing. That is a requirement, not an inconvenience — every article is versioned, and written as if someone will read it later.

Bilingual without a translation service

English at /, French at /fr/. Both are written by hand; nothing is machine-translated. A page declares hreflang only when the other language actually exists. Declaring an alternate that returns 404 is a common mistake, and search engines learn to ignore it.

Articles are written in one language, not both. A mediocre translation is worse than an honest gap.

When I would not do this

  • Fifty editors → WordPress or Django CMS. Editors matter more than build times.
  • Accounts, payments, permissions → a real backend, and a database.
  • Real-time collaboration → a server, and probably a queue.
  • Content that changes per visitor → server-side rendering.

The stack follows the constraint. Most sites I build for clients are not this one: they need an admin, a login, an integration, a workflow. This one needs a domain name.

What it costs

The domain, roughly eleven euros a year. Hosting nothing. Build time under a second. There is nothing to patch, nothing to monitor, and no bill that grows with traffic.

That is the point: the cheapest system is the one that does not run.

← All posts