Getting started

Deploy your first app

Connect GitHub, import a repository, check what was detected, and get a live HTTPS address.

Connect GitHub

The panel deploys from GitHub through a GitHub App of your own, which your server creates under your GitHub account or an organization. The app gives the panel access to the repositories you choose, sends it a signed webhook on every push, and lets GitHub show each commit's deploy status. The server never holds git credentials, and the app's private key never leaves the server.

  1. Open New project. The first time, it asks you to connect GitHub.
  2. Create the app on GitHub's page. For an organization, enter its name first. GitHub sends you back to the panel.
  3. Install the app on the repositories you want to deploy. You can add more later from Settings → GitHub.

A public repository can also be deployed from its URL, without connecting GitHub.

Import a repository

  1. Pick the repository.
  2. If the app lives in a folder of a monorepo, set the root folder.
  3. The panel reads package.json and the lockfile and works out the framework, the package manager, the build command and how the app runs. Configure shows what it found, and every value can be changed. See Project settings.
  4. Add environment variables if the app needs them. You can paste a whole .env file.
  5. Press Deploy.

The deployment page streams the build log live. When it's done, the app is live at https://<app>.<apps domain>, like https://my-app.203-0-113-7.sslip.io.

Push to deploy

From now on, every push to the project's branch deploys on its own, and GitHub shows its status next to the commit. Redeploy on the project's page builds the latest commit again, and every past deployment can be rolled back to in one click. Deployments explains each step.

Before you go live

  • Keep data in DATA_DIR. Each deploy builds into a fresh folder, and that folder can't be written once the app runs. The one folder that survives deploys is DATA_DIR (/srv/apps/<app>/data). Put SQLite databases and uploads there, reading the path from process.env.DATA_DIR:

    const dataDir = process.env.DATA_DIR || path.join(process.cwd(), "data");
    
  • Listen on PORT. The server sets PORT and HOST (127.0.0.1) for your app. Next.js, Nuxt and most frameworks use them on their own; a custom server should listen on process.env.PORT.

  • Add your domain on the project's Domains page.

  • Turn on backups before real data arrives.