Build and dev/Vite and Nitro

Vite and Nitro

Why there is no index.html, and how the two engines sit inside BionicJS.

Why no index.html

A plain Vite project exposes index.html because Vite uses it as the application entry point. The developer owns it, edits it, and controls the HTML structure from it.

BionicJS is a framework, not a Vite template. The difference matters: when BionicJS owns the application model, the developer should not need to edit an HTML file. They write app/layout.tsx and app/page.tsx. That is the application root.

ⓘ
Next.js does not expose an index.html. React Router's framework mode replaces it with root.tsx. BionicJS makes the same call: app/layout.tsx is the root. The HTML shell is generated internally.

Internally, BionicJS generates an HTML entry point that Vite uses. The developer never sees it or edits it. Changes to the <html> element, <head> tags, or favicon are handled through app/layout.tsx and bionicjs.config.ts.

Vite inside BionicJS

BionicJS uses Vite as its frontend development and build tool. Vite is not exposed to the developer as a configuration surface. There is no vite.config.ts in a BionicJS project.

Internally, BionicJS creates the Vite configuration programmatically when the dev server starts. The configuration includes:

  1. @vitejs/plugin-react for JSX and Fast Refresh
  2. The BionicJS Vite plugin for route discovery and manifest generation
  3. The proxy rule forwarding /api requests to Nitro
  4. The historyApiFallback configuration for SPA routing
  5. The root and entry pointing to internal BionicJS files

A developer who needs to extend Vite's configuration does so through bionicjs.config.ts, not by writing a Vite config directly.

Nitro inside BionicJS

Nitro provides the server runtime. It handles HTTP requests, compiles server code, and supports deployment to multiple targets - Node.js, Cloudflare Workers, Deno, Bun, and more.

There is no nitro.config.ts in a BionicJS project. BionicJS creates the Nitro configuration internally; API requests run through h3 handlers. Server code lives in server/ and is auto-discovered by Nitro's filesystem convention for server routes.

ⓘ
Nitro's own server filesystem convention applies only to server/. BionicJS's application filesystem convention applies to app/. These two conventions do not overlap.