Why a meta-framework
What React leaves to you, and the layer BionicJS adds on top.
What React gives you
React is a rendering library. It gives you a component model, a reconciler, hooks for state and side-effects, and a way to describe UI as a tree of function calls. That is everything.
React does not give you: a router, a way to load data, a server, a build pipeline, conventions for where files live, a way to handle direct browser requests, a development server, or a deployment model. Every React application has to assemble all of that separately.
1React - the rendering library
2React DOM - mounting React to the browser
3A router - React Router, TanStack Router, or custom
4A bundler - Vite, Webpack, Parcel, or rspack
5A dev server - provided by the bundler
6A server - Express, Fastify, Nitro, Bun, Deno...
7Conventions - invented by you
All of those decisions are fine ones individually. But assembling them correctly, consistently, and in a way that works together - that is the problem a meta-framework solves.
What is missing
Without a meta-framework you end up with a folder structure you invented, a router you configured by hand, a build pipeline you stitched together, a dev server you run in one terminal, a backend you run in another, and conventions that live only in your team's memory.
The practical cost of that is real. Onboarding is slower. Configuration drift compounds. Every project looks different. The framework imposes none of the constraints that make a codebase understandable three months later.
The meta-framework layer
A meta-framework sits above its underlying tools. It makes choices on your behalf about how those tools are configured, combined, and presented. The developer interacts with the framework; the framework interacts with Vite, React Router, and Nitro.
1BionicJS
2|-- Filesystem routing # app/page.tsx becomes /
3|-- Internal Vite config # no vite.config.ts required
4|-- Internal Nitro config # no nitro.config.ts required
5|-- BionicJS dev runtime # one public origin at localhost:3000
6|-- bionicjs.config.ts # one config file
7`-- BionicJSRouter # routes wired from filesystem
The developer never configures Vite. They never configure Nitro. They write app/about/page.tsx and it routes to /about automatically. That is the meta-framework contract.
BionicJS vs Next.js
Next.js is the dominant React meta-framework. It is a useful reference not because BionicJS copies it, but because it defines what the category means.
| Concern | Next.js | BionicJS |
|---|---|---|
| Routing | App Router (RSC, server components) | Filesystem routing - React Router (client) |
| Rendering | SSR, SSG, streaming, RSC | CSR first, SSR planned |
| Server | Node.js / Edge runtime | Nitro (cross-platform) on h3 |
| Config | next.config.ts | bionicjs.config.ts |
| Bundler | Turbopack / Webpack | Vite |
| Font/Image | next/font, next/image | Standard web APIs (framework primitives planned) |
| Python | Not supported | First-class, co-located |
BionicJS's goal is not to out-feature Next.js. Its goal is to make the TypeScript + Python pair native in a way that no other framework does - and to do it with better DX than bolting FastAPI onto a Next.js app.
01 / 25