We scanned 4,500 GitHub repos. Here's what developers are actually migrating to.
Developer tools come and go. Blog posts tell you what you should use. GitHub history tells you what people are actually doing.
We built IndieStack to catalog developer tools — auth, payments, databases, email, the whole stack. As part of that, we scraped package.json files across thousands of public GitHub repos, tracking dependency changes over time. The result: 422 confirmed migration paths across 4,535 repos, plus 93,111 verified tool combinations showing what gets used together in production.
Here's what the data shows.
Vitest is eating the testing ecosystem
The single strongest migration signal in our dataset: Jest to Vitest, in 37 repos. Add Mocha to Vitest (13 repos) and you have the dominant story in JavaScript testing right now.
It's not hard to see why. Vitest runs natively in ESM, integrates with Vite's transform pipeline, and its API is close enough to Jest that migration is mostly mechanical. For projects already on Vite, it's a free lunch: one build tool, one config, one mental model.
Mocha, meanwhile, is losing ground in both directions — to Vitest (13), to Jest (12), and even to Ava (10). That last one is interesting. Ava has been around since 2014 and is far from new, but it's still pulling developers away from Mocha in 2025. Mocha's decline isn't about one competitor winning — it's about an older paradigm (callback-based, no native ESM, verbose config) losing relevance broadly.
Webpack is losing. Vite is winning. The story is more nuanced than that.
Webpack → Vite showed up 18 times. Webpack → Rollup showed 12. Rollup → Vite showed 6. Webpack → esbuild showed 5.
The simple read: Webpack is the loser. But look at where those repos are landing. Vite absorbs migrations not just from Webpack but from Rollup and esbuild too. It's not just a faster bundler — it's becoming the default dev environment. Rollup and esbuild were often intermediate steps (faster builds, simpler config), but Vite wraps both of them and adds HMR, dev server, and first-class framework integrations. The final destination for most of these migrations is Vite.
One caveat: our dataset skews toward frontend-heavy repos. Webpack still dominates enterprise and SSR-heavy setups. These numbers reflect the direction of travel for greenfield projects, not the installed base.
The security swap nobody talks about
18 repos migrated from bcrypt to bcryptjs. That's the second-highest migration count in our entire dataset, tied with webpack → vite.
This one doesn't get the conference talks. bcrypt (the native Node binding) has historically caused install headaches on certain architectures — especially ARM and Alpine Linux containers. bcryptjs is a pure JavaScript implementation: slower in benchmarks, zero native compilation. But for most web apps hashing a password on login, the difference is microseconds. The trade-off is obvious once you've hit it, which explains the quiet, consistent migration.
Cypress → Playwright: the E2E shift is real but slow
Cypress to Playwright showed up 7 times; Cypress to Vitest (unit testing as a substitute for E2E) showed 5 times. That's 12 repos moving away from Cypress.
The reasons are well-documented: Playwright runs in multiple browsers natively, handles async better, and Microsoft is actively developing it. But 12 repos is not a flood. Cypress has a massive installed base and excellent DX. The migration cost for E2E tests is high — these are slow, brittle, hard to rewrite. We'd expect this number to grow slowly over the next two years, not spike.
The quiet signals
Two smaller migrations worth noting:
Moment → Day.js (6 repos). Moment officially went into maintenance mode in 2020. Five years later, repos are still migrating. The long tail of moment usage in production is real.
Recoil → Jotai (5 repos). Facebook's Recoil never achieved the adoption the React team expected, and Jotai — lighter, no string-keyed atoms, smaller API surface — is picking up the converts. In state management, the trend is consistently toward less abstraction, not more.
What this means
If you're starting a project in 2025, the migration data points to a clear default stack for JS tooling: Vite for bundling, Vitest for tests, Playwright for E2E. These aren't just the trendy choices — they're where repos are actually landing after paying the migration cost to move away from something else.
The IndieStack migration database now covers 422 migration paths. You can browse them, see what tools your stack has in common with 4,500 real repos, and check whether the tools you're using are gaining or losing ground.
Top comments (0)