Project structure
Where your app code lives and which files Radical and TanStack Start generate.
The installation creates this project. After the first dev run, inspect the files with find src public .radical -type f.
my-app/
├── public/
│ └── offline.html
├── src/
│ ├── routes/
│ │ ├── __root.tsx
│ │ └── index.tsx
│ ├── router.tsx
│ ├── routeTree.gen.ts # Generated by TanStack Start
│ ├── server.ts
│ └── start.ts
├── .radical/ # Generated by Radical
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
└── vite.config.tsApp files
| File | Purpose |
|---|---|
vite.config.ts | App identity, delivery mode, native capabilities, and Vite plugins |
src/start.ts | Request middleware and typed server-function context |
src/server.ts | SSR handler and offline response headers |
src/router.tsx | Router instance and optional navigation integrations |
src/routes/__root.tsx | HTML document, native-context loader, provider, and safe-area layout |
src/routes/index.tsx | The / page |
public/offline.html | Standalone fallback for remote offline loading |
TanStack Start discovers file routes inside src/routes. For example, src/routes/about.tsx defines /about. See TanStack file-based routing for nested and dynamic routes.
Generated files
Start maintains src/routeTree.gen.ts. Change route files instead of editing the generated tree.
Radical writes metadata and generated plugin types under .radical during Vite configuration and startup. Native commands generate .radical/android and .radical/ios. Builds write web output to dist.
Add these entries to .gitignore:
node_modules/
.radical/
.tanstack/
dist/Native projects are disposable build output. Keep identity, assets, permissions, and plugin settings in your Vite config and app-owned files. Regeneration replaces native projects, so direct changes there do not survive.
Continue with run on Android or iOS.