I moved my portfolio from Gatsby to Astro and then did the same with the Virya website. The obvious result was speed, but the thing I liked most was predictability. Mobile Lighthouse measurements that used to wander around settled close to one second, while desktop LCP became consistently tiny.
Static was the clue
Both sites are mostly static, which was the clue I should probably have listened to earlier.
Why hydrate a paragraph?
Gatsby made every heading, paragraph and image part of a React application, even when none of them needed to do anything after appearing on screen. Astro starts from the opposite assumption: HTML first, JavaScript only when I explicitly ask for it. That fits a portfolio and a band site much better.
The migration was mostly deletion
The migration itself was not heroic. I kept the JSON content, routes and images, rewrote static components as .astro files and then looked at every remaining interactive part with one question: why does this need hydration?
Hydrate only what moves
Some components had a good answer. Merch, forms, live events, Signal, AREA and staff tools obviously need state. Others did not. The hero text and scroll-to-top control became small browser scripts. Components below the fold load only when visible or idle. Video no longer competes with the first paint simply because it exists.
Preact helped. Visibility helped more.
Switching compatible islands to Preact removed roughly 37 kB of JavaScript per page at the time. The bigger win was not the number itself, but seeing exactly where client code still lived and why.
Virya needed stronger boundaries
Virya was the more interesting migration because the site now contains Stripe checkout, InPost, multilingual pages, a browser field game, fan accounts and a Rust backend behind it. I kept the public pages static-first and moved trusted work to server routes. Admin keys never enter browser JavaScript, and a slow external service does not get to hold the entire site hostage.
The boring optimisation won
Both sites still reach 100 in the Lighthouse categories I track. Astro helped, of course, but the real optimisation was much less magical: ship static HTML, hydrate only the few things that move and delete framework code where plain web technology is enough.
The fastest JavaScript remains the JavaScript I finally admitted I did not need.