
Our community site, engineeringleaders.io, ran on Wix for years, and for most of that time Wix was the right call: a community team has better things to do than review CSS. It became the wrong call the moment we cared about speed, search, and owning our own markup.
So I put a coding agent on it. Eight active days, 118 commits, and on 4 August 2026 the domain flipped from Wix to Astro on Cloudflare Workers. You are welcome to inspect the result; it’s the site that’s live right now, in English and Czech.
The headline numbers came after: mobile PageSpeed 78 → 96, LCP 3.8 s → 2.4 s, CLS 0, and a PageSpeed Insights re-run on 8 November 2026 returned the same 96, 2.4 s and 0. The biggest win was a boring media pass. The first audit after cutover weighed the homepage at 39.7 MB, because six decorative gradient PNGs skipped Astro’s image pipeline; one of them went from 7.66 MB to 460 KB. The hero video was the LCP element, so it now loads after the page does and a 24 KB poster takes its place.
But the part worth writing about is what the agent got wrong, because that list is what you’ll need if you try this yourself.
Measuring beats looking
The naive way to clone a site is screenshots: render both, diff, iterate. It fails slowly, because a screenshot tells you something is off without telling you which of the forty CSS properties involved is the guilty one.

What worked is code-first. The agent reads the live page’s rendered DOM and computed styles per section and rebuilds from those numbers.

Fonts made the case on day one. A raw-HTML scan said
the site used Helvetica Neue and Poppins, and I had already accepted the licensing risk of
buying Helvetica. Then getComputedStyle across every rendered element found zero elements
using either font. Wix ships 56 unused @font-face rules on every site; the fonts that
painted were Inter and Lora, free to self-host, extracted from Wix’s own CDN. The markup lied
and the measurement saved real money.
Animations, same story. The plan estimated “350+ motion directives” from the markup.
document.getAnimations() found 152 real animation objects, and 49 of them were the identical
1200 ms opacity fade. A separate scroll-delta check across 55 elements ruled out parallax
entirely. We rebuilt what runs, not what the attributes claimed.
The 9 bugs my review found anyway
Three automated verification passes ran before I looked: a side-by-side scroll-through, a typography audit across six computed properties per text role, and the animation extraction.

My own pass still found 9 real gaps. Four were one-off misses; these five are the recurring patterns worth stealing as checks:
- A carousel flattened into a static grid, because its arrows only exist on hover and a static DOM scan reported “no controls.”
- Speaker photos cropped into circles where the original used landscape pills.
- A strikethrough price missing its
line-through, same colour, wrong meaning. - A heading constrained to 760 px that should have been 960 px, from reusing a sibling’s measured width.
- A background that was a real
<img>gold gradient, not CSS, and so never got rebuilt.
Every one of those became a named check in the playbook. That’s the part I’d defend hardest: a migration method is worth exactly as much as its documented list of prior failures.
The part your agent can’t decide
An agent can rebuild a site. It cannot decide when your live domain flips, and it shouldn’t. The run kept three hard lines for all 8 days:
- Production canonicals in the markup from day one, so cutover needed zero edits.
- A noindex staging domain, so the rebuild couldn’t compete with the live site in search.
- A staged, reversible cutover: a 76-rule redirect map covering all 32 old Wix event slugs, and the Wix subscription kept paid as the rollback plan.
One postscript that surprised me most: weeks after cutover, an AI-visibility audit showed the domain was erroring on 54% of requests from AI crawlers (ChatGPT, Perplexity and friends) while robots.txt politely allowed all of them. The file is policy; the edge is law. We fixed the edge, re-ran the crawler matrix to all-200, and that check is now part of the method too.
A second migration, elc-conference.io, scored 100/100/100 on Lighthouse and still had ten section-level gaps when we compared it with the original in October: a missing 40-photo gallery, a missing venue map, a logo wall with four columns instead of five. The playbook now has a motion probe that lists every element moving on scroll, and a section-by-section parity check.
The whole playbook is public and MIT licensed, verification passes and cutover checklist included: github.com/marian-kamenistak/wix-to-astro. It sits with the rest of my agent-run tools on the AI coaching tools page.
If your company site is stuck on a page builder and the blocker is “we don’t have frontend capacity,” that blocker is smaller than it was a year ago.


