Frameworks

Servano auto-detects your framework from the repository contents and configures the build for you. You can override every detected value in the project configuration step.

Detection

At build time Servano inspects your repository (lockfiles, package.json dependencies and scripts, config files) and picks a build profile:

| Framework | Detected by | Build command | Serves | | --- | --- | --- | --- | | Next.js | next dependency | npm run build | Node server (standalone) | | Node.js (Express, Fastify, NestJS…) | start script, no frontend framework | npm install | npm run start | | Vite | vite.config.* | npm run build | Static from dist/ | | React (CRA-style) | react-scripts | npm run build | Static from build/ | | Astro | astro.config.* | npm run build | Static from dist/ | | Static HTML | index.html, no build step | none | Repository root |

If nothing matches, Servano falls back to npm run build + npm run start and tells you what it could not detect so you can adjust the commands.

Node.js runtime

  • Node.js 20 LTS by default; set "engines": { "node": "22.x" } in package.json to choose another version.
  • Your app must listen on the port given by the PORT environment variable — every major framework does this automatically.
  • Install runs with npm ci when a lockfile is present, npm install otherwise. pnpm and yarn lockfiles are respected.

Static sites

Static builds are served from our infrastructure in Athens, Greece — behind Cloudflare's CDN — instead of running a container — they are covered by the Static plan and scale effortlessly.

Build environment

  • 4 GB RAM, 2 vCPU build containers, 15-minute build timeout
  • Dependency cache between builds of the same project
  • Environment variables are injected at build time and runtime

Something not building the way it should? Check the full build log on the deployment page — every command's output is captured line by line.