Web Development · Frameworks
Astro 7.0: The Rust Compiler, Vite 8, and What Actually Breaks
Astro 7.0 shipped a full Rust rewrite of its compiler, a jump to Vite 8, and a default markdown parser switch, plus a short list of breaking changes. Here's what changed, what got removed, and a practical checklist for upgrading a real project.
Abhishek Gupta
6 min read
Sponsored
Astro 7.0 landed on June 22, 2026, and unlike most major version bumps, it barely touches the API you write against. The headline changes are underneath: the compiler is now Rust instead of Go, the bundler is Vite 8 instead of Vite 7, and the markdown parser we covered as an opt-in in Astro 6.4 is now the default. If you don’t use @astrojs/db and don’t have a pile of custom Vite plugins, the upgrade is closer to a version bump than a rewrite.
The toolchain rewrite
Astro’s compiler, the piece that parses .astro files and turns them into HTML and JavaScript, has been rewritten in Rust. The previous implementation was written in Go and compiled to WebAssembly for use in Node; the new one is native Rust, also shipped as WASM where needed. Astro’s team frames this as a foundations release rather than a features release, and that’s the right way to read it: nothing about component syntax, props, or slots changed. What changed is the machinery that processes them, which is where a Rust rewrite of a hot path in every build typically pays off over time as the team optimizes it further.
Alongside the compiler, Astro 7.0 moves the dev server and production bundler to Vite 8. For application code, this is close to invisible; Vite’s own breaking changes between 7 and 8 are aimed at plugin authors and tools that reach into Vite internals, not at code that just imports and renders. If you maintain an Astro integration or a Vite plugin as part of your stack, that’s the surface to test. If you consume integrations from the ecosystem, wait for your key dependencies (adapters, UI framework integrations) to confirm Vite 8 compatibility before upgrading a production site, the same way you’d wait out any major bundler bump.
Sätteri is now the default markdown parser
Astro 6.4 introduced Sätteri, a Rust-based markdown and MDX processor, as an opt-in alternative to the long-standing unified() pipeline built on remark and rehype plugins. In 7.0, Sätteri becomes the default. The tradeoff is the same one we flagged when it shipped: Sätteri doesn’t execute remark or rehype plugins, so projects with custom markdown transforms (a remark-toc, a custom heading-ID plugin, anything from the unified ecosystem) will silently lose that processing unless they explicitly opt back into unified():
// astro.config.mjs
export default defineConfig({
markdown: {
processor: "unified", // opt back into remark/rehype plugins
},
});
Sites with plain markdown and no custom plugins won’t notice the switch beyond faster builds. Sites with a customized pipeline should check their build output against the previous version before shipping, since a plugin silently not running is easy to miss until a reader points out a broken table of contents.
What actually got removed
This is the part of the upgrade that needs planning, not just testing. Three things are gone outright, not deprecated-with-a-warning:
| Removed | What it means |
|---|---|
@astrojs/db | If your project used Astro DB’s hosted SQLite database, you need a replacement (self-hosted SQLite/Postgres, Turso, or another provider) before upgrading, not after |
astro db, astro login, astro logout, astro link CLI commands | These commands no longer exist; scripts or CI steps that call them will fail |
Deprecated astro:transitions APIs | Older View Transitions APIs superseded in earlier 6.x releases are now gone; projects still on the old API need to move to the current View Transitions implementation first |
If none of these apply to your project, this table is the whole migration. If any of them do, budget time before you touch the version number, because there’s no compatibility flag to fall back on.
The Node.js floor moved to 22
Astro 7.0 requires Node.js 22 as a minimum. This is the kind of requirement that’s easy to miss in a changelog and then hit as a cryptic install failure in CI. Check your CI runner’s Node version and your local environment before upgrading the package:
node --version # needs to report v22.x or newer
If you’re on Node 18 or 20, upgrade the runtime first, verify your existing test suite still passes on the new Node version, and only then bump Astro. Rolling both changes into one PR makes it harder to tell which change caused a given failure.
Whitespace handling changed by default
compressHTML now defaults to JSX-style whitespace handling: line breaks and whitespace between elements in your markup get stripped, matching the convention React and several other frameworks already use. For the overwhelming majority of layouts this is invisible. It’s worth an explicit check if any part of your site relies on literal whitespace between inline elements for visual spacing, since that’s exactly the pattern this change affects. A preview build with a visual diff against production, or even a manual scroll through your most whitespace-sensitive pages, catches this quickly.
A practical upgrade checklist
- Confirm Node.js 22+ in local dev and CI before changing anything else.
- Search the codebase for
@astrojs/dbimports and anyastro db/astro logincalls in scripts or CI config. Replace before upgrading if found. - If you use custom remark or rehype plugins, either verify they still matter after the Sätteri default switch, or explicitly set
markdown.processor: "unified"to keep them running. - Check any Vite plugins or Astro integrations you depend on for stated Vite 8 compatibility.
- Do a visual pass on whitespace-sensitive inline layouts after upgrading, before merging.
- Run
npx @astrojs/upgrade(or your package manager’s equivalent) and let Astro’s own upgrade tooling flag anything project-specific it detects.
For a site that’s plain markdown, no @astrojs/db, and no custom Vite internals, that checklist takes fifteen minutes. For a site with any of the three removed features in active use, treat the removal work as its own task before scheduling the version bump. Either way, this is a foundations release worth taking seriously even though it changes almost nothing you’ll actually write: a faster compiler and a current bundler under an unchanged component model is the upgrade you actually want, and it’s a good one to plan into your next sprint rather than defer indefinitely.
Frequently asked questions
- What actually changed under the hood in Astro 7.0?
- Two things, both about the toolchain rather than the API surface you write against. The compiler, the part that turns .astro files into HTML and JavaScript, was rewritten in Rust, replacing the previous Go implementation. And Astro's dev server and production bundler moved to Vite 8. Neither change requires you to rewrite your components; both are aimed at build and dev-server performance rather than new features.
- Is Astro 7.0 a breaking upgrade for a typical project?
- For most content sites and apps that don't lean on @astrojs/db or custom Vite-internals-dependent integrations, no. The practical blockers are a Node.js version check (22 is now the floor) and a quick look at any inline layouts that depend on whitespace between elements, since compressHTML's default behavior changed. Projects with custom markdown plugins or heavy Vite plugin customization have more to verify.
- What got removed, not just deprecated?
- @astrojs/db is gone, along with its CLI commands: astro db, astro login, astro logout, astro link, and astro init. If your project used Astro DB for a hosted SQLite database, you need a replacement (a standalone SQLite/Postgres setup, Turso, or another hosted database) before upgrading, not after. Deprecated astro:transitions APIs tied to the old View Transitions implementation were also removed.
- Do I need to migrate my markdown plugins?
- Only if you were relying on the unified() default and its remark or rehype plugin ecosystem, and even then, only if Sätteri, now the default, doesn't cover your use case. Sätteri, introduced as opt-in in Astro 6.4, does not run remark or rehype plugins. If your build depends on one, you can still opt back into unified() explicitly via the markdown.processor config, so nothing forces an immediate plugin migration.
- What changed with HTML whitespace handling?
- compressHTML's default behavior now follows JSX-style whitespace handling: line breaks and whitespace between elements in your markup are stripped by default, the same convention React and several other frameworks use. Most layouts render identically. Layouts that depended on preserved whitespace for inline spacing, an inline list separated by literal spaces in the markup, for instance, can visibly change and are worth checking in a preview build.
Sources
Sponsored
More from this category
More from Web Development
R.01 MySQL Now Has a Native VECTOR Type. Should You Drop pgvector For It?
R.02 React 19.2 vs 'React 20': There Is No React 20, and Here's What's Actually New
R.03 Next.js's First Scheduled Security Release Shipped: 9 Advisories, What to Patch
Sponsored
Discussion
Join the conversation.
Comments are powered by GitHub Discussions. Sign in with your GitHub account to leave a comment.
Sponsored