stackfactory.dev
Let's talk

Blog

Ship faster with Astro

If you’re evaluating frameworks for a marketing site, internal tool shell, or documentation hub, start at the source: astro.build — then dig into the docs when you’re ready to implement. Astro’s pitch is deliberately simple: ship less JavaScript by default, lean on the server for HTML, and opt into interactivity only on the islands that need it.

We build client-heavy products when the problem demands it — but many sites ship faster when the default is HTML from the server and JavaScript only where it earns its keep. That’s not a dig at component frameworks; it’s a boundary choice. When most of the page is static or server-derived, shipping a full client runtime for every route is often wasted bytes and complexity.

Where Astro fits the stack

Astro’s model maps cleanly to how we like to work:

  • Content — Markdown (and optional MDX) with content collections, loaders, and schemas so entries stay consistent.
  • Rendering — Prerender when you can; SSR with an adapter when you need request-time behavior. We use @astrojs/node in standalone mode—one Node process, metrics and middleware in one place, easy to run behind any reverse proxy. Astro does not lock you into that: swap the adapter for your host, e.g. @astrojs/vercel on Vercel, or Cloudflare, Netlify, and others from the ecosystem.
  • InteractivityIslands when a widget truly needs client state; otherwise, leave it as server output.
src/content/blog/*.md  →  Zod schema  →  getCollection() / render()

That loop keeps authors productive: you query with getCollection, render the body with render(), and TypeScript knows the shape of data because the schema said so.

Performance without heroics

Less client JS usually means faster first paint and fewer moving parts in the critical path. Astro still lets you reach for familiar tools—add a UI library to an island, use View Transitions for polish, or wire observability on the server—without making those choices the baseline for every page.

The goal isn’t minimalism for its own sake; it’s predictable runtime behavior. When the HTML is obvious and the bundle is small, debugging and profiling get easier, and your team spends less time fighting the platform.

When we’d reach for something else

It’s worth naming what we’re not arguing against. Most mainstream frameworks today are not classic client-only SPAs: Next.js, Nuxt, SvelteKit, and peers are hybrid / SSR-first—they ship HTML from the server and hydrate or progressively enhance from there. The landscape moved on from “everything in bundle.js or nothing.”

Where Astro’s tradeoffs still differ is the default density of client runtime across routes. If the whole product behaves like a highly interactive app with shared client state across most views—think dense dashboards, realtime canvases, or app shells where every screen is mostly client-driven—then a React / Vue / Svelte meta-framework (again: usually hybrid, not SPA-only) may fit the problem shape more naturally. Astro can host that shape too, but the wins are smaller when every route already wants a thick client layer. Match the architecture to the shape of the UI—not the hype cycle.

That loop—server HTML first, islands when needed, collections for structured copy—keeps our marketing and content-heavy routes fast to ship and easy to reason about. If you’re on a similar path, the Astro blog and release posts are worth following; the framework has been moving quickly, and the docs stay unusually honest about tradeoffs.