The JavaScript Tooling Stack Is Rewriting Itself in Rust
Every major JS build tool is being rewritten in Rust by the teams at Vercel, Cloudflare, ByteDance, and Anthropic. Here is what changed, why it happened, and what is already running on your machine.
My name is Max and I'm the founder of Rustify.
I've been writing Rust professionally for 2 years and I've helped dozens of engineers make the switch to Rust professionally.
If you want to go further, here's how I can help:
- Fullstack Bootcamp: structured program with real projects, async support, and private community access.
- Blockchain Bootcamp: structured program with real projects, async support, and private community access.
- 1:1 Mentorship: personalized sessions to get you hired faster, with projects tailored to you and mock interviews.
And if you want more Rust content, I post regularly on my YouTube channel:

Most developers will read this as ecosystem evolution.
A smaller group will read it as a signal about where engineering leverage is moving, and about what kind of engineer they are going to become next.
Every major tool in your JavaScript stack is being rewritten in Rust. Not as an experiment. Not by enthusiasts. By the teams at Vercel, Cloudflare, ByteDance, and Anthropic that maintain the tools you run in production every day.
The developers I see move fastest do not treat that as interesting news. They treat it as market information. They understand that some people will just benefit from this shift, while others will use it to reposition themselves earlier.
Big Picture
YOUR JS STACK ALREADY RUNS RUST
│
├── TRANSPILATION Babel → SWC / Oxc
├── BUNDLING webpack → Rspack / Rolldown / Turbopack
├── CSS Tailwind v4 Oxide + Lightning CSS
├── LINTING & FORMATTING ESLint + Prettier → Biome v2 / Oxlint + Oxfmt
├── RUNTIMES Node → Deno (Rust core) / Bun (Rust, rewritten 2026)
├── MONOREPOS Turborepo (Rust)
└── 2026 : UNIFICATION Vite+ (everything in one)1. You Already Run Rust
You ship Rust to production every day. You just never noticed.
Here is what runs under your current stack:
| Tool you use | What runs underneath | Language |
|---|---|---|
| Next.js | SWC (transpiler) | Rust |
| Vite 6+ | Rolldown (bundler) | Rust |
| Tailwind CSS v4 | Oxide (class scanner) + Lightning CSS | Rust |
| Biome | linter + formatter | Rust |
| Bun | runtime + bundler + package manager | Rust* |
*Originally Zig. Anthropic acquired Bun in late 2025 and merged a full Zig to Rust rewrite in May 2026 (960k lines, 6 days). v1.3.14 was the last Zig version.
Every time you run next build, vite build, or npx tailwindcss, you are executing compiled Rust code on your machine. The npm package is just a thin wrapper that downloads and calls a native binary.
Why is the JS ecosystem rewriting tools in Rust?
Three reasons:
1. No garbage collector. JavaScript has a GC. When it runs, everything pauses. Not sometimes. Every build, every watch cycle, every lint run. For a server handling HTTP requests, a 5ms pause is invisible. For a build tool parsing 10,000 files, that pause happens hundreds of times and compounds. Rust has no GC. Zero pauses. The CPU spends 100% of its time doing actual work.
2. Native threads. Babel is single-threaded. It has always been single-threaded. One core processes one file at a time while the other 15 cores on your laptop sit completely idle. SWC spawns OS threads and processes files in parallel. Same machine. Same files. 16 cores working instead of one. The speedup is not a trick. It is just using the hardware that was already there.
3. Compiled binary.
Every time you run eslint ., Node.js parses ESLint's source code, JIT-compiles it, warms up the runtime, and then finally starts linting. You pay the boot cost of a JavaScript engine before any actual work begins. A Rust binary skips all of that. It is pre-compiled machine code. It starts in milliseconds and runs at full speed immediately.
The result in practice:
| Operation | Old (JS) | New (Rust) | Speedup |
|---|---|---|---|
| Transpile (SWC vs Babel) | ~4s | ~0.06s | ~70x |
| Lint (Oxlint vs ESLint) | ~30s | ~0.3s | ~100x |
| CSS scan (Tailwind v4 vs v3) | ~400ms | ~4ms | ~100x |
| Format (Biome vs Prettier) | ~8s | ~0.2s | ~35x |
These are not micro-benchmarks run on a NASA server. These are real-world numbers on mid-size codebases, on ordinary developer machines.
Speed is only half the story. JS tools also overconsume memory because the GC over-allocates aggressively. Rust allocates exactly what it needs and frees it immediately.
| Tool | Peak RAM (large project) |
|---|---|
| webpack | 2-4 GB |
| Rspack | ~400 MB |
| ESLint full run | 1+ GB |
| Oxlint | ~50 MB |
| Babel transform | ~600 MB |
| SWC transform | ~80 MB |
On a machine with 16 GB RAM, a JS build pipeline can consume half your system memory. Rust tools leave it free for your editor, browser, and actual work.
The human cost
Speed multipliers look good in a table. Here is what a 70x speedup actually means at your company:
Team of 10 developers. 50 builds per day each. webpack full build = 2 minutes. That is 1,000 build-minutes per day. Sixteen developer hours burned watching a terminal, every single day. Rspack at 15 seconds = 1.5 hours. Rust gives back 14.5 hours of focus per day, for free, with no code changes.
That is almost two full-time engineers recovered from waiting. Several of my clients have run this math and it is what finally convinced their engineering manager to prioritize the migration.
And that is before CI. At $0.008 per minute on GitHub Actions, cutting a 5-minute build to 30 seconds saves roughly $540 per month per repository at 100 builds per day. Rust tooling does not just feel faster. It shows up as a line item in your infrastructure bill.
Why Node.js was always the wrong tool for this job
This was not inevitable. Node.js was designed for one specific problem: handling thousands of concurrent network requests with minimal memory per connection. The event loop and single-threaded model is the correct architecture for an HTTP server waiting on I/O.
It is the wrong architecture for a build tool parsing 5,000 TypeScript files.
Build tools are CPU-bound. They need to read files, parse ASTs, apply transforms, and emit output as fast as the CPU allows. Node.js cannot use multiple cores natively. It has GC pauses during the heaviest work. It JIT-compiles the build tool itself on every run.
The JS ecosystem built build tools in Node.js in the 2010s because that was the only option. Rust did not exist at production maturity yet. Now it does. The rewrites are not a trend. They are a correction.
The pattern
Every major JS tool built in the 2010s is being rewritten or replaced:
2010s stack (JS) 2020s stack (Rust/native)
────────────────────── ──────────────────────────
Babel → SWC / Oxc
webpack → Rspack / Rolldown / Turbopack
ESLint + Prettier → Biome / Oxlint + Oxfmt
PostCSS + cssnano → Lightning CSS
Tailwind v3 (JS scan) → Tailwind v4 Oxide (Rust scan)You do not need to learn Rust to benefit from this shift. The tools expose the same APIs and config formats you already know. The speed is free.
But the career signal is not free.
Some developers will use Rust-powered tools for the next five years and never update how they think about their own leverage. Others will notice what the market is actually saying and reposition around it early.
2. SWC — Babel → SWC
SWC does exactly what Babel does: parse TypeScript and JSX, apply transforms, emit JavaScript. The job is identical. Everything underneath is different. Rust instead of Node.js. Native threads instead of single-threaded. Pre-compiled binary instead of JIT-compiled on every run. Result: ~70x faster on the same project, with no changes to your code.
You probably already use it
If you use Next.js 12+, SWC is already your transpiler. Babel is gone. You got a 70x speedup and never noticed because you did not have to do anything. That is the point.
If you have a babel.config.js or .babelrc in a Next.js project, Next.js falls back to Babel. Removing it re-enables SWC.
Why it matters
Babel is single-threaded. On a 10-file project, that is fine. On a 1000-file project, transpilation becomes a bottleneck. SWC spawns OS threads and processes files in parallel. The bigger your project, the bigger the gain.
SWC is also built into Rspack and Deno. It is the Rust transpiler the ecosystem converged on.
Plugin ecosystem
SWC supports plugins written in Rust. The ecosystem is smaller than Babel's. Most common transforms are built-in (TypeScript, JSX, decorators, class properties). Niche Babel plugins may not have a SWC equivalent yet.
When SWC, when Oxc
- SWC: stable, widely tested, Next.js built-in. Default choice today.
- Oxc: newer, faster still, used in Vite+. Pick for greenfield projects on Vite.
3. Oxc — The Next Generation
Every tool in your current stack re-parses your code independently. ESLint reads your file and builds an AST. Prettier reads the same file and builds its own AST. Your bundler reads it again. Each tool throws away the result when it is done. On a 1,000-file project, that means thousands of redundant parse operations, all in JavaScript, all single-threaded.
Oxc parses once and shares the result across everything. One AST, all tools. That is the architectural insight behind it.
Oxc (JavaScript Oxidation Compiler) is a suite of Rust-based JS/TS tools built around a shared parser:
OXC
├── oxc_parser ← shared AST, foundation for everything else
├── oxc_transformer ← transpiler (replaces Babel / SWC)
├── oxlint ← linter (replaces ESLint)
├── oxfmt ← formatter (replaces Prettier)
└── oxc_minifier ← minifier (replaces Terser)One parser, all tools. No re-parsing between lint and transform. That is why it is faster than a stack of separate tools.
Oxc vs SWC
| SWC | Oxc | |
|---|---|---|
| Maturity | Production-stable | Newer, stabilizing fast |
| Next.js support | Built-in | Not yet |
| Plugin ecosystem | Moderate | Small |
| Speed | ~70x Babel | Faster still |
| Used by | Next.js, Rspack, Deno | Vite+, Rolldown |
| Linter included | No | Yes (oxlint) |
| Formatter included | No | Yes (oxfmt) |
Oxlint
Oxlint is the linter part of Oxc. 50-100x faster than ESLint. It does not replace ESLint entirely today (plugin ecosystem is smaller), but covers the most common rules at native speed. Many teams run Oxlint first, ESLint second, and progressively drop ESLint rules as Oxlint coverage grows.
Oxc transformer (Vite+ context)
In Vite+, vp build uses Oxc transformer internally. You do not configure it directly. If you are building outside Vite+, SWC is still the safer explicit choice for now.
Oxc minifier
Early but worth watching. Terser (the current standard) is slow because it is JS. Oxc minifier is already competitive on output size and significantly faster. Track it for 2026/2027.
4. Rspack — webpack → Rspack
Rspack is a webpack-compatible bundler written in Rust by ByteDance. The goal: drop in, flip the config, get 5-10x faster builds with zero migration cost.
Why not just use Vite?
Vite is great for greenfield. But many large production apps are deep in webpack: custom loaders, complex splitChunks config, webpack-specific plugins, internal tooling built on the webpack API. Migrating to Vite means rewriting all of that. Rspack does not.
Migration from webpack
Rename webpack.config.js to rspack.config.js, swap the packages. Most config is identical.
One meaningful difference: SWC is built into Rspack. No babel-loader or ts-loader needed:
// webpack: requires installing babel-loader + @babel/core + presets
use: "babel-loader"
// rspack: SWC built-in, zero extra dependencies
use: "builtin:swc-loader"That one line removes 5-8 packages from your devDependencies and makes transforms run in Rust.
What still does not work
Rspack is not 100% webpack-compatible. Some older plugin hooks are partial, and a few community loaders that depend on webpack internals may break. Check plugin compatibility before migrating a complex setup.
Speed in practice
| Project size | webpack build | Rspack build |
|---|---|---|
| Small (~50 modules) | ~3s | ~0.4s |
| Medium (~500 modules) | ~25s | ~3s |
| Large (~5000 modules) | ~120s | ~15s |
HMR (hot reload) improvement is even more dramatic on large projects: webpack can take 2-5s per update, Rspack is typically under 100ms.
When Rspack vs Rolldown vs Turbopack
On webpack today, large project, can't rewrite config → Rspack
Starting fresh, using Vite → Rolldown (built-in)
On Next.js → Turbopack (built-in)5. Rolldown — Rollup → Rolldown
Rolldown is a Rust rewrite of Rollup, built by the VoidZero team (Evan You, creator of Vue and Vite). Starting with Vite 6, Rolldown is Vite's bundler under the hood.
Why this matters for Vite users
Vite previously used esbuild for dev transforms and Rollup for production builds. Two different tools, two different behaviors, occasional inconsistencies between dev and prod output.
Rolldown replaces both. One Rust bundler for dev and prod. Same output, same behavior, same code path. The inconsistency problem disappears.
Why Rolldown over Rollup
Rollup is JavaScript. It is single-threaded and slow on large projects. Rolldown is Rust, parallel, no GC. On large codebases, production build times drop by 10-20x.
Rolldown also has built-in support for features Rollup needs plugins for: module federation, advanced chunking strategies, CommonJS interop. Less config, more built-in.
Rollup API compatibility
Rolldown aims for Rollup plugin API compatibility. Most Rollup plugins work with Rolldown without changes. The ecosystem is migrating fast: if you use Vite 6+, you are already on Rolldown.
Rolldown vs Rspack
| Rolldown | Rspack | |
|---|---|---|
| Origin | Rollup rewrite | webpack rewrite |
| Used by | Vite 6+, Vite+ | Standalone |
| Ecosystem | Vite / ESM-first | webpack / CJS legacy |
| Pick when | On Vite, greenfield | Migrating from webpack |
6. Turbopack — Next.js bundler
Turbopack is Vercel's Rust-based bundler, built specifically for Next.js. It is not a general-purpose tool. You do not configure it directly. It runs when you opt in:
next dev --turbopackAs of Next.js 15, Turbopack is stable for development. Production builds are still in progress.
Why it exists
webpack (what Next.js used before) was designed in 2012. It was not built for incremental compilation. Every file change triggers a cascade of re-processing. On large Next.js apps, next dev HMR can take 5-10s per update.
Turbopack is built around a demand-driven incremental engine: it only recomputes what changed, at the function level, not the file level. HMR on large Next.js apps drops to under 100ms.
Status 2026
- Dev mode: stable since Next.js 15
- Prod builds (
next build --turbopack): experimental, landing progressively - Not usable outside Next.js
7. Lightning CSS
Lightning CSS is a CSS parser, transformer, and bundler written in Rust by the Parcel team. It handles what PostCSS + Autoprefixer + cssnano do, in a single Rust binary.
What it does:
- Parses and validates CSS
- Adds vendor prefixes automatically (replaces Autoprefixer)
- Minifies output (replaces cssnano)
- Bundles
@importstatements - Transforms modern CSS syntax for older browsers (cascade layers,
color-mix(), etc.)
You already use it
Tailwind CSS v4 uses Lightning CSS as its CSS engine. Vite can use it via vite-plugin-lightningcss. Parcel uses it by default.
Why it matters
PostCSS is a JavaScript plugin pipeline. Every CSS file runs through a JS chain: parse to plugin 1 to plugin 2 to plugin n to emit. Lightning CSS does all of it in one Rust pass. On large stylesheets, the difference is 100x or more.
8. Tailwind CSS v4 + Oxide Engine
Tailwind v4 (January 2025) is a full rewrite. The config format changed, the engine changed, and Rust is now at the core.
The Oxide engine
Tailwind v3 scanned your templates with a JavaScript regex to detect which utility classes you used. On a large project, this scan blocked every build and watch cycle.
Tailwind v4 replaced it with Oxide: a Rust-based scanner that reads your files concurrently, without regex, at native speed.
| Tailwind v3 | Tailwind v4 | |
|---|---|---|
| Class scanner | JS regex | Rust (Oxide) |
| CSS engine | PostCSS chain | Lightning CSS |
| Full build | baseline | 5x faster |
| Incremental build | slow | 100x faster, microseconds |
| Config format | tailwind.config.js | CSS-first (@theme) |
CSS-first config
In v3, you customized Tailwind in JavaScript:
// tailwind.config.js
module.exports = { theme: { extend: { colors: { brand: "#ff6b00" } } } }In v4, you do it in CSS:
@import "tailwindcss";
@theme {
--color-brand: #ff6b00;
}No JavaScript file. Your design tokens are native CSS variables, accessible anywhere without a build step.
9. Biome v2 — ESLint + Prettier → Biome
Count the config files in a typical TypeScript project: .eslintrc.json, .eslintignore, .prettierrc, .prettierignore. Then the plugins: @typescript-eslint/parser, eslint-plugin-react, eslint-plugin-import, eslint-config-prettier (the one whose only job is stopping ESLint and Prettier from fighting each other). Then the VS Code settings. Then the CI step that runs them separately and in the right order.
Biome replaces all of it. One binary. One config file. Lint and format in a single pass over the AST, in Rust, 35x faster.
The most common thing I hear after my clients migrate to Biome: "I didn't realize how much mental overhead those config files were creating."
Biome v2 (June 2025, codename Biotype) went further and added one thing no other tool has ever done: type-aware linting without installing the typescript package.
Type-aware linting without tsc
ESLint's typed rules (like @typescript-eslint/no-floating-promises) require running the TypeScript compiler to build a type graph. This is slow. On large projects, typed ESLint rules can add 30-60s to a lint run.
Biome v2 built its own type inference engine in Rust. It does not call tsc. It derives types from the AST directly. Coverage is ~75% of what typescript-eslint catches, at a fraction of the cost. That number is growing.
One binary, zero config overhead
ESLint + Prettier setup:
.eslintrc.json + .prettierrc + .eslintignore + .prettierignore
+ 5-10 plugins + parser packages + format-on-save IDE config
Biome setup:
biome.json (one file)
+ npx @biomejs/biome migrate --write (auto-converts from ESLint/Prettier)Speed
Biome is ~35x faster than Prettier and ~15x faster than ESLint on equivalent rule sets. It formats and lints in parallel, in a single pass over the AST.
Trade-off
Biome does not support ESLint plugins. If your project relies on eslint-plugin-react-hooks, eslint-plugin-import, or domain-specific plugins, you cannot fully replace ESLint today. The common path: migrate formatting to Biome, keep ESLint for plugin-dependent rules, shrink ESLint config over time.
10. Oxlint + Oxfmt (in Vite+)
Oxlint and Oxfmt are the linting and formatting tools from the Oxc project. Both are included in Vite+ as vp check.
They overlap with Biome in purpose but come from a different direction: Oxc started as a parser/transpiler project and grew linting and formatting on top. Biome started as a formatter and grew linting upward.
In practice: if you are on Vite+, you get Oxlint + Oxfmt automatically. If you are not, Biome v2 is the more complete standalone choice today.
11. Deno
In 2018, Ryan Dahl stood on a stage at JSConf EU and gave a talk called "10 Things I Regret About Node.js." He had created Node.js. He had watched it become the backbone of the modern web. And he spent 25 minutes explaining why its fundamental design was broken.
No native TypeScript support. node_modules as a dependency model. package.json as a manifest. The security model (or lack of one). He had built the wrong thing, and the ecosystem had built on top of it for a decade.
Then he built Deno to fix it.
Deno is a JavaScript and TypeScript runtime built on V8 + Tokio (Rust's async runtime). It is what Node.js would have looked like if it were designed today, with 10 years of hindsight.
Why it runs Rust under the hood
Node.js was built on libuv, a C event loop library. Deno replaced it with Tokio: a production-grade async runtime in Rust, used by AWS, Discord, and Cloudflare. Tokio is faster, safer, and under active development by a large team. It is also the same runtime that powers Axum, the Rust web framework eating into Express's territory. One ecosystem, top to bottom.
What is different from Node.js
- TypeScript runs natively, no
tscorts-nodeneeded - No
node_modulesby default: imports use URLs or an import map - Secure by default: filesystem, network, and env access require explicit flags
- Deno ships its own linter (
deno lint), formatter (deno fmt), and test runner (deno test), all in Rust
Node.js compat mode
Deno has a Node.js compatibility layer (node: prefix imports, npm package support). Most Node.js packages work without changes. The gap is closing fast.
12. Bun
Bun is a JavaScript runtime, bundler, test runner, and package manager in one binary.
The Rust rewrite (May 2026)
Bun was originally written in Zig. In late 2025, Anthropic acquired it. Then in May 2026, Anthropic rewrote 960,000 lines of Zig into Rust in six days.
Six days.
For context: 960k lines of code is larger than the Linux kernel's core subsystems. A rewrite of that scale normally takes years, with a team, and usually breaks things. Anthropic did it in a week with AI-assisted tooling, passed 99.8% of the test suite on day one, and shipped zero breaking changes. v1.3.14 was the last Zig release. The binary shrank by 3-8 MB, several memory leaks got fixed, and every bun command you already use kept working identically.
The Rust rewrite of 960k lines in 6 days is the clearest signal yet of where AI-assisted development is going. It is also the most dramatic demonstration that Rust is not just for greenfield projects.
Why Bun over Node.js
Bun uses JavaScriptCore (Safari's JS engine) instead of V8. It is faster at startup and on many workloads. More importantly, Bun collapses the tooling stack:
Node.js stack: Bun equivalent:
node + npm + jest + esbuild → bun (one binary)No separate ts-node for TypeScript. No separate test runner. No separate bundler for scripts. bun run, bun test, bun build all built-in.
Node.js compat
Bun's goal is 100% Node.js compatibility. As of 2026, the vast majority of npm packages work. Edge cases remain but decrease with every release (Bun ships roughly every 3-4 weeks).
When Bun vs Deno vs Node
Need 100% Node.js compat, everything in one binary → Bun
Want secure-by-default, URL imports, Deno-first → Deno
Legacy codebase, maximum ecosystem compat → Node.js13. Turborepo — Monorepo task runner
Turborepo is a monorepo build system written in Rust by Vercel. It runs tasks (build, test, lint) across packages in a monorepo with caching and parallelism.
The problem it solves
In a monorepo with 20 packages, running build naively means rebuilding every package every time, even if only one changed. CI takes 20 minutes. Turborepo caches task outputs and only reruns what is affected.
Without Turborepo: build all 20 packages → 20 min
With Turborepo: only 2 changed → 2 min (cache hits for the rest)Remote cache
Turborepo can share the cache across machines (team members, CI). If your colleague already built package A today, your CI skips it and pulls from cache. Vercel hosts remote caching; you can also self-host.
Why Rust matters here
The task scheduling, dependency graph traversal, and cache fingerprinting all run in Rust. On large monorepos (100+ packages), the overhead of the build system itself is noticeable. Turborepo keeps it under 100ms.
Turborepo vs Nx
Both solve the same problem. Nx has a richer plugin ecosystem and more features (code generators, project graph UI). Turborepo is simpler, faster to set up, and has less config overhead. For most teams starting a monorepo today, Turborepo is the lower-friction choice.
14. Vite+ — The Great Unification (2026)
Vite+ (March 2026, Alpha) is VoidZero's answer to JS tooling fragmentation. It combines everything into one entry point:
Vite+ = Vite + Vitest + Oxlint + Oxfmt + Rolldown + tsdown + Vite TaskOne install, one CLI (vp), one config to understand.
| Command | What it does |
|---|---|
vp env | Manages Node.js version globally and per project |
vp install | Installs deps with the correct package manager |
vp dev | Vite dev server with HMR |
vp check | Lint (Oxlint) + format (Oxfmt) + type check |
vp test | Vitest |
vp build | Production build with Rolldown + Oxc |
vp run | Monorepo task runner with caching |
VoidZero to Cloudflare
VoidZero was founded by Evan You (creator of Vue and Vite) to build a unified Rust-powered JS toolchain. In 2026, Cloudflare acquired VoidZero. Vite+ is now backed by Cloudflare infrastructure.
Why this matters
The JS ecosystem spent 10 years accumulating config files: .babelrc, webpack.config.js, .eslintrc, .prettierrc, jest.config.js, tsconfig.json. Each tool had its own format, its own plugin system, its own quirks, its own way of conflicting with the others. A new project could easily have 15 config files before writing a single line of application code. New hires spent their first day debugging eslint-config-prettier conflicts instead of shipping features.
Vite+ is a bet that the right answer is one unified tool with sensible defaults, Rust performance under the hood, and a single command for each step of your workflow. Biome made the same bet for lint and format. The ecosystem has spent 10 years fragmenting. It is now consolidating.
15. The Trend: Why This Is Happening Now
The JS tooling rewrite to Rust is not random. It follows a pattern that repeats across software history: a platform grows fast enough that its tooling becomes the bottleneck, and the ecosystem rebuilds the tooling in a systems language.
node_modules was never sustainable
A fresh React project has 1,000+ transitive dependencies in node_modules before you write a single line of code. Each major tool (Babel, webpack, ESLint) brings its own sub-tree. npm install downloads hundreds of megabytes of JavaScript that you did not author, did not audit, and cannot easily review.
This is not just slow. It is a security surface you cannot fully control. In 2021, ua-parser-js (8 million downloads per week) was hijacked and started mining crypto on developer machines. In 2022, node-ipc was deliberately poisoned to overwrite files based on geolocation. The attack did not require breaking any security system. The maintainer just published a new version.
Rust tooling distributed via npm is structurally different. The npm package is a thin wrapper that downloads one pre-compiled native binary and calls it. biome: one binary. oxlint: one binary. rspack: one binary. No plugin chain of 40 packages, no transitive deps, no supply chain to compromise. The attack surface goes from hundreds of packages to one file you can checksum.
The industry is voting with engineering time
This is not a community experiment. Companies with the most to lose are moving:
- Vercel: rewrote Next.js transpiler (SWC), built Turbopack and Turborepo in Rust
- Cloudflare: acquired VoidZero (Vite+), runs Workers runtime on Rust
- ByteDance: built Rspack for their own production monorepos before open-sourcing
- Anthropic: acquired Bun, rewrote 960k lines Zig to Rust in 6 days, ships Claude Code as Bun
- Parcel team: built Lightning CSS, now the CSS engine for Tailwind v4
- Evan You (creator of Vue, Vite): founded VoidZero specifically to unify JS tooling in Rust
These are not side projects. These are the teams that maintain the tools you run in production, rewriting them from scratch because the performance ceiling of JS is not a limit they are willing to accept.
Why Rust specifically
C and C++ were options. They are fast but memory-unsafe: buffer overflows, use-after-free bugs, data races. Writing a multithreaded JS parser in C++ is possible but dangerous.
Rust gives the same performance as C++ with compile-time memory safety guarantees. A Rust program that compiles is free of a whole class of bugs. For tooling that runs on every developer's machine, on CI, on untrusted input (user code), that matters.
The convergence pattern
Phase 1 (2010s): JS tools written in JS
→ Fast to build, slow to run, ecosystem explosion
Phase 2 (2018-2023): Individual Rust rewrites
→ SWC, Biome, Lightning CSS, Rspack, each separately
Phase 3 (2024-2026): Unification
→ Oxc (shared parser for all tools)
→ Vite+ (one CLI for the full stack)
→ Biome v2 (lint + format + types)
→ Bun (runtime + bundler + package manager)The end state: most JS developers will interact with 1-2 tools, both Rust-powered, both zero-config by default. The 15-config-file era is ending.
What stays in JS
Not everything moves to Rust. Application code stays in TypeScript. React, Vue, and Svelte stay in JavaScript. The npm package ecosystem stays where it is. None of that is changing.
What is changing is the layer underneath: the tools that compile your code, lint it, format it, bundle it, scan it, cache it. That layer is moving to Rust, one rewrite at a time, mostly silently.
You have been running Rust in production for years. You just never had to care. That is exactly the point.
Most JavaScript developers will read this shift as a tooling story. A smaller group will read it as a signal about where engineering leverage is moving.
That second group does not just know that Rust is faster. They can evaluate when a Rust rewrite makes sense, lead the conversation, and eventually ship the proof of concept instead of only forwarding the benchmark.
That is a different profile from "strong JS engineer who keeps up with tools." It is closer to "engineer who saw where the stack was going before the market finished repricing it."
If you want to become that person, real Rust projects, structured feedback, and someone who has already done the transition are what the mentorship is for.
If you want to go from knowing these answers to getting hired, with mock interviews, real projects, and personalized feedback on your weak spots, that's exactly what the Rustify Bootcamp and 1:1 Mentorship are for:
- Fullstack Bootcamp: structured program with real projects, async support, and private community access.
- Blockchain Bootcamp: structured program with real projects, async support, and private community access.
- 1:1 Mentorship: personalized sessions to get you hired faster, with projects tailored to you and mock interviews.

Student Success Stories
Hear from engineers who built real Rust projects with Rustify

Arik Dutta
Technical Lead · Low-code & Python → Rust

Tiago Afonso
Fullstack Developer

Ugo Tiberto
Rust Engineer · Fullstack Developer