What your site is actually built on.
Versions, not adjectives. Every line below is checkable against the project file of this very site, and this page runs on exactly what it describes.
The site itself
- Next 16.3
- The React framework. Set to output: export, so the whole site compiles down to plain files. There is no process serving your pages and nothing to fall over at three in the morning.
- React 19.2
- The interface layer. The calculator, the steppers and the forms are real components with their own state, not scripts glued onto a page.
- TypeScript 5.9, strict
- Every value is typed. Most of what would become a bug on a live site becomes a build error instead.
- Utopia fluid scale
- Type and spacing are computed from four numbers by formula, not picked by eye. That is why the rhythm holds at 390 px and at 2560 px without a pile of breakpoints.
- A twelve-column grid
- One grid for the whole site: every block declares how many columns it takes instead of laying itself out its own way.
Things the browser now does itself
Each of these replaced a library that used to be shipped to your visitors. The page is faster because there is less of it, not because something was optimised afterwards.
- View Transitions
- Pages cross-fade into each other instead of blinking white. This used to require turning the whole site into a single-page app; now the browser does it across separate files.
- Scroll-driven animation
- Sections rise into place on the compositor thread. No scroll listener, so the motion does not stutter while the main thread is busy.
- The Popover API
- Panels open above everything, close on Escape and on a click outside, and return focus where it was. This used to be three handlers and a bug about focus.
- Speculation Rules
- The next page is prepared before the click lands, so navigation is effectively instant.
- content-visibility
- A long page skips laying out what is off screen, which is most of the work of the first paint.
- prefers-reduced-motion
- One media query switches all of the above off for people whose system asks for it. Not an afterthought: it sits in the same files.
The part that receives your enquiries
- Bun 1.3
- The enquiry service runs on Bun rather than Node. One event loop, no framework, and no dependency tree to audit.
- SQLite in WAL mode
- Enquiries land in a file-backed database through prepared statements. Reads never wait on writes.
- Telegram delivery
- The message reaches you where you already are. If Telegram is down the enquiry is already saved, so nothing is lost.
- Rate limit and honeypot
- Five submissions a minute per address, plus a field invisible to people that only robots fill in.
- nginx with TLS
- Certificates from Let us Encrypt renew themselves. The service itself listens on the loopback interface only and cannot be reached from outside.
What gets checked before handover
Every colour pair goes through the WCAG formula before it ships. Body text never sits below 4.5:1.
Real headings, real labels on fields, a visible focus ring. Everything is reachable from the keyboard.
Checked at 390, 768, 1440 and 2560 px. No horizontal scrolling anywhere, verified by script rather than by eye.
Plain files behind nginx. Small sites usually go down because of a database or a plugin, and there is neither.
And what it is not
- This is more than your site needs
- A five-section site requires none of this. It is here because it costs nothing extra once it is known, and because you asked what it runs on.
- No page builder
- You cannot drag blocks around after handover. Text and photographs you change yourself; structural changes come back to me.
- No content management system
- No WordPress means no plugin updates and no security patches. It also means no admin login when you want one.
Same stack, your site
600 €, three days, first screen free and first. If you want to go through any of this in detail before deciding, ask.