Supported stacks
Orizon inspects your files to choose how to build and run your app. Here's what it detects and the one rule server apps must follow.
Detection order
Detection runs top-down — the first match wins — so an explicit Dockerfile always takes precedence over framework heuristics:
- Docker — a
Dockerfileordocker-compose.ymlis present. - Next.js — a
next.config.*ornextinpackage.json; run as a server. - Go — a
go.modor.gofiles. - Rust — a
Cargo.toml. - PHP — a
composer.jsonor.phpfiles (with an optionalpublic/docroot). - Python —
requirements.txt,pyproject.toml, or.pyfiles. - Node / Bun — a
package.json; Bun is used when a Bun lockfile is present. - Procfile — a custom start command via
Procfile. - Static — a lone
index.html.
You can review and override the detected build in the deploy flow before shipping.
The PORT contract
Every server app on Orizon must listen on the port given by the PORT environment variable. Orizon runs your container with PORT=3000 and proxies public HTTPS traffic to that port. Bind to 0.0.0.0, not localhost.
// Node / Express
app.listen(process.env.PORT || 3000, "0.0.0.0");
# Python / Gunicorn
gunicorn app:app --bind 0.0.0.0:$PORT
// Go
http.ListenAndServe(":"+os.Getenv("PORT"), nil)Who doesn't need PORTStatic sites and PHP apps are served directly behind Caddy — there's no long-running server you manage, so the PORT contract doesn't apply to them.
Anything else
If your stack isn't auto-detected, add a Dockerfile — that gives you full control over the build and runtime and works for any language or framework.