Deploy your first app
From any source to a running site, in one wizard.
Deplo is still in beta
Rough edges are expected. The official 1.0 release is planned for Q4 2026.
Deploy it
The wizard is three cards. Only the middle one changes with what you are deploying, and a Docker image, an upload or a Compose file finish on it.
Open the wizard
On the Overview, open Add new, then Application. The wizard takes the whole window; Cancel, bottom left, brings you back.
Pick where the code comes from
Five tiles: GitHub, Git, Docker Image, Upload, Compose. Picking one is the answer, so it carries you straight to the next card. Under them, Template leaves for the catalogue instead.
Already have the archive?
Drag it onto the Overview, or onto the wizard itself, and Deplo opens the Upload step with the file in hand and the name filled in.
Fill in that source
This is the only step that differs between the five.
If no GitHub App is connected yet, click Connect GitHub and follow GitHub's screens. Deplo creates the App for you through GitHub's manifest flow, so there's nothing to copy and paste. Choose the repositories it may see, then pick the repository and branch. See GitHub for the connection in detail.

Set up the app
GitHub and Git only. Deplo has already read the repository, so this card arrives filled in:
- App name, taken from the repository.
- The framework it recognised, and the container port that framework's server binds.
- Build command and Deploy command, read from your
package.jsonand spelled for your lockfile's package manager. Reset empties a field, which hands the decision back to the builder. - Automatic deployments, on, so every push to that branch deploys.

Deploy
Click Deploy, bottom right. Nothing else is required: the server, the URL and the build method all have an answer already.
What's under Advanced
Every card that carries the Deploy button has one Advanced drawer, closed, with the target server named on it so you can see where the app lands without opening it. Inside:
| Setting | What it is |
|---|---|
| Deploy to | Which server runs it. A single-machine install has one, already picked. |
| Environment variables | Type them, or tick the team's shared variables. Both reach the first build. |
| Build method | Nixpacks, Railpack, a Dockerfile, or a static site, with its version and the container port. |
| Build path | The sub-folder to build from, for a monorepo. |
| Build on | Another server to compile on. Automatic uses a build server if the fleet has one. |
| Git | Deploy on push or on tag, watch paths, submodules. |
| Extra compose flags | Compose stacks only: what to append to docker compose up. |
Deploy lands you on the build, streaming live. It survives a page reload and a control plane restart, so closing the tab doesn't cancel anything.
What you get
When the badge turns Running, the app header shows the production URL and a Visit button.
That first URL is a nip.io hostname. nip.io is public wildcard DNS where the last label before .nip.io is your server's IPv4 in hexadecimal, so 9487cf1e resolves to 148.135.207.30 with no DNS records of your own.
It's served over plain HTTP: a nip.io hostname can't hold a certificate. See Add a domain.
How it works
Creating an app writes one row and nothing else. The first deploy is what does the work, and it happens on the server you pick, never on the control plane. What that first deploy does depends on the source:
- GitHub and Git: the agent clones the repository, detects the framework, and builds an image, by default with Nixpacks, so there's no Dockerfile to write.
- Docker Image: nothing is built. The agent pulls the image reference you gave it.
- Upload: the agent unpacks your archive and builds it exactly like a clone, framework detection included.
- Compose: your
docker-compose.ymlis parsed, checked, and folded with routing, variables and volumes, then brought up as written.
For every source, the control plane renders the final Compose file plus the Traefik routing labels and ships them to the agent, which brings the stack up. The app answers on a generated hostname immediately.
The tabs you now have
| Tab | What's there |
|---|---|
| Overview | The production deployment, the last four builds, the URL |
| Deployments | Every build, with Redeploy, Rollback and Delete |
| Domains | Add your own hostname |
| Environment | Variables for this app |
| Logs | What the container is printing, live |
| Monitoring | CPU, memory, network and disk for this app |
| Backups | Schedules and restores |
| Settings | Source, build, storage, resources, access, danger zone |
Console, Cron jobs and Pull requests appear once you turn them on or once they have something to show. See Console and Cron jobs.
Limits and gotchas
- The name is permanent. An app's slug is frozen after creation. The display name is editable, the slug behind the URLs and volume names is not.
- The first build is the slow one. Nothing is cached yet. Later builds reuse the server's BuildKit cache, shared by every app on that host. Doesn't apply to Docker Image, since it never builds.
- A private repository needs the connection, not a key in the URL. Connect the provider once in Settings -> Git and every app reuses it.
- A private registry needs credentials in Settings -> Registries, not in the image reference.
Errormeans the last deploy failed, not that the app is down. See App status is intent, not observation.
If it does not work
Common failures
- The build fails on a missing command. Your repository declares no
buildorstartscript, so the builder guessed. Set both in Settings -> Deployments. Applies to GitHub, Git and Upload. - The app starts and the URL times out. The container is listening on a different port than the one Deplo routes to. Fix the port in Settings -> Deployments, or per hostname in Domains.
- The repository picker is empty. The GitHub App has no access to it. Click Manage connected apps and grant the repository on GitHub.
pull access deniedon a Docker Image app. The image is private and no registry credential matches its host. Add one in Settings -> Registries.- More in Deploys and builds.
See also
Did this page help you?