← All notes

Why I Choose Astro for Marketing Sites

After building marketing sites with React, Next.js, and plain HTML, Astro has become my default choice. Here's why.

I’ve built marketing sites with a lot of different tools: plain HTML, Jekyll, Gatsby, Next.js, and a few CMS-backed setups. Each has its place. But for the past year, I’ve been defaulting to Astro — and I keep coming back to it.

The output is predictable

Astro ships zero JavaScript by default. The HTML you write is the HTML that ships. There’s no hydration to debug, no bundle to optimize, no runtime to reason about.

For a marketing site, this is exactly what you want. Fast first paint, no layout shift, a Lighthouse score that actually stays high after you add content.

The architecture is honest

In Astro, the separation between build-time and runtime is explicit. Islands of interactivity are opt-in. You make a deliberate choice every time you add client-side behavior, which means you make that choice thoughtfully.

This is in contrast to React-based frameworks where interactivity is the default and you have to work to avoid it. That default has a cost — in bundle size, in complexity, in things that can go wrong.

Content collections are genuinely good

For sites with blog posts, documentation, or any structured content, Astro’s content collections give you a typed, validated content layer with almost no setup. Write markdown files, define a schema, and you get type-safe frontmatter throughout your codebase.

It’s the feature that surprised me most. I expected to miss a headless CMS. I don’t.

The developer experience is clean

The .astro file format takes some adjustment. But once it clicks, it’s remarkably productive. Component logic at the top, HTML-like template below, styles scoped by default. It’s not trying to be clever. It just works.

The Vite-based dev server is fast, error messages are clear, and the documentation is excellent.

When I don’t use it

Astro is built for content-heavy, mostly-static sites. If you’re building a complex web application with rich client-side state, Astro isn’t the right tool. I reach for Next.js or Remix when the app needs real interactivity, authenticated routes, or server-side data fetching beyond static generation.

But for a marketing site? A portfolio? A blog? Astro is my default, and I don’t see that changing anytime soon.