Deplo

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.

The second card, with the repository picked and the branch chosen

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.json and 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.
The third card, with the framework, the build and deploy commands and the Advanced drawer

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:

SettingWhat it is
Deploy toWhich server runs it. A single-machine install has one, already picked.
Environment variablesType them, or tick the team's shared variables. Both reach the first build.
Build methodNixpacks, Railpack, a Dockerfile, or a static site, with its version and the container port.
Build pathThe sub-folder to build from, for a monorepo.
Build onAnother server to compile on. Automatic uses a build server if the fleet has one.
GitDeploy on push or on tag, watch paths, submodules.
Extra compose flagsCompose 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.yml is 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

TabWhat's there
OverviewThe production deployment, the last four builds, the URL
DeploymentsEvery build, with Redeploy, Rollback and Delete
DomainsAdd your own hostname
EnvironmentVariables for this app
LogsWhat the container is printing, live
MonitoringCPU, memory, network and disk for this app
BackupsSchedules and restores
SettingsSource, 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.
  • Error means 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 build or start script, 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 denied on 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?

On this page