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
Software Engineer

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.buildwent from 62 seconds to 24. - A Rust compiler: they rewrote the
.astrocompiler 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 6 | Astro 7 | |
|---|---|---|
| Bundler | Vite with esbuild and Rollup | Vite 8 with Rolldown (Rust) |
.astro compiler | Go | Rust, rewritten from scratch |
| Rendering | Recursive; the queue was an experimental flag | Queued, stable and default |
| Markdown | remark and rehype built in | Sätteri (Rust); remark or rehype plugins need @astrojs/markdown-remark |
| Malformed HTML | The compiler silently fixed it | No longer fixed |
| Line break between inline elements | Renders as a space | JSX rules: no space |
| Route caching | Experimental | Stable, 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
- Astro, Astro 7.0 announcement (Vite 8, Rust compiler, queued rendering, build numbers).
- Astro docs: Upgrade to v7.
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:
Related Posts


Astro 6 in 2026: ~100 Lighthouse and a Fraction of the JS
