Skip to content
Matic Korošec

Blog · 15 July 2026 · Work

Rebuilding this site: WordPress → Astro migration

The site you’re reading just got rebuilt from scratch. The old one was WordPress from 2018 - it no longer reflected my latest areas of focus and its benchmarks were not acceptable in this day and age: my job is making backends fast and my own homepage needed a caching plugin to feel alive.

The new homepage

Goals

Not many, but strict:

  • Static files only. No CMS, no database, no login to hack.
  • As fast as tailscale.com (opens in a new tab). That was the literal benchmark.
  • No dead ends. Every old WordPress URL still lands somewhere sensible.
  • English only. The Slovenian half was maintenance debt, not a feature.
  • Accessibility tested, not assumed. WCAG 2.1 AA.
  • A privacy policy you can actually read, with analytics that stay off until you say yes.

The benchmarks

The old site’s job here is to be the baseline. Both measurements are public PageSpeed Insights runs against live production: the old site (opens in a new tab) captured just before the cutover and the new one (opens in a new tab) right after, same domain behind the same Cloudflare. The figure shows the desktop run.

Performance
94to100
Accessibility
82to100
Best practices
81to100
SEO
92to100
Largest Contentful Paint
old site1.5 s
new site0.5 s
First Contentful Paint
old site0.8 s
new site0.3 s
Speed Index
old site1.0 s
new site0.4 s
PageSpeed Insights · desktop · live production · Jul 2026

Mobile is the harsher test - throttled network, mid-range phone - and the story holds: performance went from 62 to 98, LCP from 9.9 s down to 2.3 s and Speed Index from 7.5 s to 2.4 s. Layout shift is 0 and total blocking time is 0 ms on both form factors - there is no JavaScript worth blocking on.

The gap is not mysterious. The 2018 homepage shipped 14 stylesheets and 20 script files: Bootstrap, jQuery plus its migration shim, a parallax library, a typing-effect library, a lightbox, 2 icon fonts and 2 Google font families. This site ships 1 stylesheet per page and the heaviest asset on any page is an 85 KB font file. The old site needed a caching plugin to feel alive; this one has nothing left to cache around.

The rows I watch closest are not the speed ones: accessibility went from 82 to 100 and best practices from 81 to 100. Tested, not assumed - it was on the goals list.

The stack

Astro builds the whole thing to plain HTML. The default is zero JavaScript shipped to the browser and the site mostly keeps it that way. The exceptions are deliberate and small: the cookie-consent logic, the Turnstile check that guards my email address from scrapers and a couple of KB that animate the signals flowing through the home page’s system diagram. That diagram is plain SVG and renders fine with the script off; the script only adds the motion. The rest is HTML, CSS and SVG.

Tailwind v4 for styling, with the design tokens defined once in CSS custom properties. Inter for everything - the same font Tailscale uses - with small uppercase tracking doing the work that a second font usually does. Blog posts are Markdown files in the repo; git log is the CMS.

Redirects were an inventory job: every old WordPress URL - around 35, plus the whole abandoned /sl/ tree - maps to a sensible new home, served as a real Apache 301. Nothing a decade of bookmarks or backlinks points at hits a 404.

The AI part

Much of this rebuild happened with Claude as a pair: scaffolding, the design system, the redirect inventory, the privacy policy, this post’s first draft. I stayed the architect; Claude did the heavy lifting.

Three habits from that process worth stealing:

  1. Design review as an adversarial step. One agent critiqued the site like a design director in a real browser, another scanned for “AI-generated” tells. It scored 30/40 and caught things I’d have missed - numbered section labels, copy leaning on em-dashes the way models do. Both fixed.
  2. Verify with eyes, not vibes. Every change got screenshotted at phone, tablet and desktop widths before it counted as done. Reading the code missed layout bugs that a single glance caught.
  3. Spend tokens on thinking, not reading. Serena for semantic code navigation, graphify for an AST map the agent queries instead of grepping, rtk to trim routine command output. Less noise in, better judgment out.

Same workflow I bring to client work: AI for speed, 13 yrs of production scars for judgment. Architecture, security and the final calls stay human.

The code lives in a private repo, but if you’re curious about any specific part - the redirect setup, the Turnstile email gate, the consent-gated analytics - ask me. Happy to share the details.

← back to blog