| Project | An app, with one or more services | See Deploying apps. |
| Git deploy on push | A git source with trigger_mode: push, from a GitHub, GitLab, Bitbucket, or Gitea connection | Provider connections are set up in the dashboard only. Path filters (--paths, --paths-ignore) exist. See Git integrations. |
| Build with framework preset | build.type: railpack (Node.js is a supported provider) or build.type: dockerfile | The “Deploy from git” wizard shows what Railpack detects before you build. Only Node.js, Go, Java (Spring Boot), and Python are accepted. |
output: "standalone" with your own Dockerfile | build.type: dockerfile, with build.args for ARG values | Use this when you need control over the image. You own the Dockerfile. Build args are not stored with the app, see the build-time section below. |
Static export (output: "export") | build.type: static, served by the embedded Caddy with no container | Static runs no build step. It copies build.path (relative to the repo root, or to build.baseDirectory) from the commit as it is, so the exported out/ directory must be committed. Otherwise build with dockerfile or railpack. Deploy it with apps deploy-spec <app> --file app.yaml --repo-url URL --ref main, or apps create --file, which routes a static service through the same path. The spec forbids port, host_port, bind_address, and hooks. |
| Production and Preview environments | Optional environments inside a project. Apps are tagged with one. Promote copies only the image tag to a sibling app in another environment | Env vars stay per app, so a staging and a production app each keep their own. See Projects and organizations and Promote details. |
| Environment variables | Plain env (apps env import --file), encrypted secrets (apps secrets set --env-file), or Vault references | Plain import skips keys that are already secrets. Export never includes secret values. |
| Sensitive env vars | apps secrets set, envelope-encrypted and write-only | Never returned by the API after save. |
| Shared env vars | Shared env scoped to a project, organization, or environment (shared-env set) | See Projects and organizations. |
| Preview deployments per pull request | Preview environments per PR, opt-in per app: apps previews enable <app>. Deployed as <app>-pr-<number>, torn down on close or merge | GitHub, GitLab, Bitbucket, and Gitea. The preview domain is pr-<number>.<app>.<primary-domain> and needs a control-plane primary domain. There is no per-branch preview URL. See Git integrations. |
| Preview-only env values | apps preview-env set, and branch-scoped apps branch-env set | Single-service previews only. |
| PR comment with preview URL | A PR comment and a levelrail/preview commit status, when apps previews pr-status enable is on | One comment per PR, kept up to date. |
| Deployment protection | Protected environments and deploy approvals | Deploy approvals are labeled stable in feature status. |
| Domains | domains: in the app spec, or apps domains add. Caddy routes by Host and handles TLS | Point an A or AAAA record at the server. See Domains and ingress. |
www to apex redirect | Add www to the app’s domains, then domains redirect set <app> www.example.com --target https://example.com (301, 302, 307 or 308), or domains redirects canonical <app> example.com www-to-apex to attach www and redirect it in one step | The target must be an absolute URL. A bare origin target keeps the request path and query; a target with its own path always redirects there. |
| Automatic HTTPS | Caddy internal issuer by default (self-signed), or real ACME once enabled in settings | ACME has one recorded live run on a public VPS, with renewal and wildcards not yet verified. Bring-your-own certificate is also supported. |
| Instant Rollback | apps deploys rollback-to <app> <deploy-id> (pinned by digest), apps rollback <app> --image <tag> for a tag listed by apps images <app>, the dashboard’s per-deploy Rollback button, and auto-rollback on crashloop | Prior images are pinned so garbage collection cannot remove a rollback target. Take the deploy id from apps deploys list <app>. |
| Cron Jobs | Scheduled tasks: apps scheduled-tasks create, with a 5-field cron expression and an argv command run inside the running container | Not an HTTP call. To trigger a route, the command must use something present in your image. Confirm the tool exists in the image. |
| Runtime and build logs | apps logs, apps deploys logs, a node-local log store with full-text search, and live build steps | See Observability. |
| Firewall and rate limiting | Opt-in WAF (detect or block) and rate limiting per domain | See Domains and ingress. |
| Maintenance page | Per-domain maintenance mode | Takes precedence over a redirect. |
| Vercel Postgres, KV | Managed databases (Postgres, Redis, and others) with scheduled backups | You dump and restore the data yourself. See Managing databases. |
| Team members and roles | IAM-style Allow and Deny policies and scoped tokens | See Identity and access. |