Deploy from Git
Create an application from a GitHub, GitLab or Bitbucket repository — choosing a rendering type, build command and deploy script.
From Git repo clones your own code onto the server and serves it. It is the only type where the panel does not know what it is installing, so the form asks the two questions it cannot guess: where the code comes from, and how it should be served.
1. Choose the source

Use a connected account lists the repositories a connected GitHub, GitLab or Bitbucket account can see, including private ones, and fills Branch from the repository. Connect an account first under Integrations → Git; until you do, the picker shows "No Git account connected yet" with a link to it.
Use a public repository URL takes any clone URL and needs no credentials.

Private repositories need an account
A public URL is cloned anonymously. A private repository has to come through a connected account — the panel will not take a token pasted into the URL.
2. Choose a rendering type
This is the field that decides everything below it, and it has no default on purpose:
| Option | What the server does |
|---|---|
| PHP application (Laravel, Symfony, plain PHP) | Serves the repository through PHP-FPM, like any other PHP site. |
| Server-side rendering (runs a process) | Starts your app as a long-running process and proxies to it. |
| Client-side rendering (built to files) | Runs a build, then serves the output directory as static files. |
| Static site (built to files) | Serves the repository as static files, with an optional build. |
As the form puts it: "Server-side rendering runs your app and proxies to it. The other two build to files the web server hands out directly — faster, and nothing to keep running."
Getting it wrong is not cosmetic. A Node app served as a directory publishes its source; a PHP app served by proxy is a permanent 502.
3. Fill in what that choice reveals
Picking server-side or client-side rendering adds the Node fields:

| Field | Notes |
|---|---|
| Node.js version | Optional. Left unset, the build and the process run on whatever node resolves to on the server. |
| Package manager | npm, yarn, pnpm or bun. Choosing one fills in the build command below — "edit it freely afterward". |
| Start command | Server-side rendering only, and required. The entry file, e.g. node server.js. |
| App port | Server-side rendering only. Left empty, the panel picks a free one. |
Not `npm start`
The form is explicit about this: "The entry file, for example 'node server.js'. Not 'npm start' — a package manager forks the real process, so shutdown signals never reach it." A process started through a package manager will not stop or restart cleanly.
A PHP application gets the PHP version picker instead, and no Node fields at all.
4. Build and deploy commands
Advanced settings holds the two commands that run on every deploy, plus Web root:
| Field | Notes |
|---|---|
| Build command | Runs after the code is fetched — composer install --no-dev, or whatever your package manager filled in such as npm ci && npm run build. |
| Deploy script | Runs after the code is fetched, as your site user and on this site's own PHP version. Leave it empty to use the build command. |
Both are offered at creation rather than only on the Deployment screen afterwards, because the first deploy runs automatically as soon as provisioning finishes — and for anything with migrations, that first deploy is the one that decides whether the site works at all.
Web root matters more here than for packaged applications. A framework that
serves out of a subdirectory needs it set — /public for Laravel, the build
output directory for a client-side rendered app.
After it is created
The first deploy runs on its own. Everything afterwards lives on the application's Deployment screen: deploying again, the deploy history, deploy settings, the runtime, and a webhook so a push redeploys the site.
Limits and caveats
- Node applications are deployable on a PHP stack, but packaged Node apps are not. Rendering type belongs to this type, not to the server's stack — see what your server can host.
- The rendering type cannot be guessed and has no default. You have to answer it.
- A connected Git account is per panel, not per application. Connect it once under Integrations → Git.