Skip to main content
Back to blogCopy Markdown
·Updated ·6 min read
·astrowebdevtypescriptmigration

Astro 7 vs 6: What's New and How to Upgrade (Vite 8, Rust)

I expected another v6-style fight and got a pnpm up and a coffee. Vite 8, a Rust compiler, queued rendering: what changed from Astro 6 and where it bites. →

Óscar Gallego

Óscar Gallego

Software Engineer

Migrating from Astro 6 to Astro 7: Vite 8, a Rust compiler, and queued rendering
On this page

Short answer: Astro 7 turns on Vite 8 with Rolldown, a new Rust .astro compiler and queued rendering, all by default. If your v6 project is clean (Content Layer, id not slug, Zod 4), the upgrade is mostly a version bump. Two things can bite: the stricter compiler stops silently fixing malformed HTML, and Markdown now runs on Sätteri, so if you use remark or rehype plugins you have to install @astrojs/markdown-remark yourself.

Two months ago I upgraded this site to Astro 6 and walked you through the fight: the ContentSchemaContainsSlugError that blamed the wrong file, the Zod default that compiled while lying, a whole afternoon gone. So when Astro 7 landed, I braced for the same. Strong coffee, changelog open, the afternoon blocked off.

Didn’t need it. pnpm up astro, green build, 217 tests green, and I drank the coffee actually celebrating. The difference between v6 and v7 is the difference between paying off old debt and getting a new engine for free.

What does Astro 7 actually ship?

Three headliners, and all three come on by default:

  • Vite 8, with Rolldown underneath: the Rust bundler that replaces esbuild and Rollup. Astro claims builds 15% to 61% faster, and some sites more than twice as fast. In their own benchmarks, astro.build went from 62 seconds to 24.
  • A Rust compiler: they rewrote the .astro compiler from scratch, Go to Rust.
  • Queued rendering: what was an experimental flag in v6 is now stable and default. It swaps recursive rendering for a queue and they put it around 2.4× faster.

Underneath there’s more: Markdown moves to a Rust-powered processor (Sätteri), route caching stabilizes behind a platform-agnostic API (Astro.cache), a new src/fetch.ts entrypoint lets you own the whole request pipeline, and a couple of agent-friendly bits like astro dev --background with agent detection and JSON logging.

Astro 6Astro 7
BundlerVite with esbuild and RollupVite 8 with Rolldown (Rust)
.astro compilerGoRust, rewritten from scratch
RenderingRecursive; the queue was an experimental flagQueued, stable and default
Markdownremark and rehype built inSätteri (Rust); remark or rehype plugins need @astrojs/markdown-remark
Malformed HTMLThe compiler silently fixed itNo longer fixed
Line break between inline elementsRenders as a spaceJSX rules: no space
Route cachingExperimentalStable, via Astro.cache

How do you upgrade from Astro 6 to 7?

If your v6 is clean, it’s three commands. These are mine, with the Vercel adapter:

pnpm up --latest astro @astrojs/vercel   # for me, 6.4.6 → 7.0.3 and the adapter from 10 to 11
pnpm add @astrojs/markdown-remark        # only if you use remark or rehype plugins
pnpm astro check && pnpm build && pnpm test

Before you run them, check two things: no v6 experimental flags left in astro.config.mjs, and templates that close every tag. The first is in the official upgrade guide; the second is the new compiler’s sharp edge, covered below.

Why it didn’t hurt for me

My entire diff was two things: bump versions and fix two tests. No experimental flag to remove, no src/fetch.ts to write, no astro:transitions internals to chase, no @astrojs/db. Astro 6.4.6 to 7.0.3, and while I was in there @astrojs/vercel 10 to 11 and TypeScript 5.9 to 6.0. The only change in my own code was updating assertions in two unit-test files to expect trailing-slash URLs. 217 tests green, on with my day.

The reason is the v6 lesson in reverse. v6 already made me pay every debt: the Content Layer, id instead of slug, the Zod 4 defaults. v7 takes away no crutches, it just adds speed. If your v6 is clean, v7 is free.

The honest part: where it can bite

It’s not all a breeze, and the new compiler has an edge to it.

The Rust one is stricter than the old Go one. It no longer auto-corrects your HTML: it won’t reorder tags or close the ones you left open, and whitespace now follows JSX rules, so a newline between two inline elements no longer renders as a space. Nothing broke for me because my templates were already well-formed. But if you’re carrying sloppy HTML that survived because Astro quietly patched it behind your back, that’s where v7 will start throwing errors v6 swallowed without a word.

It did bite a week later. Patch releases 7.0.4 to 7.0.6 broke static prerendering for my [slug].md.ts endpoints with trailingSlash: "always" (“Missing parameter: slug”), so I pinned 7.0.3, renamed the endpoints to [slug].ts, and installed @astrojs/markdown-remark explicitly for my remark plugins. Not a fight, but not free either.

And an asterisk on the numbers: that “15-61% faster” is their benchmark, not mine. I didn’t time the build before the upgrade, so I can’t give you a delta. What I can sign: today, on 7.3.3 and an M2 Max, astro build does this site’s 43 pages in about 5 seconds on a warm run.

The takeaway, next to v6

The migrations that hurt are the ones that pay off old debt, not the ones that ship new engines. Do the boring work on time (the v5 work, the v6 work) and the jump to v7 is what every upgrade promises and almost none deliver: a pnpm up and a coffee you actually get to enjoy.

Related reading: if you’re coming from further back, the upgrade that genuinely costs you is Astro 5 to 6, with the slug to id switch and the Zod 4 defaults that explain why v7 felt so smooth. Jumping straight from v5 and your schema fields vanish? Check where your content.config.ts lives first.

Sources


P.S. Already jumped to v7? Did the Rust compiler catch some sloppy HTML that had been sneaking by for years? Tell me on Twitter/X.

Last updated:

Share this article