Back to Website Growth Insights
Engineering Notes

Astro or Next.js for a business website?

I build with both frameworks and the choice comes down to one question: is this still a website, or a tool people use? Here's the rule, what each vendor's documentation says about JavaScript, and what my own two sites send on first load.

9 min read
Share

I build with both, and the choice comes down to one question: is this still a website, or a tool people use? Astro suits a site that explains the business and brings in enquiries. Next.js suits a site that's turning into a product. I measured my own two sites on 25 October 2026 and again on 5 November, and the framework turned out to decide only part of what a page sends on first load.

How I choose

The one question I ask first

Before I pick anything, I ask whether the site's main job is to explain the business and bring in enquiries, or whether we're building a tool that people use. Then I sort the project.

  • A site that explains the business and brings in enquiries: Astro. For a service business that's most of it, which means a home page, pages for each service and area, case studies and articles, and a contact flow. Astro sends no JavaScript, the code that runs in the visitor's browser, by default. Where a particular function needs some, I add it.
  • A website that's turning into a product, with user accounts, dashboards, personalised content, payments, complicated bookings, live data or permissions: Next.js. A form doesn't count, and neither does some animation or a content system, because Astro handles all of those. The line is when the complexity is persistent and connected, where users, data, rules and behaviour depend on each other.
  • Something that isn't a custom website problem: neither. Someone says they need an AI platform and what they need is a booking flow, some CRM automation or a quick way to test an idea. I'd use the simplest thing that works reliably.
Remember this

What I'd say to a client

You don't need to load an application before someone can understand what you do or get in touch.

Where I stop

When I say no to the build

The sort has one more outcome, which is no build at all. I'll turn down a project with no clear business outcome, nobody who owns the content and no plan for maintenance. You can make something technically impressive that turns into a very expensive abandoned project. The technology has to earn its place.

The video

The same rule, in five minutes

I made a short video on this question. It covers the one question I ask first, when I pick Astro, Next.js or neither, and the tests on my own two sites.

The video uses figures from 20 October 2026, before I changed how the Astro site serves its images. Two of its claims no longer hold on the later figures, and the section called What this does and doesn't show says which.

Chapters
  1. 0:00How I choose
  2. 0:19When I reach for Astro
  3. 0:53When I reach for Next.js
  4. 1:23When I pick neither
  5. 1:56Testing my own two sites
  6. 3:01Why the Astro score swings
  7. 3:49What a crawler gets
  8. 4:12What people get wrong
The measurements

What my own two sites send on first load

Both vendors' documentation points at less JavaScript in the browser. Astro's documentation lists "Zero JS, by default" as a feature. Next.js's documentation says layouts and pages are Server Components by default, which are parts of the page built on the server instead of in the visitor's browser, and it gives reducing the JavaScript sent to the browser as a reason to use them. I read both pages again on 5 November 2026. What a finished site sends depends on what gets added after that, which is why I measured.

Both sites are mine. Rod Fernandez Design is built on Next.js. Zeta Hybrid Tech, my experimental site, is built on Astro, and both are hosted on Netlify. I ran Google PageSpeed Insights on mobile on 25 October 2026 and again on 5 November 2026, each time in two sets of three runs, about three minutes apart within a set and about ten minutes between the sets, and I also ran desktop once on each day. Each figure is the median of three runs, which means the middle one when the three are put in order. The tests load a page once without scrolling, so they measure what comes down on first load. The Astro site changed between the two tests, and the next section covers how.

MeasureNext.js - Rod Fernandez DesignAstro - Zeta Hybrid Tech
Mobile score out of 100, first set and second set, 25 October93 and 9389 and 85
Mobile score out of 100, first set and second set, 5 November95 and 9691 and 95
Desktop score, first set, 25 October and 5 November99 and 9795 and 95
JavaScript downloaded, mobile, 25 October and 5 November200 and 199 KiB52 and 53 KiB
Total page weight on first load, mobile, 25 October and 5 November472 and 473 KiB3,491 and 509 KiB
Of that, images, 25 October and 5 November80 and 80 KiB3,342 and 357 KiB
Largest Contentful Paint, mobile, first set, 25 October and 5 November2.6 s and 1.8 s2.9 s and 1.3 s

Google PageSpeed Insights API, run from a server rather than my laptop, on 25 October and 5 November 2026. Each row was worked out on its own. The JavaScript, page weight and desktop rows are from the first set on each day, and the images row is from the second set, the only set that recorded images. Individual mobile scores on 5 November, first set: Next.js 98, 90, 95; Astro 92, 71, 91. Second set: Next.js 93, 96, 98; Astro 95, 79, 96. In the two Astro runs that scored 71 and 79 the page also made requests to other websites (in the second set, Google and Microsoft Clarity analytics), and JavaScript was 230 and 257 KiB; in the other four it was 53 KiB. Page weight was 509 KiB or less in those four and 687 and 713 KiB in the two. KiB is a kibibyte, about a thousand bytes. Largest Contentful Paint is how long the biggest thing on screen takes to appear.

Reading it

How I read the numbers

On 25 October, read the JavaScript row alone and Astro sent about a quarter as many bytes: 52 KiB against 200 KiB. Read the weight row and it flipped. The Astro page was the heavier one by a long way, 3,491 KiB against 472 KiB, and images made up 3,342 KiB of it. That was the design: big images, and scroll animation.

The Astro site's 52 KiB was mostly one page script of about 46 KiB, which is the GSAP animation library with its scroll plugin plus the code that drives the animations. The rest was a small script of about 2 KiB and two analytics files of about 2 KiB each. I added the animation library and the analytics on purpose. That's what Astro's no-JavaScript default came to on that site. I haven't split the Next.js site's 200 KiB into what's React, the code library Next.js is built on, and what's my own code, so I can't say how much a different build would save.

Then I changed how the Astro site serves its images. On 1 and 2 November I made smaller copies for smaller screens, and set the images below the first screen to load as a visitor scrolls to them. On 5 November the same page fetched 3 images totalling 357 KiB, against 13 images and 3,342 KiB on 25 October, and the total came to 509 KiB. The test loads a page once without scrolling, so that's the cost of the first load, not of a whole visit. The JavaScript hadn't moved, at 53 KiB, and the Next.js site had barely changed, at 473 KiB. The first load lost about 2,980 KiB, and almost all of it was images.

So I wouldn't read this as Astro against Next.js. My position is that the framework sets what ships by default, and what you add after that sets the rest. A framework can't make big images disappear, and on this one pair of sites that was the difference between a heavy first load and a light one.

The honest limit

What this does and doesn't show

The scores moved too, and I can't say how much of that is the images, because other changes went in between the tests as well. The Astro site's mobile scores are the least steady figures here. On 25 October the second set scored 77, 85 and 93 on the same downloads each time. On 5 November four of the six Astro runs scored 91 to 96 with 53 KiB of JavaScript. The other two, 71 and 79, were runs where the page also made requests to other websites, which took the JavaScript to 230 and 257 KiB. That doesn't explain everything. On 25 October a run that also made outside requests, with 230 KiB of JavaScript, scored 89, above a run without them at 87, and the 77 had the same downloads as the 93. The Next.js site stayed between 90 and 98 in all six. PageSpeed Insights is a lab test, and as these runs show, the same page can score differently minutes apart. That's why I look at more than one run, along with what the page downloads and what a real visitor gets, and why I'm not chasing the smallest number at the expense of the design.

Two sites aren't a benchmark. They differ in what they say, what they're for and how they're designed, so this can't tell you which framework is faster, only what each of mine sent on two days. The video I made on the same question used figures from 20 October. Its mobile scores, Next.js 95 and Astro 89, match my first-set medians (Next.js on 5 November, Astro on 25 October). Two things it says no longer hold. It puts the Astro page at about three and a half megabytes, against under half a megabyte for the Next.js site, which was true on 25 October. On 5 November the two first loads were 509 KiB and 473 KiB, within about 40 KiB of each other. And it says the Next.js site stayed between 94 and 99, where my six runs on 5 November ran from 90 to 98. I'll run the same tests again around 25 November 2026 and show what moved.

The crawler check

What a request using GPTBot's name gets

On 25 October I fetched both home pages twice, once sending the name GPTBot, which OpenAI's documentation describes as the crawler used to collect content that may train its models, and once sending an ordinary browser's. I repeated it on 5 November. Both times both sites came back as full pages of HTML, which is a page's text and structure, with the text already in it. Counting every word left once the code and tags are stripped out, that's about 1,830 words for Rod Fernandez Design and about 1,455 for Zeta Hybrid Tech, identical either way and on both days.

The limit: I sent GPTBot's name from my own machine. That shows what each site hands to a request that says it's GPTBot. It doesn't show what OpenAI's crawler receives from its own network, and I haven't measured whether the framework changes how AI tools read a site. What I look for is whether the page arrives as content, or as an empty box waiting for JavaScript to fill it.

Where to start

Where to start

If you're choosing for a project, write down what the site has to do now and in six months, then see which of the three groups above it falls into. The lightest reliable way to support both is usually the right build. If you're looking at a site you already have, open PageSpeed Insights on mobile and run it three times a few minutes apart, then compare the three scores. In Chrome's developer tools, the Network tab lists the size of each file a page downloads. How I build is on New Website Builds.

Questions

Questions local business owners usually ask next

Next step

Want me to look at your site?

The Free Website Review looks at what's working, what's getting in the way and the clearest next step for your site, regardless of whether you hire me.