Skip to content

Addis Ababa, Ethiopia. Support on 6993.MCP ready. Attach your agents 100% self-service. Sign up using google or phone number. No sales call to get started

System status

Deploying apps

Framework guides

What is detected for each stack and what has to be provided.

On this page

Detection covers most projects with no configuration at all. Where a stack needs one small change to run on a container host, it is called out below. Everything here assumes the port contract in How deploys work.

Next.js

Detected from a next dependency in package.json, then built and served, standalone output included. Next reads PORT on its own, so there is usually nothing to change.

Vite, React and Vue

Detected from vite, react-dom, react-scripts or vue in package.json. These build to static files, which are served directly: fast, and with no Node process to keep alive.

Check that the production build script actually produces its output directory, usually dist or build. Never set vite dev or npm start as the production command for a static site. A dev server binds localhost only and is not built for production traffic.

Angular

Detected from angular.json and built to static output. Angular Universal, or any SSR mode, produces a Node server instead, which has to read PORT and bind 0.0.0.0 like any other Node app.

SvelteKit

A project scaffolded with npm create svelte ships with @sveltejs/adapter-auto. That adapter picks its output by looking for environment variables set by specific hosts. On a general-purpose container host those variables are absent, so it cannot pick a target and produces a build with no runnable server. Switch to the Node adapter.

bash
npm install @sveltejs/adapter-node​npm uninstall @sveltejs/adapter-auto​

Then import the Node adapter in svelte.config.js and add a start script.

javascript
// svelte.config.js​import adapter from '@sveltejs/adapter-node';​​// package.json​"scripts": { "start": "node build" }​

adapter-node binds 0.0.0.0 and reads PORT by default, so once it is in place the health check can reach the app.

Node.js

Detected from package.json, and the start script is used if there is one. Express, Fastify, Koa, NestJS and Hapi all work. The only requirement is that the server reads PORT and binds 0.0.0.0.

Python: Django, Flask and FastAPI

Detected from requirements.txt or pyproject.toml, with the framework identified from the dependencies and from manage.py for Django. Serve with a production server, gunicorn or uvicorn, bound to the port the container is given.

bash
# Django or Flask (WSGI)​gunicorn myproject.wsgi:application --bind 0.0.0.0:$PORT​​# FastAPI (ASGI)​uvicorn main:app --host 0.0.0.0 --port $PORT​

Do not use manage.py runserver or flask run in production. Both are development servers, and runserver binds localhost by default. For Django, set ALLOWED_HOSTS to include the app’s domain, or every request returns a 400.

Spring Boot

Detected from a Maven pom.xml or a Gradle build file containing Spring. Spring Boot defaults to port 8080, so point it at the one it is given, either in application.properties or with a flag at startup.

properties
# application.properties​server.port=${PORT:8080}​server.address=0.0.0.0​

Spring Boot apps are often slow to start, which is fine: the liveness check does not begin until sixty seconds in. The readiness window still applies, so avoid blocking startup on a slow external call.

PHP and Laravel

Detected from composer.json, from the artisan file for Laravel, or from a bare index.php. Laravel apps are served through a web server, so the port does not need managing by hand. Set APP_KEY as an environment variable, and remember that migrations do not run on their own: run them from the app once the database is connected.

Static sites

A repository with an index.html and no framework is served as it is. This is the cheapest and most reliable thing to host: no process, nothing to health check, nothing to restart.

Anything else

A stack that cannot be identified falls back to Cloud Native Buildpacks, which covers Go, Rust, Ruby, Java and .NET among others. A repository carrying its own Dockerfile takes precedence and is built instead, which is the escape hatch for anything unusual.

Whatever the stack: read PORT, bind 0.0.0.0, and never ship a development server as the production command. Almost every framework-specific problem comes back to one of those three.

Support is free, and a person answers.

Call 6993System statusContact