Documentation Menu

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.json with startnpm start

Python:

  • Django — python manage.py migrate && gunicorn against detected WSGI app
  • FastAPI — uvicorn main:app --host 0.0.0.0
  • Flask — gunicorn app:app
  • Plain requirements.txt — runs python main.py if present

Ruby:

  • Rails — bundle exec rails db:migrate && bundle exec rails server

Go:

  • Modules with main.gogo build + run the binary

Other:

  • Dockerfile present — we build the image and run it as-is
  • docker-compose.yml present — see Compose import

Detection signals

We look at:

  • package.json (deps + scripts)
  • requirements.txt / pyproject.toml / Pipfile
  • Gemfile
  • go.mod
  • Dockerfile
  • next.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.json to lock in the right ones.
  • Add a Dockerfile for the most control.