deploro.com Open dashboardDashboard

CLI Reference

deploro is the terminal client for the platform. Every command here calls the same REST API documented separately. Credentials are stored in ~/.deploro/credentials.json.

Install & login

npm install -g deploro
deploro login [--url <url>] [--token <token>] [--no-browser] [--password]

Log in to Deploro. Opens your browser, where you check that the code matches the one in your terminal and click Authorize. You never type your password in the terminal. Over SSH, open the printed URL on any device. For CI or servers, pass --token with a personal access token from Dashboard → Settings → Tokens.

--url <url>Worker base URL (defaults to the production API)
--token <token>Personal access token
--no-browserDon't open a browser; print the approval URL instead
--passwordType your email and password in the terminal instead
deploro logout

Log out and clear local credentials.

Projects

deploro projects

List your projects.

deploro create <name> [--slug <slug>] [--repo <url>] [--branch <branch>]

Create a new project and set it active.

--slug <slug>Project slug (derived from name if omitted)
--repo <url>Public repo URL to link (no embedded tokens; for a private repo or auto-deploy on push, use github connect + repo link instead)
--branch <branch>Git branch to deploy from
deploro create "My App" --slug my-app
deploro use <project>

Set the active project. Accepts an id, slug, or name.

deploro delete <project> [-y, --yes]

Delete a project and its database. Accepts id, slug, or name.

db

Database commands. They act on the active project.

deploro db create

Provision the active project's database (idempotent).

deploro db info

Show database status and how to reach it from a deployed app.

deploro db tables

List tables in the active project.

deploro db rows <table> [--limit <n>] [--page <n>] [--json]

List rows in a table.

--limit <n>Rows per page (max 200, default 20)
--page <n>Page number (default 1)
--jsonOutput raw JSON
deploro db query <sql> [--json]

Run a SQL query (admin). Read-only SELECT only; DDL is blocked.

deploro db query "select id, email from users limit 5"
deploro db schema <table>

Show schema for a table.

deploro db insert <table> --data <json>

Insert a row. --data is required, a JSON object.

deploro db insert todos --data '{"title":"Ship it","done":false}'
deploro db update <table> <id> --data <json>

Update a row by id. --data is required, a JSON object of fields to update.

deploro db delete-row <table> <id> [--yes]

Delete a row by id.

deploro db drop <table> [--yes]

Drop a table and all its data (admin).

migrate

Database migration commands.

deploro migrate create <name> [--up <sql>] [--up-file <path>] [--down <sql>] [--down-file <path>]

Register a new migration (admin).

deploro migrate create add_todos --up-file ./up.sql --down-file ./down.sql
deploro migrate list

List migrations for the active project.

deploro migrate apply <id-or-name>

Apply a pending migration (admin).

deploro migrate rollback <id-or-name> [--yes]

Roll back an applied migration (admin).

deploro migrate delete <id-or-name> [--yes]

Delete an unapplied migration (admin).

gen

Generate code from the active project.

deploro gen types [--out <file>]

Write TypeScript types for every table (Row, Insert, Update), SQL function (Args, Returns) and enum in the project database. Prints to stdout unless --out is given. Re-run it after each migration. bigint, numeric and money columns are strings in Row, because the API returns them as strings so large values keep their precision.

deploro gen types --out src/database.types.ts

import type { Tables, TablesInsert } from "./database.types";
const todo: TablesInsert<"todos"> = { title: "Ship it" };

deploy

Deployment commands for the Worker/Pages target. See vps for the separate VPS-compute deploy pipeline. deploy status/deploy logs read the unified timeline, so they also surface VPS-only deployments.

deploro deploy trigger [--site <site>]

Trigger a manual deployment. Deploro builds the connected repo and publishes its build output. See How deploys work for which directory is published and why a Next.js app needs a static export or the OpenNext adapter.

deploro deploy status [--site <site>]

Show latest deployment status. If the latest deploy failed, the failure reason is printed inline along with the exact deploro deploy logs <id> command for the full build transcript. See How deploys work.

deploro deploy logs [deployment-id] [--site <site>]

Show logs for a deployment (defaults to latest). With --site, the latest deployment of that site. Without it, every deploy command uses the main site.

sites

A project can hold several sites that build and deploy independently, for example a marketing site at example.com and an app at app.example.com. They share the project's database, sign-in and storage. Each site has its own repository (or a folder of a shared one), branch, build settings, deployments and hostnames. The project's original site is main. A new site is previewed at <site>--<project>.deploro.app until you point a hostname at it with zones attach --site.

deploro sites list

List the project's sites with their repository, root directory, address and last deploy.

deploro sites create <name> [--slug <slug>] [--repo <owner/repo>] [--branch <branch>] [--root <dir>] [--build-command <cmd>] [--output-dir <dir>] [--install-command <cmd>] [--no-deploy]

Add a site (admin). With --repo it links the repository and starts the first deploy. In a monorepo, --root is the site's folder: pushes that don't change anything under it don't redeploy it. Dependencies install from the repository root when the site's folder has no lockfile of its own.

deploro sites create "Marketing site" --slug web --repo acme/rowwise --root apps/web
deploro zones attach rowwise.com --site web
deploro zones attach app.rowwise.com --site main
deploro sites update <site> [--name <name>] [--root <dir>] [--build-command <cmd>] [--output-dir <dir>] [--install-command <cmd>] [--auto-deploy <on|off>]

Change a site's settings (admin). main is the main site. An empty string resets a command back to auto-detection. Takes effect on the next deploy.

deploro sites delete <site> [-y, --yes]

Remove a site (admin): its deployments, preview address and hostnames go with it. The main site can't be removed.

github

Account-level GitHub OAuth connection, one per platform user. Distinct from repo, which links a specific repo to the active project.

deploro github status

Show whether your GitHub account is connected.

deploro github connect

Print the URL to open in a browser to connect GitHub.

deploro github repos

List repos your connected GitHub account can access.

deploro github disconnect [-y, --yes]

Remove your stored GitHub OAuth token.

repo

The active project's connected repo (auto-deploy from GitHub). Requires github connect first.

deploro repo status

Show the active project's linked repo.

deploro repo auto-deploy <on|off>

Toggle automatic deployment on push.

domains

Self-service custom domains for the active project.

deploro domains list

List custom domains.

deploro domains add <hostname>

Add a domain. Prints the CNAME and TXT records to create at your DNS provider.

deploro domains verify <id-or-hostname>

Verify DNS ownership and register SSL.

deploro domains status <id-or-hostname>

Poll domain verification/SSL status.

deploro domains remove <id-or-hostname> [-y, --yes]

Remove a domain.

email

Send the active project's sign-in emails and your app's own email from your domain. The domain must be a managed domain first (deploro zones add, then switch nameservers).

deploro email status

Sending domains, sender addresses, and recipients sent to today.

deploro email enable <domain> [--subdomain <name>]

Set up a managed domain for sending. Deploro adds the DKIM, SPF and bounce records. --subdomain mail sends from mail.yourdomain.com instead.

deploro email disable <sending-domain> [-y, --yes]

Stop sending from a domain. Its sender addresses are removed.

deploro email add-sender <address> [--name <display-name>]

Allow sending from an address such as hello@yourdomain.com. Apps can only send from addresses added here.

deploro email remove-sender <address> [-y, --yes]

Remove a sender address.

deploro email auth-sender <address|off>

Send the project's sign-in, magic-link, confirmation and password-reset emails from this address. off goes back to auth@deploro.com.

deploro email send --from <address> --to <addresses...> --subject <text> [--text <body>] [--html <body>] [--html-file <path>] [--cc ...] [--bcc ...] [--reply-to <address>]

Send one email. Counts against the project's daily recipient limit (100 by default).

deploro email log [--limit <n>]

Recent emails sent through the API (kept 30 days).

turnstile

Bot checks for the active project's forms. Deploro creates the widget in its own Cloudflare account and keeps the secret; your server checks tokens with POST /turnstile/<slug>/verify (see the API reference). One widget per project, covering every form.

deploro turnstile create <name> [--domain <hostname...>] [--mode managed|non-interactive|invisible] [--test] [--always-fail]

Create the widget and print its site key. Domains default to the project's own hostnames. --test and --always-fail make a local-development widget on Cloudflare's test keys, which doesn't count against the limit. Redeploy afterwards to get TURNSTILE_SITE_KEY on the Worker.

deploro turnstile list

Widgets with site key, name, mode, domains and created date. Never the secret.

deploro turnstile show <sitekey>

One widget's details.

deploro turnstile update <sitekey> [--domain <hostname...>] [--name <name>] [--mode <mode>]

--domain replaces the whole domain list. Each entry must be one of the project's hostnames, up to 10.

deploro turnstile rotate-secret <sitekey> [--immediate] [-y, --yes]

Issue a new secret. The old one keeps working for about 2 hours unless --immediate. Your app needs no change.

deploro turnstile delete <sitekey> [-y, --yes]

Delete the widget. Forms using it stop passing checks.

deploro turnstile log [--limit <n>]

Recent checks: outcome, action, hostname, error codes (kept 30 days).

hosting

deploro hosting status

Show Worker and VPS health.

deploro hosting metrics

Show recent VPS CPU/memory/disk sparklines.

deploro hosting env

List secret names set on the active project's Worker. Values are never returned.

deploro hosting set-env <key> <value>

Set a Worker secret.

vps

VPS compute hosting: raw Postgres/Redis with a real connection string, and custom docker-compose deploys, distinct from the Worker/Pages deploy pipeline and from hosting, which only manages Worker secrets. See the API reference for the underlying routes.

Closed to new projects. Every command below requires the active project to be one of a small set of pre-existing projects individually approved for direct VPS access; every command in this group returns 403 otherwise. There is no self-service way to opt a project in. Everything else on Deploro (db, migrate, deploy, hosting) stays fully managed, and nothing it does ever writes to the VPS directly.

vps database

Raw Postgres: a dedicated container with a real connection string, for drizzle-kit, transactions, etc.

deploro vps database create

Provision raw Postgres (idempotent; connection string shown once).

deploro vps database info

Show raw Postgres connection info (no password).

deploro vps database rotate [--yes]

Rotate the raw Postgres password.

vps redis

Raw Redis, for BullMQ, ioredis, Lua EVAL scripts.

deploro vps redis create

Provision raw Redis (idempotent; connection string shown once).

deploro vps redis info

Show raw Redis connection info (no password).

deploro vps redis rotate [--yes]

Rotate the raw Redis password (recreates the container).

vps allowlist

IP allowlist gating access to raw Postgres/Redis ports.

deploro vps allowlist list

List allowlist entries.

deploro vps allowlist add <cidr> [--label <label>]

Allow an IP or CIDR block, e.g. 203.0.113.4 or 203.0.113.0/24.

deploro vps allowlist remove <id> [--yes]

Remove an allowlist entry.

vps env & deploy

deploro vps env

List VPS-scoped env var names set on the active project. Values are never returned.

deploro vps set-env <key> <value>

Set a VPS-scoped env var (e.g. JWT_SECRET). Separate from hosting set-env, which sets Worker secrets.

deploro vps deploy

Build and start the active project's docker-compose stack on the VPS.

deploro vps deployments

List VPS deploy history.

deploro vps deploy-status [deployment-id]

Show a VPS deployment's status and logs (defaults to latest).

deploro vps status

Show running compute services + raw Postgres/Redis container status.

deploro vps logs [service] [--tail <n>]

Tail logs for a compute service (or 'postgres'/'redis'). --tail defaults to 200 lines.

storage

R2 file storage for the active project, where a project's uploaded files belong, rather than in a database bytea column or on the VPS filesystem, neither of which the dashboard's Storage tab can see. --key accepts slashes, so --key invoices/2026/03.pdf preserves directory structure.

Constraints: upload and delete require project-admin (list and download accept any member); 100MB per file; files whose first bytes look like HTML, SVG, or script are rejected. By default stored objects are readable only by project members; deploro storage public on opts the project into unauthenticated inline reads at /files/{slug}/{key}.

deploro storage list

List stored files.

deploro storage upload <file> [--key <name>]

Upload a local file. --key defaults to the local file's name. Files over 50MB go up in parts (up to 5GB), with a failed part retried on its own.

deploro storage upload <file> --key <name> --resume <uploadId>

Continue an interrupted upload of the same file, sending only the parts the server doesn't have. A failed upload prints this command with its id. Unfinished uploads expire after 24 hours.

deploro storage abort-upload <uploadId>

Give up on an interrupted upload and delete the parts sent so far.

deploro storage download <key> [--out <path>]

Download a stored file. --out defaults to the file's name.

deploro storage delete <key> [-y, --yes]

Delete a stored file.

deploro storage public <on|off|status> [-y, --yes]

Turn unauthenticated inline reads on or off for the active project, or show the current setting. When on, objects are served at /files/{slug}/{key} to anyone who knows the key. Off by default.

deploro storage sign <key> [--expires <duration>]

Generate a time-limited public URL for one file. Works even for a private bucket or a private project root, since the signature itself grants access until it expires. --expires accepts a bare number of seconds or a short duration like 30m, 1h, 7d (default 1h, max 7d).

storage buckets

Named groupings within a project's storage, each with its own public/private flag, finer-grained than the single project-wide toggle above. A file uploaded with --bucket <name> lives at {slug}/{bucket}/{key} and is governed by that bucket's own flag instead of the project-wide one.

deploro storage buckets list

List buckets.

deploro storage buckets create <name> [--public]

Create a bucket. Private by default.

deploro storage buckets set-public <name> <on|off> [-y, --yes]

Toggle a bucket's unauthenticated read access.

deploro storage buckets delete <name> [-y, --yes]

Remove a bucket's access policy. Files already stored under it are kept; this only removes the policy row.

deploro storage buckets sync <name>

Give every file already in the bucket a row in _deploro_storage_objects, so your storage policies can let end users reach it. Files uploaded through the dashboard, CLI or API get one automatically; run this for files uploaded before storage policies existed.

deploro storage upload <file> --bucket <name>

Upload into an existing bucket instead of the project root. The bucket must already exist.

webhooks

Outbound event webhooks for the active project.

deploro webhooks list

List webhooks.

deploro webhooks create <url> [--events <list>] [--secret <secret>]

Create a webhook. --events is a comma-separated list of event names (default: test).

deploro webhooks update <id> [--url <url>] [--events <list>] [--secret <secret>] [--enable] [--disable]

Update a webhook.

deploro webhooks delete <id> [-y, --yes]

Delete a webhook.

deploro webhooks test <id>

Fire a test payload.

deploro webhooks deliveries <id>

Show the last 30 delivery attempts.

team

Manage the active project's team members. Separate from auth, which manages platform-wide users.

deploro team list

List project members.

deploro team invite <email> [--admin]

Add an existing Deploro user to this project.

deploro team remove <member-id> [-y, --yes]

Remove a member from this project.

auth

Auth management commands: platform users, plus the active project's Auth-as-a-Service configuration.

deploro auth whoami

Show the current identity and, for a token login, exactly what it's scoped to.

deploro auth users

List platform users.

deploro auth invite <email> [--admin]

Invite a user by email.

deploro auth ban <id> [--reason <text>] [--days <n>] [-y, --yes]

Ban a platform user. Blocks sign-in immediately, no session revocation needed. Omit --days for an indefinite ban.

deploro auth unban <id>

Lift a ban.

deploro auth site-url [url] [--clear]

Get or set the active project's Auth Site URL: where end-user confirmation-email links redirect back to. --clear falls back to the project's own deployment URL.

deploro auth temporary-emails [on | off | status]

Block or allow new end-user sign-ups from temporary/disposable email addresses (mailinator.com, 10minutemail.com and about 10,000 more) on the active project. With no argument, shows whether blocking is on and how current the list is. Applies to email and password signups, social/SSO sign-ins that would create a new account, and users you add yourself; existing users keep signing in. A refused signup gets a 400 with code TEMPORARY_EMAIL. Same switch as Block temporary email addresses on the dashboard's Auth page. Alias: disposable-emails.

deploro auth temporary-emails check <email>

Check whether an address is on the temporary email list, and whether this project would refuse it.

deploro auth stats

Show Auth-as-a-Service stats for the active project's end users.

auth providers

Manage the active project's end-user sign-in providers. email (OTP) and email_password are independent providers, each with its own toggle and its own end-user identities. Neither takes OAuth credentials.

deploro auth providers list

List sign-in providers and their status.

deploro auth providers enable <provider>

Enable a sign-in provider, e.g. email, email_password, google, github, apple...

deploro auth providers disable <provider>

Disable a sign-in provider.

deploro auth providers configure <provider> [--client-id <id>] [--client-secret <secret>] [--team-id <id>] [--key-id <id>]

Set OAuth client credentials for a provider (not applicable to email / email_password). --team-id and --key-id are Apple-only; --client-secret is the .p8 private key contents for Apple.

auth end-users

Manage the active project's end users: the people who signed up inside your app. Distinct from auth users above, which lists platform users (people with dashboard access).

deploro auth end-users list [--page <n>]

List end users.

deploro auth end-users add <email> [--name <name>]

Manually add an end user. Sends a confirmation email; they can't sign in until they click it.

deploro auth end-users delete <id> [--yes]

Delete an end user and all their sign-in methods/sessions.

token

Personal access token commands. Requires a browser-session login, not a PAT.

deploro token list

List your personal access tokens.

deploro token create <name> [--read] [--write] [--project <slugs>] [--days <n>]

Create a new project-scoped personal access token.

--readGrant read scope
--writeGrant write scope
--project <slugs>Comma-separated project slugs/ids/names (defaults to the active project)
--days <n>Expiry in days, 1-365 (default 90)
deploro token create ci-deploy --write --project my-app --days 30
deploro token revoke <id> [--yes]

Revoke a personal access token.