Framework detection
What we recognize and how to override.
When you create a project, we look at the repo and pick build + run commands automatically.
What we detect
Node.js:
- Next.js —
next build+next start - Astro —
astro build+node ./dist/server/entry.mjs(SSR) or static - SvelteKit —
vite build+node build - Remix —
remix build+remix-serve build - Vite (React/Vue/Svelte) —
vite build+ static serve - Nuxt —
nuxt build+nuxt start - Express / Fastify / Nest / Koa —
npm start - Plain
package.jsonwithstart—npm start
Python:
- Django —
python manage.py migrate && gunicornagainst detected WSGI app - FastAPI —
uvicorn main:app --host 0.0.0.0 - Flask —
gunicorn app:app - Plain
requirements.txt— runspython main.pyif present
Ruby:
- Rails —
bundle exec rails db:migrate && bundle exec rails server
Go:
- Modules with
main.go—go build+ run the binary
Other:
Dockerfilepresent — we build the image and run it as-isdocker-compose.ymlpresent — see Compose import
Detection signals
We look at:
package.json(deps + scripts)requirements.txt/pyproject.toml/PipfileGemfilego.modDockerfilenext.config.*,astro.config.*, etc.
If multiple frameworks are detected (monorepo), we pick by directory heuristics. Override below if it picks wrong.
Overriding
Add deploy.json to your repo root. See
deploy.json reference. Or set
overrides in the Suzko project settings under Build.
Common overrides:
{
"build": "pnpm install && pnpm build",
"start": "pnpm start",
"port": 3000
}
Build & runtime caches
We cache node_modules, ~/.cache/pip, ~/.bundle, and Go module
caches between builds for the same project. Cold builds take longer.
When detection fails
Symptoms: container starts but immediately exits, or build runs the wrong command. Fixes:
- Check the build logs for the inferred commands (printed at the top).
- Add
deploy.jsonto lock in the right ones. - Add a
Dockerfilefor the most control.