Dibbla Docs Get started Guides Workflows Changelog
Open Console
Reference · CLI

dibbla deploy & apps

Build the current directory as a container, push it to the Dibbla platform, and manage the resulting application — env vars, replicas, CPU, memory, port, access policy.

dibbla deploy packages a directory containing a Dockerfile and ships it to your Dibbla organization. The resulting app is reachable at https://<alias>.dibbla.com.

dibbla apps is the CRUD surface for already-deployed apps: list them, change their config, or delete them.

dibbla deploy

Build and push the contents of [path] (defaults to .) as a Dibbla application.

Requirements

  • A Dockerfile at the deploy root.
  • The Dockerfile must expose a port and define an entrypoint.
  • Authentication via dibbla login or DIBBLA_API_TOKEN.
  • REVIEW.md at the deploy root, and a handbook at docs/index.md (or APP.md) whose frontmatter carries a subtitle: — non-empty, not placeholder text, and 140 bytes or fewer.

The last one is a client-side gate: dibbla deploy checks for both files and exits 1 before uploading anything. --skip-review bypasses it. See Deploy your first app for what belongs in each file.

Symlinks inside the deploy directory are followed and packaged as regular files. Symlinks whose target escapes the deploy root (including absolute symlinks like /etc/passwd) are skipped — you can’t accidentally upload host files.

Flags

FlagPurpose
[path] (positional)Directory to deploy. Default: ..
-a, --alias <name>Custom app alias. Default: directory name. The alias becomes the subdomain.
-f, --forceReplace an existing alias. Causes downtime. Mutually exclusive with --update.
-u, --updateRolling update of an existing alias — zero downtime.
-e, --env KEY=valueSet an env var. Repeatable. Overrides --env-file per key.
--env-file <path>Load env vars from a .env-style file. The file is the base layer; -e overrides individual keys. See env precedence and .env file format.
--cpu <value>CPU request, e.g. 500m or 1.
--memory <value>Memory request, e.g. 512Mi or 1Gi.
--port <value>Container port the app listens on.
--favicon <url>Favicon URL shown in the Dibbla dashboard and browser tab.
--require-loginRequire authenticated access.
--access-policy <value>all_members or invite_only. Effective when --require-login is set. (email_domain needs a domain list, which no flag supplies — set it in the console.)
--google-scopes <scope>Additional Google OAuth scope. Repeatable.
-m, --message <text>Deploy message — used as the VCS commit subject in your app’s deploy history.
--microsoft-scopes <scope>Additional Microsoft OAuth scope. Repeatable.
--skip-reviewSkip the REVIEW.md + handbook gate.
--target-env <name>Deploy to a named target environment.
--profile <name>Use a named resource profile.
--no-publicDo not expose the app publicly.
--verbose-buildStream full build output.
-q, --quietPrint only the URL on success. Mutually exclusive with --json.
--jsonPrint the JSON response body. Mutually exclusive with --quiet.

Examples

# Deploy current directory using its name as the alias
$dibbla deploy -m "feat: initial deploy"
[info] deploy   deployment_id=dep_wuk1bfahjdua
[info] build    step=13/23 done name=go-build elapsed=6.5s
[info] rollout  phase=rollout-start strategy=create
[info] rollout  phase=route-done
[info] deploy   status=ok url=https://hello-world-b4687da9.dibbla.com elapsed=19.7s
 
deploy ok  ·  https://hello-world-b4687da9.dibbla.com  ·  19.7s
# Keep the .env outside the deploy root — see the guardrail note below
$dibbla deploy . \
  --env-file ../secrets/.env.prod \
  -e LOG_LEVEL=debug \
  -m "feat: initial deploy"
 
# The file seeds every var; -e wins for LOG_LEVEL
$dibbla deploy ./api \
  --alias my-api \
  --cpu 500m --memory 512Mi --port 3000 \
  -e NODE_ENV=production -e LOG_LEVEL=info \
  -m "feat: add /healthz endpoint"
# Zero-downtime redeploy of an existing alias
$dibbla deploy --update -m "fix: correct the totals query"
[info] rollout  phase=rollout-start strategy=rolling
[info] deploy   status=ok url=https://my-api-b4687da9.dibbla.com elapsed=24.1s
# Replace existing alias (causes downtime)
$dibbla deploy --force --alias my-api -m "chore: rebuild from scratch"
[info] rollout  phase=rollout-start strategy=replace
What you see depends on where you run it

These transcripts are the non-interactive form — one structured line per event — which is what you get in CI or when piping. In an interactive terminal the CLI renders a live step table under BUILD, DEPLOYED and SERVICES headers instead. Same events, different presentation.

`--force` causes downtime.

--force tears down the existing deployment before starting the new one. Use --update for zero-downtime rolling updates of an alias that already exists. The two flags are mutually exclusive.

.dibblaignore

The platform keeps a server-side version-controlled history of every deploy. Use a .dibblaignore at the deploy root to filter what’s committed (it does not affect the Docker build — Dockerfile’s own COPY rules do that).

The syntax is gitignore-style — **, directory globs, and negation all work.

build/
dist/
*.tsbuildinfo
coverage/
.nyc_output/
.env
.env.local
.vscode/
.idea/
*.swp
.DS_Store
data/*.parquet
fixtures/*.bin

The platform filters the following paths out of the managed repository, regardless of .dibblaignore:

  • node_modules/, dist/, .venv/, .git/
  • .env* files
  • *.pem, *.key

A hit is filtered with a warning, not rejected — the deploy proceeds without the file. Only the size caps stop a deploy outright.

The list ends where it is written: it matches extensions, so a key stored under a bare name — id_rsa, id_ed25519 — is not caught and does end up in the repository. Do not treat this filter as a safety net; it is a backstop for the two or three most common accidents.

`--env-file` and the `.env` guardrail are not in conflict.

--env-file reads the file client-side and sends the values over the authenticated API — the file is never added to the build context or to VCS. That is safe. What is not safe is a .env sitting in the directory you deploy: that is a pre-deploy guardrail blocker and is stripped from VCS regardless. Keep the file outside the deploy root and point at it by path:

dibbla deploy . --env-file ../secrets/.env.prod -m "feat: initial deploy"

Per-file and per-commit size limits are enforced server-side; oversize files cause the deploy to fail with an ErrCodeVCSFiltered error.

dibbla apps list

Print every deployed app in the org with its URL, status, and last deploy time.

$dibbla apps list
🌱 Retrieving Dibbla applications...
 
Found 3 applications:
 
ALIAS                URL                                      STATUS          LAST DEPLOYED
-----                ---                                      ------          -------------
my-api               https://my-api.dibbla.com                running         2026-04-28 14:02:11
ops-tool             https://ops-tool.dibbla.com              running         2026-04-27 09:14:38
billing              https://billing.dibbla.com               sleeping        2026-04-16 17:30:22

dibbla apps update

Change the configuration of a deployed app without a fresh deploy. At least one flag is required.

Flags

FlagPurpose
<alias> (positional, required)Target app alias.
-e, --env KEY=valueSet an env var. Repeatable. Overrides --env-file per key.
--env-file <path>Load env vars from a .env-style file. The file is the base layer; -e overrides individual keys. See env precedence and .env file format.
--replicas <n>Desired number of replicas.
--cpu <value>CPU request/limit, e.g. 500m, 1.
--memory <value>Memory request/limit, e.g. 256Mi, 512Mi.
--port <n>Container port (1–65535).
--favicon <url>Favicon URL. Use "" to clear.
--require-login true|falseToggle authenticated access.
--access-policy <value>all_members, invite_only, or "" to clear.
--google-scopes <scope>Repeatable. Use "" to clear.

Examples

$dibbla apps update my-api -e NODE_ENV=production --replicas 2
✏️ Updating deployment 'my-api'...
 
✅ Deployment updated successfully.
 
   Alias:  my-api
   URL:    https://my-api.dibbla.com
   Status: running
   Health: ok (398ms)
$dibbla apps update my-api --cpu 500m --memory 512Mi --port 3000
$dibbla apps update my-api --require-login true --access-policy invite_only

dibbla apps restart

Trigger a rolling restart of one service, without redeploying. This is how a changed secret reaches running pods — saving a secret updates the store, but a container reads its environment only at start.

FlagPurpose
<alias> (positional, required)App to restart.
-s, --service <name>Required. Service to restart. For a single-service app the conventional name is app; for a manifest deploy, the name as it appears in dibbla.yaml.
-q, --quietPrint only the alias on success.
--jsonPrint the JSON response body.

Idempotent in the sense that it always succeeds — but not a no-op: calling it twice produces two pod rollouts.

# single-service app
$dibbla apps restart my-app --service app
 
# one service of a multi-service app
$dibbla apps restart my-app -s worker

dibbla apps delete

Permanently delete an app. The alias becomes available for reuse.

FlagPurpose
<alias> (positional, required)App to delete.
-y, --yesSkip the confirmation prompt.
$dibbla apps delete my-api
🗑️ Attempting to delete application 'my-api'...
 
? Are you sure you want to delete 'my-api'? This action cannot be undone. (y/N)
 
✅ Application 'my-api' deleted successfully

See also

  • dibbla secrets — set env vars that shouldn’t appear in deploy commands, or bulk-load a whole file with secrets import without redeploying.
  • dibbla db — provision a Postgres and bind a DATABASE_URL secret to your app.
  • dibbla run — run a dibbla-task.yaml pipeline locally before you deploy.