# Frameworks Toupas recognises

Detected from the app's files; every default can be changed in `toupas.json`.

| Preset | Detected by | Kind | Defaults |
|---|---|---|---|
| `vite` | `vite` dependency / `vite.config.*` | static | `npm run build` → `dist`, single-page app |
| `create-react-app` | `react-scripts` | static | `npm run build` → `build` |
| `astro` | `astro` (static output) | static | `npm run build` → `dist` |
| `sveltekit-static` | `@sveltejs/adapter-static` | static | `npm run build` → `build` |
| `nextjs-export` | `output: "export"` in the Next config | static | `npm run build` → `out` |
| `nextjs` | `next`, without `output: "export"` | server | Needs `output: "standalone"` in the Next config; starts `node server.js` |
| `express` / `node` | `express`, another server library, or a `start` script | server | `npm ci`, `npm run build` if there is one; starts the `start` script, or `node` with `main`, `server.js`, `index.js` or `app.js` |
| `fastapi` | `fastapi` | server | Starts `uvicorn <module>:<app> --host 0.0.0.0 --port $PORT`. Needs `uvicorn` (or `fastapi[standard]`) in the dependencies |
| `flask` | `flask` | server | Starts `gunicorn -b 0.0.0.0:$PORT <module>:<app>`. Needs `gunicorn` in the dependencies |
| `python` | `requirements.txt`, `pyproject.toml` or `uv.lock` | server | Set `start` in `toupas.json` |
| `static` | an `index.html` and nothing else | static | The folder as it is |

**Package managers:** `package-lock.json` → `npm ci`, `pnpm-lock.yaml` → pnpm, `yarn.lock` → yarn; `uv.lock` → `uv sync`, otherwise `requirements.txt` → pip. Without a lockfile the app still builds, with a warning.

**Apps with their own server** are prepared in Docker on the user's computer, so Docker Desktop must be installed and running (`toupas_doctor`, `toupas_setup_docker`). Static sites don't need it.
