Why I moved client marketing sites from Next.js to Astro
Next.js is a great app framework but overkill for brochure sites. Astro ships less JavaScript by default, and clients notice the difference.
For years my default answer to “we need a marketing site” was Next.js, because it was my default answer to everything. Then I rebuilt one client’s site in Astro as an experiment, and the Lighthouse comparison was embarrassing for the Next.js version.
Zero JavaScript is a feature
A marketing site is mostly text and images. Astro renders it to plain HTML and ships no framework runtime unless a component explicitly asks for one. The interactive bits (a carousel, a pricing toggle) become islands that hydrate independently.
The practical result: the Next.js version shipped 87KB of JavaScript to render a page with one interactive element. The Astro version shipped 4KB.
Content collections earn their keep
What sold me for client work wasn’t performance, it was the content model. Collections give you typed, validated markdown:
const blog = defineCollection({
loader: glob({ pattern: '**/*.md', base: './src/content/blog' }),
schema: z.object({
title: z.string(),
pubDate: z.coerce.date(),
}),
});
When a client editor forgets a required field, the build fails with a readable error instead of producing a blank page in production.
Where I still use Next.js
Anything behind a login. Real apps with mutations, sessions and per-user data are exactly what Next.js is for. The rule of thumb I give clients:
If your users visit it, Astro. If your users log into it, Next.js.