Modern.js: ByteDance's progressive React framework and its Rspack family
A progressive web framework based on React and Rsbuild. Rsbuild: An Rspack-based build tool for the web, rebranded from Modern.js Builder.
At a glance
- What is it?
- Modern.js is ByteDance web-infra's MIT-licensed progressive web framework based on React, used internally to build upper-level frameworks supporting thousands of web applications. It bundles the configurations and tools React applications need with built-in routing, data acquisition and state management, sits beside the Rspack, Rsbuild, Rspress and Rslib ecosystem, and releases weekly on the v3.9 line.
- Who is it for?
- Use Modern.js when starting a React application that should grow from simple to full-featured within one framework, progressively adopting routing, data loading and BFF capabilities, and when ByteDance-scale production validation matters. Prefer plain Vite or Rsbuild with hand-picked libraries when you want minimal framework commitment.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 6 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Progressive, with ByteDance's production numbers behind it
The Modern.js framework is a progressive web framework based on React, and the introduction grounds the claim in scale, at ByteDance, Modern.js is used to build upper-level frameworks that have supported the development of thousands of web applications. The problem statement follows the familiar React experience, developers usually need to design implementation plans for certain features or use other libraries to solve them, and Modern.js supports all configurations and tools needed by React applications with built-in additional features and optimizations. The progressive mechanism is explicit, developers use React to build the UI, then gradually adopt Modern.js features to solve common application requirements, routing, data acquisition and state management, the three layers that turn a React app into a framework-managed application without a rewrite.
The Rspack family, four siblings
The ecosystem section names the four tools around the framework, each with its own project. Rspack is a fast Rust-based web bundler. Rsbuild is an Rspack-based build tool for the web, rebranded from Modern.js Builder, the extraction of the framework's build layer into a standalone product. Rspress is a fast Rspack-based static site generator, and Rslib is an Rspack-based library development tool. The relationship matters for evaluation, Modern.js sits on this foundation rather than webpack, so its build performance story is Rspack's, and the rebranding note tells where the boundaries moved, the builder became a product of its own, and the framework consumes it.
Benchmarks, roadmap, examples
Three sections show how the project manages itself. The benchmark page, Modern.js Benchmark, observes trends of key metrics, bundle size, compile speed and install size, published rather than asserted. The roadmap lives in a GitHub issue, updated regularly, unusual transparency for tracking a framework's direction. And the examples are a separate repository, modern-js-examples, holding ready-to-use projects, with the in-tree examples directory showing the deployment and integration shapes the team tests, basic with Zephyr, deploy, CSR and SSR deploy variants, module federation, react compiler, server-sent events, storybook, and the three test runners, cypress, jest and playwright, beside vitest. Each example doubles as documentation of a supported configuration.
Credits, and the lineage of its pieces
The credits section is unusually specific about ancestry, some implementations of Modern.js are modified from existing projects, create-react-app, remix, jest and bundle-require, with thanks. The package-level attributions name the lineage, bundle-require modified from egoist's bundle-require, the plugin hooks API referenced from farrow-pipeline, the data-loader plugin referencing code from remix, and the babel module resolver modified from tleunen's. For an adopter, this maps the framework's capabilities to their provenance, the data loading story descends from Remix's loaders, the plugin system from farrow's pipeline hooks, and the credits close with Netlify for hosting the site. The MIT license with a THIRD-PARTY-LICENSE file completes the legal hygiene.
A pnpm, Nx and changesets monorepo
The repository is a pnpm workspace orchestrated by Nx, and the scripts reveal the scale, prepare-build runs nx run-many building all at-modern-js packages with a max parallelism of four, excluding the two documentation packages, and build:required names the five packages every other depends on, builder, bff-core, utils, i18n-utils and runtime-utils. Testing splits into framework and builder integration suites in a tests directory plus unit tests through rstest, the team's own Rspack-based test runner, and lint is biome. Releases flow through changesets with pre-enter and pre-exit modes for release candidates, husky for hooks, and a prepare script chaining the build. The monorepo machinery is sized for the dozens of published packages the framework comprises.
Weekly releases, bilingual docs
The release train moves weekly, v3.9.1 on September 11, v3.9.2 on September 17 and v3.9.3 on September 24, 2026, with the repository pushed the same week, and the documentation is bilingual with English and simplified Chinese readmes and a docs site at modernjs.dev. The community lives on Discord with the team and users active, contributions welcome through the contributing guide under the ByteDance Open Source Code of Conduct, and AGENTS.md plus CLAUDE.md at the root configure coding agents for contribution. The homepage, npm package at at-modern-js/core and npm-compare badge complete the public surface of a framework maintained as infrastructure rather than a side project.
Editorial conclusion
Use Modern.js when starting a React application that should grow from simple to full-featured within one framework, progressively adopting routing, data loading and BFF capabilities, and when ByteDance-scale production validation matters. Prefer plain Vite or Rsbuild with hand-picked libraries when you want minimal framework commitment. Before adopting, read the Quick Start for the project scaffolding, browse the ready-to-use examples repository for your deployment shape, and note the relationship to its sibling tools, Rsbuild is the build layer rebranded from Modern.js Builder, so framework and tooling versions move together but document separately.
Frequently asked questions
what is modern js?
Modern.js is ByteDance's progressive web framework based on React, MIT licensed, supporting all configurations and tools React applications need with built-in routing, data acquisition and state management that developers adopt gradually. ByteDance uses it to build upper-level frameworks that have supported thousands of web applications.
How does Modern.js relate to Rsbuild?
Rsbuild is an Rspack-based build tool rebranded from Modern.js Builder, so the framework's build layer became a standalone product in the same ecosystem. Modern.js sits on Rsbuild and Rspack, and the family also includes Rspress for static sites and Rslib for library development.
What is the difference between Modern.js and React?
React is the UI library Modern.js builds on, while Modern.js adds the framework layer around it, configurations, build tooling, routing, data acquisition and state management. Developers write React for the UI and gradually adopt Modern.js features for the application concerns React leaves open.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/web-infra-dev-modern-js)