01 · The challenge
Our previous site was a WordPress block theme with a plugin of custom blocks, Google Analytics and the usual stack of updates to keep on top of. It worked, but it said little about what we actually do today, Google Analytics set cookies on every visit, and it was a CMS to patch for a site that changes a few times a month.
We wanted what we recommend to clients whose site is mostly content: static pages that load instantly, nothing to update every week, and content in plain files under version control. The move also had to keep everything the old site had earned in search. Every URL Google knew about had to keep working.
02 · The solution
We rebuilt the site on Astro 7 and Tailwind CSS 4. Every page is generated as static HTML at build time. The only code that runs on the server is the contact form endpoint, which validates input, filters bots and sends the message through our own mail server. Case studies and blog posts are MDX files in the repository. Adding a project means adding a file, and every change goes through Git.
Images go through Astro’s pipeline, which produces responsive WebP sizes with fixed dimensions, so nothing jumps while the page loads. Fonts are self-hosted and nothing loads from Google or any other third party, so there is no cookie banner because there are no cookies.
The old WordPress URLs answer with permanent redirects to their new addresses, including the blog posts that already had search traffic. Titles, canonical URLs, the sitemap and structured data (organisation, breadcrumbs, articles) are generated from the same content files, so they cannot drift out of sync.
The site runs in a Docker container on our own EU server, deployed with Coolify. Every push to the main branch is a deploy.
Built with AI, reviewed by a person
We built the site together with Claude Code, Anthropic’s AI coding agent. It wrote much of the code from our direction: the layouts, the content collections, the contact endpoint and the redirects. It also ran the builds and checked every page before a deploy. It helped track down two deployment problems that would have silently broken the site in production: a health check that failed on IPv6 and a form that the framework’s origin check rejected behind the proxy.
The decisions stayed with us: what the site says, how it looks, what we charge and which trade-offs are acceptable. Every change was reviewed before it went live. That split is why the whole move took eight days instead of several weeks, and it is how we now work on client projects too.
03 · The result
The first commit was on 15 September 2026, and the site went live on timis.digital on 23 September. We measured the homepage of both versions on the same day, from the same machine, in Chrome with the cache disabled. Desktop figures are the median of three runs; the mobile run used a 4× CPU slowdown and a 1.6 Mbps connection. The two versions also run on different servers, so part of the time-to-first-byte gap is hosting.
| WordPress | Astro | |
|---|---|---|
| Page weight | 323 KB | 120 KB |
| Requests | 18 | 10 |
| JavaScript files | 7 | 0 |
| Third-party hosts | 2 (Google) | 0 |
| Cookies | 2 | 0 |
| Time to first byte | 555 ms | 109 ms |
| Largest Contentful Paint, desktop | 652 ms | 236 ms |
| Largest Contentful Paint, throttled mobile | 1.87 s | 1.07 s |
There is nothing left to update every week: no core, no plugins, no database. Links to the old blog posts and pages still land on the right place through the redirects, and the site is ready for a Croatian version and new service pages without touching the stack.
If your site is mostly content and WordPress has become the part you maintain rather than use, we can do the same move for you: a static or headless site, your URLs kept, your team editing in files or a headless CMS. Tell us about your site or see what a static site costs.