The Rust Rewrite: Modern Developer Tools I Lean On in 2026
Two years ago, my development workflow looked different. I ran pip install and waited. I juggled ESLint, Prettier, and isort configs that constantly conflicted. I watched Webpack crawl through 30-second rebuilds.
Today, every tool in that stack has been replaced. Not by incremental improvements. By complete rewrites in Rust that deliver 10-100x performance gains.
The pattern is unmistakable: fragmented, JavaScript-based tooling is giving way to unified, compiled alternatives. Here’s what I actually use now and why.
Python: uv Replaced Everything
I switched to uv six months ago. It’s a drop-in pip replacement written in Rust, and the performance difference is brutal.
# Old world
pip install numpy pandas scikit-learn # 45 seconds
poetry install # 38 seconds
# New world
uv pip install numpy pandas scikit-learn # 1.2 seconds
That’s not a typo. uv runs 10-100x faster than pip in real-world benchmarks. But speed isn’t even the main selling point.
uv consolidates three tools I used to maintain separately:
| Old Stack | uv Equivalent |
|---|---|
pip | uv pip |
pyenv | .python-version file |
pip-tools / poetry | uv lock |
The .python-version file is the killer feature. Drop it in a project root, and uv automatically uses that Python version. No more pyenv local 3.11.0 ceremonies.
echo "3.12" > .python-version
uv pip install -r requirements.txt
# Python 3.12 is automatically downloaded and used
Why this works: uv treats Python versions as dependencies, not system configuration. The version travels with the project, not the developer’s machine.
Ruff: One Tool Instead of Three
Ruff is the linter that made me delete my Pylint, Black, and isort configs. Built by the same team behind uv (Astral), it runs 130x faster than Black as a formatter.
# Old workflow
black . # 12 seconds
isort . # 4 seconds
pylint src/ # 89 seconds
# Ruff
ruff check --fix . # 0.3 seconds
ruff format . # 0.1 seconds
The unification matters more than the speed. I used to maintain three config files that occasionally disagreed. Ruff’s single pyproject.toml section handles everything:
[tool.ruff]
line-length = 88
select = ["E", "F", "I", "UP"]
[tool.ruff.isort]
known-first-party = ["myapp"]
For large Python codebases with thousands of files, the difference is transformational. CI pipelines that spent 2 minutes on linting now finish in under 5 seconds.
JavaScript: Biome Over ESLint + Prettier
The JavaScript ecosystem followed the same pattern. Biome replaces ESLint and Prettier with a single Rust binary that’s 10-20x faster.
# Old world
npm run lint # ESLint: 18 seconds
npm run format # Prettier: 6 seconds
# Biome
biome check . # 0.9 seconds
The real win is configuration reduction. My old .eslintrc.js was 200 lines. The Prettier integration required eslint-config-prettier to prevent conflicts. Biome’s biome.json is 15 lines:
{
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
"organizeImports": { "enabled": true },
"linter": {
"enabled": true,
"rules": { "recommended": true }
},
"formatter": {
"enabled": true,
"indentStyle": "space",
"lineWidth": 100
}
}
Ultracite builds on Biome with opinionated defaults tuned for AI-assisted coding. If you’re using Cursor or Claude Code or Antigravity heavily, the pre-configured rules catch common AI-generated code issues without setup.
Build Tools: Vite Changed My Expectations
Vite solved Webpack’s fundamental problem by not bundling during development. It serves native ES modules directly and only bundles for production.
| Metric | Webpack | Vite |
|---|---|---|
| Dev server cold start | 6-11 seconds | 376-917ms |
| Hot module replacement | 2-4 seconds | instant |
| Memory usage | 800MB+ | ~200MB |
The architecture is simple: during development, your browser loads ES modules directly. Vite only transforms individual files on demand. No dependency graph traversal, no bundle generation.
// vite.config.js - This is the entire config for most projects
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()]
})
For production, Vite uses Rollup under the hood, which produces smaller bundles than Webpack. I’ve seen 20% size reductions on larger applications.
Turbopack takes this further with Rust-based incremental computation. If you’re on Next.js, it’s worth enabling. Cold starts are 700x faster than Webpack, though the comparison to Vite is closer (4 seconds vs 16.6 seconds on 5,000+ module projects).
Transpilation: SWC Over Babel
SWC replaced Babel in my toolchain. Written in Rust, it’s 20-60x faster for TypeScript transpilation.
# Babel
npx babel src --out-dir dist # 8.4 seconds
# SWC
npx swc src --out-dir dist # 0.4 seconds
The tradeoff: SWC doesn’t type-check. You still need tsc in CI for validation. But that’s the right separation of concerns. SWC handles speed, TypeScript handles correctness.
Most modern frameworks have switched under the hood. Next.js, Vite, and Parcel all use SWC by default.
Testing: Vitest If You’re on Vite
Vitest leverages Vite’s architecture for testing. In watch mode, it runs 10-20x faster than Jest by only rerunning affected tests.
# Jest watch mode
npm test -- --watch # Full suite: 24 seconds
# Vitest watch mode
npx vitest # Affected tests only: 1.2 seconds
The Jest API compatibility means migration is straightforward. Most test files work without changes.
// Same syntax, faster execution
import { describe, it, expect } from 'vitest'
describe('Calculator', () => {
it('adds numbers', () => {
expect(1 + 1).toBe(2)
})
})
If you’re not using Vite, Jest remains excellent. But for Vite-based projects, Vitest is the obvious choice.
Package Management: pnpm for Disk Space
pnpm solves npm’s disk space problem through content-addressable storage. Every package is stored once globally, and projects use symlinks.
# npm
du -sh node_modules # 1.2GB
# pnpm
du -sh node_modules # 380MB (70% smaller)
Installation is 2-3x faster than npm. But the real value is strict dependency resolution. If you don’t explicitly declare a dependency, you can’t import it. This catches phantom dependencies that work locally but break in production.
# npm allows this (dangerous)
import foo from 'some-transitive-dep'
# pnpm blocks it at runtime unless declared
Bun goes further by reimagining the entire JavaScript runtime. It bundles a package manager, runtime, bundler, and test runner into one binary. Installation is 10-100x faster than npm. If you’re starting fresh and can accept the ecosystem compatibility tradeoffs, it’s worth evaluating.
Git Hooks: Lefthook for Polyglot Projects
Lefthook replaced Husky in my monorepos. It’s a Go binary that runs hooks in parallel with native file filtering.
# lefthook.yml
pre-commit:
parallel: true
commands:
frontend-lint:
glob: "apps/web/**/*.{ts,tsx}"
run: pnpm --filter web lint
backend-lint:
glob: "apps/api/**/*.py"
run: uv run ruff check apps/api
| Feature | Husky | Lefthook |
|---|---|---|
| Parallel execution | No | Yes |
| File filtering | Via lint-staged | Native |
| Language dependency | Node.js | None (Go binary) |
For JavaScript-only projects, Husky is simpler. For teams mixing languages, Lefthook is essential.
The Pattern Behind the Tools
Look at what’s happening across these tools:
- Rust rewrites deliver 10-100x performance gains (uv, Ruff, SWC, Biome, Turbopack)
- Unified tooling replaces fragmented ecosystems (Biome vs ESLint+Prettier, Ruff vs Pylint+Black+isort)
- Incremental computation minimizes work (Vite, Vitest, Turbopack)
- Zero-config defaults reduce decision fatigue (Biome, Ultracite, Vite)
The trend is clear: developer tooling is consolidating around fewer, faster, more opinionated tools. The JavaScript fatigue of maintaining 15 config files is ending.
My Current Stack
| Category | Tool |
|---|---|
| Python packages | uv |
| Python linting/formatting | Ruff |
| JavaScript linting/formatting | Ultracite |
| Build tool | Vite |
| Transpiler | SWC (via Vite) |
| Testing | Vitest |
| Package manager | pnpm |
| Git hooks | Lefthook |
Every tool on this list is either written in Rust/ Go or deliberately minimal. The overhead I used to accept as normal now feels inexcusable.
The Bottom Line
If you’re still running pip, Pylint, Black, ESLint, Prettier, and Webpack separately, you’re maintaining complexity that modern tools have eliminated. The migration path is straightforward: start with uv and Ruff for Python, Biome for JavaScript. The performance gains are immediate, and the configuration burden drops dramatically.
The Rust rewrite wave isn’t hype. It’s a genuine generational shift in what developer tools can do.
Experimenting with modern dev tooling? I’d love to hear what’s working for you. Reach out on LinkedIn.