# Troubleshooting and error codes

Fixes for common problems, and every Deplane error code with what it means and how to fix it.

Every error from the CLI and the API has a stable `code`, a `message` that says what happened, and a `fix` that says what to do. API errors also carry a `docs` link to the matching section of this page and a `request_id` to quote when you email support@deplane.cloud.

## Common problems

### Cannot log in

- Run `deplane doctor`. It checks that the API answers and that your login works.
- If `DEPLANE_TOKEN` is set, the CLI uses it instead of your login. Unset it to use `deplane login`.
- The login code expires after 10 minutes. Run `deplane login` again for a new one.
- Type the code shown in your terminal on https://login.deplane.cloud/device. Approve only a request you just started yourself.
- Sign-in links work once and expire after 15 minutes. Request a new one on the sign-in page.
- After too many wrong authenticator codes, codes are locked for a while. Use your passkey instead.
- Deplane is invite-only during the beta. Your email must have an approved access request.

### Build failed

The CLI exits with code 3 and shows the build log. Look at the last lines of the log for the step that failed.

- Without a Dockerfile, Deplane works out the build from your project files. If it cannot, add a Dockerfile, or check the messages in the log. See [railpack_plan_failed](#railpack_plan_failed).
- A build has 15 minutes, 3 GB of memory, and 10 GB of disk. See [build_timeout](#build_timeout), [build_out_of_memory](#build_out_of_memory), and [build_disk_full](#build_disk_full).
- Private packages need a token while building. Set it as a build secret: `deplane secrets set --build NPM_TOKEN=...`. See [Secrets](secrets.md).
- If the upload is too large, add `node_modules`, build output, and data files to `.dockerignore` or `.gitignore`.

### Deploy failed

The build worked but the new release did not become healthy. The CLI exits with code 4, the release is marked failed, and the previous release keeps serving. `deplane status` shows the reason and the fix:

| Reason | What it means | Fix |
|---|---|---|
| `Unschedulable` | There is not enough room for this size right now. | Use a smaller size or fewer instances (`deplane scale 1 --size small`), or try again later. |
| `ImagePullFailed` | Deplane could not fetch the release's image. This is a problem on our side and we have been alerted. | Run `deplane deploy` again in a few minutes. |
| `HealthCheckFailed` | The app started but did not answer its health check on its port. | Make the app listen on `0.0.0.0` at the port in `$PORT`, and make `health_check` (if set) answer 200. Run `deplane logs` to see why it failed. |
| `Crashing` | The app stops soon after it starts. If it ran out of memory, the message says so. | Run `deplane logs` to see the error, fix it, and run `deplane deploy`. For memory, use a larger size: `deplane scale --size medium`. |
| `Timeout` | The new release did not become healthy within 5 minutes. | Run `deplane logs`, fix the problem, and run `deplane deploy`. |

### App not reachable

- Run `deplane status`. `State` should be `Running` with all instances ready.
- If you scaled to 0, nothing is running. Run `deplane scale 1`.
- Your app must listen on `0.0.0.0`, not `127.0.0.1` or `localhost`, at the port in `$PORT`.
- A request that gets no first byte back within 125 seconds times out. See [Limits](limits.md).
- If the app is suspended, `deplane status` shows `suspended`. Email support@deplane.cloud.

### Quota reached

Errors whose code starts with `limit_` mean you reached a plan limit, and the CLI exits with code 6. Run `deplane whoami --json` to see your limits and `deplane apps` to see what uses them. Destroy or scale down apps you no longer need, or email support@deplane.cloud to raise the limit. See [Limits](limits.md).

## Error codes

Exit codes: codes starting with `limit_` exit with 6. Build failures exit with 3 and deploy failures with 4. Other API errors exit with 2 for authentication and permission problems, 5 for problems on our side, and 1 for everything else. Some codes appear only in the web pages for signing in, not in the CLI.

### access_denied

The login or confirmation request was denied in the browser.

Fix: run the command again if that was a mistake.

### access_request_reviewed

An admin tried to approve or deny a beta access request that was already approved or denied.

Fix: list open requests with `deplane admin requests`.

### account_suspended

Your account or organization is suspended. Its tokens no longer work and its apps run zero instances.

Fix: email support@deplane.cloud. See [Reporting abuse](abuse.md) for what suspension means and how to appeal.

### alerts_unavailable

Alerts are not available on this server.

Fix: Try again later.

### already_current

You asked to roll back to the release that is already current.

Fix: pick an earlier version from `deplane releases`.

### already_member

The address you invited is already in your team.

Fix: nothing to do.

### already_suspended

An admin tried to suspend an app or organization that is already suspended.

Fix: nothing to do. To change the reason, unsuspend it with `deplane admin unsuspend` and suspend it again.

### app_has_database

The app already uses another database as its DATABASE_URL.

Fix: detach that database first, then attach this one.

### app_name_brand

App names cannot contain a well-known brand name, such as `paypal` or `google`. Common letter swaps such as `paypa1` count too. This protects people from phishing.

Fix: pick a name without the brand. If you own the brand, email support@deplane.cloud.

### app_name_reserved

The name is reserved by Deplane, for example `api`, `www`, or `admin`.

Fix: pick another name, for example `api-app`.

### app_exists

`deplane launch --name NAME` named an app your organization already has, from a folder that is not that app's. Launch never deploys one folder over another app.

Fix: to deploy this folder to that app on purpose, run `deplane deploy --app NAME`. To create a new app, pick another name with `--name`.

### app_name_taken

Another app already has this name. Names are unique across Deplane, and the name of a deleted app stays reserved for its team for 90 days, so nothing still pointing at the old address reaches another team's app.

Fix: pick another name with `deplane launch --name NAME`. Without `--name`, `launch` picks a free name for you.

### app_not_found

There is no app with this name in your organization.

Fix: check the `app` in `deplane.toml` or the `--app` flag, or run `deplane launch` to create the app. `deplane apps` lists your apps.

### app_suspended

This app is suspended, so it cannot be deployed or changed.

Fix: email support@deplane.cloud to resolve the suspension.

### app_unavailable

The app was destroyed or suspended while it was building, so no release was created.

Fix: if the app still exists, run `deplane deploy` again.

### assistant_failed

The assistant could not answer right now, usually because the AI service did not respond in time.

Fix: Ask again in a moment.

### assistant_monthly_limit

Your team asked the assistant as many questions this month as your plan includes.

Fix: It resets on the 1st (UTC). To raise it, email support@deplane.cloud.

### assistant_not_in_plan

The assistant is not included in your team's plan.

Fix: Email support@deplane.cloud to turn it on.

### assistant_rate_limited

You asked the assistant 40 questions in the last hour, the most allowed.

Fix: Wait a few minutes and ask again.

### assistant_unavailable

The assistant is not set up on this Deplane installation yet.

Fix: Use the dashboard, `deplane status` and `deplane logs` meanwhile.

### authorization_pending

The login or confirmation request is waiting for approval in the browser. The CLI keeps waiting; you only see this code if you call the API yourself.

Fix: approve the request in your browser.

### backup_changed

The full copy or stream a restore was about to start from was deleted by retention at the same moment, so the restore was not started.

Fix: run the restore again; it starts from the backups that are there now.

### backup_not_restorable

That disk backup cannot be restored: it did not finish (`failed`, or still under way). Any backup marked `done` in the list can be restored.

Fix: pick a backup marked `done` from `deplane disks backups APP`.

### backup_running

A backup of this disk is already under way.

Fix: wait for it to finish; `deplane disks backups APP` shows it. A restore cannot start during a backup either.

### backup_too_soon

This disk was already backed up on request in the last hour. You can ask for a backup at most once an hour; the disk is also backed up every night. After a backup on request fails, you can try again 5 minutes later.

Fix: try again after the time in the message.

### backups_off

Deplane's database backups are switched off right now (for example during maintenance), so a restore cannot start.

Fix: try again later, or email support@deplane.cloud if you need a copy of your data now.

### bad_credentials_file

The file where the CLI stores your login, `credentials.json` in your config folder, is not valid JSON.

Fix: delete the file the message names and run `deplane login` again.

### bad_response

The API sent a response the CLI cannot read, or a login was approved without a token.

Fix: update the CLI, then try again. For a login, run `deplane login` again.

### body_too_large

The request body is larger than the API accepts: 64 KB, except source uploads.

Fix: send less than 64 KB. For uploads, use `deplane deploy`.

### build_capacity

Deplane had no free build capacity for 5 minutes, so the build did not start. Builds normally start within seconds: one build's worth of capacity is kept free.

Fix: deploy again in a few minutes. If it keeps happening, email support@deplane.cloud.

### build_disk_full

The build used more than 10 GB of disk, the limit.

Fix: keep large files out of the build with `.dockerignore`, and clean package caches in the same step that fills them.

### build_expired

The build waited in the queue for more than an hour and was not started.

Fix: run `deplane deploy` again.

### build_failed

A step of the build failed.

Fix: see the build log for the step that failed, fix it, and run `deplane deploy` again.

### build_interrupted

The build was interrupted on our side and did not finish.

Fix: run `deplane deploy` again.

### build_out_of_memory

The build ran out of memory. A build has 3 GB.

Fix: lower the build's memory use, for example with fewer parallel jobs, or for Node with `NODE_OPTIONS=--max-old-space-size=2048` set as a build secret.

### build_platform_error

The build could not run because of a problem on our side.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### build_start_failed

The build could not be started.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### build_timeout

The build took longer than 15 minutes, the limit. The CLI also uses this code if it stops waiting for a build.

Fix: make the build faster, for example by removing unused dependencies or build steps, then run `deplane deploy` again. Run `deplane status` to see where a build is.

### builds_unavailable

Builds are not available right now.

Fix: try again in a few minutes. If it keeps happening, email support@deplane.cloud.

### capacity_full

Deplane's servers are nearly full: a new app, a preview, a scale-up, a new or bigger worker or cron job, a new or restored database, a new Redis, or a template deploy would take the servers' reserved memory above 85% of what they hold. Apps that already run are not affected, and we are alerted to add capacity. The CLI exits with code 5.

Fix: try again later, or use a smaller size or fewer instances.

### cancelled

You answered no to a confirmation, or stopped the command.

Fix: run the command again. Pass `--yes` to skip the question.

### cannot_remove_self

You tried to remove yourself from the team.

Fix: ask another owner to remove you.

### cannot_suspend_own_org

An admin tried to suspend their own organization. That would lock them out of `deplane admin unsuspend`.

Fix: ask another admin to do it.

### ci_token_not_allowed

CI tokens cannot create, list, or revoke tokens, invite or remove team members, confirm actions, destroy apps, delete, restore or switch databases, or run admin commands.

Fix: do it in the dashboard, or from your own machine after `deplane login` (the CLI asks you to confirm in your browser). A CI token can revoke itself with `POST /v1/logout`.

### disk_exists

The app already has a disk. An app has at most one.

Fix: use the disk it has (`deplane disks list`), or destroy it first with `deplane disks destroy APP`.

### disk_needs_one_instance

An app with a disk runs one instance. It cannot be given a disk while it runs more than one instance or autoscales, and with a disk it cannot be scaled above one instance or set to autoscale. See [Disks](disks.md).

Fix: scale to 1 instance and turn off autoscaling first: `deplane scale 1 --max 0 --app APP`.

### disk_not_found

The app has no disk.

Fix: add one with `deplane disks create APP`. `deplane disks list` shows your team's disks.

### disk_on_preview

Pull request previews cannot have a disk. They run without the disk of their app.

Fix: add the disk to the app itself.

### invalid_disk_path

The disk's path is not allowed. It must be absolute, use lowercase letters, digits and `. _ / -`, have no `..` part, and not be `/` or a system folder: `/proc`, `/sys`, `/dev`, `/etc`, `/bin`, `/sbin`, `/lib`, `/usr`, `/var/run`, `/run`, or anything under them.

Fix: use a path such as `/data` (the default) or `/srv/files`.

### limit_disk

Your team's disks together would use more disk space than your plan allows. Every disk is 5 GB; the Beta plan allows 10 GB.

Fix: destroy a disk you no longer need with `deplane disks destroy APP`, or email support@deplane.cloud to raise the limit.

### mcp_database_url

AI tools connected to Deplane, such as Claude, cannot set `DATABASE_URL`, at run time or at build time. Nothing was changed.

Fix: have the tool attach a database (`attach_database`). To set `DATABASE_URL` by hand, or to switch apps to a restored database, do it yourself in the dashboard or with the CLI.

### mcp_not_allowed

AI tools connected to Deplane, such as Claude, can call only what their tools need. Everything else is refused: deleting or detaching things, app settings, alert settings and channels, the activity log, tokens, the team, the assistant, connections and admin features.

Fix: do it yourself in the dashboard.

### mcp_needs_connection

The MCP endpoint accepts an AI tool's OAuth connection or a CI token. It refuses the login token that `deplane login` stores on your machine.

Fix: add Deplane to your AI tool with the server URL; it opens a browser to connect. Or use a CI token.

### confirmation_required

The command needs a yes or no answer, and no terminal is attached, so the CLI did not ask.

Fix: pass `--yes` to confirm.

### csrf_failed

A form on the sign-in site expired or did not come from that site.

Fix: go back, reload the page, and try again.

### database_capacity

Every database disk on the platform is in use, so Deplane did not create the database (or the restore's new database). Nothing was created and nothing is charged.

Fix: try again later. If it keeps happening, email support@deplane.cloud.

### database_exists

Your team already has a database with that name.

Fix: pick another name.

### database_failed

An AI tool asked to attach a database that could not be created.

Fix: open the database in the dashboard's Databases page to see why, then create it again.

### database_not_ready

An AI tool asked to attach a database that is still being created. A new database is ready in about a minute.

Fix: the tool calls attach_database again in a minute.

### deploy_failed

The new release did not become healthy. It was marked failed, and the previous release keeps serving. The message gives the reason: `Unschedulable`, `ImagePullFailed`, `HealthCheckFailed`, `Crashing`, or `Timeout`.

Fix: follow the fix in the message. The table in [Deploy failed](#deploy-failed) lists each reason. `deplane logs` shows the app's output.

### deploy_in_progress

An AI tool asked to deploy an app that already has a build queued or running. AI tools deploy one version of an app at a time.

Fix: the tool calls wait_for_deploy with the build ID in the message, then deploys again.

### deploy_timeout

The CLI stopped waiting because the release did not finish rolling out in time.

Fix: run `deplane status` to see what is happening, and `deplane logs` for the app's output.

### detect_failed

Deplane could not tell how to build this folder.

Fix: run the command in your project's root folder. Deplane builds Node, Python, Go, Ruby, PHP, Java, and static sites without configuration, and any project with a Dockerfile. See the [Quickstart](quickstart.md#what-launch-detects).

### device_code_invalid

The login code you typed is not valid or has expired.

Fix: check the code shown in your terminal, or run the command again for a new one.

### device_wrong_account

The login or confirmation request was started by a different Deplane account than the one signed in to the browser.

Fix: sign in with the account that ran the command.

### dockerfile_syntax_not_allowed

The Dockerfile starts with a `# syntax=` line, which would load a build tool from outside Deplane.

Fix: remove the `# syntax=` line. Deplane builds with the standard Dockerfile support, which handles current Dockerfile features.

### dockerfile_too_large

The Dockerfile is larger than 1 MB.

Fix: shorten the Dockerfile.

### domain_dangling

Another team had this domain connected to its app on Deplane, removed it or deleted the app, and the domain's CNAME still points at that old app's address. Deplane does not let a leftover DNS record hand the domain to someone else.

Fix: whoever controls the domain's DNS must change the CNAME to your app's address (shown in the Domains tab), then add the domain again. If you do not control the domain's DNS, you cannot connect it.

### domain_taken

The custom domain is already connected to an app on Deplane, possibly in another organization.

Fix: if the domain is yours, remove it from the other app first. If you do not recognize the other app, email support@deplane.cloud.

### expired_token

The login or confirmation code expired before it was approved, or was already used.

Fix: run the command again.

### github_already_linked

That GitHub account is linked to another Deplane account.

Fix: sign in to that account instead, or use a different GitHub account.

### github_app_exists

Deplane's GitHub App was already created.

Fix: Manage it on GitHub from the admin page /admin/github.

### github_authorization_failed

GitHub did not confirm that you approved Deplane seeing your repositories, or the approval expired.

Fix: Press **Connect GitHub** again and approve on GitHub.

### github_authorization_needed

Deplane does not know which of your GitHub repositories you can use yet. Approvals last an hour.

Fix: Press **Connect GitHub** in the dashboard and approve on GitHub. See [GitHub](github.md).

### github_branch_missing

The branch the app deploys from is not in the repository.

Fix: Push the branch, or pick another one in the app's **Settings**.

### github_deploy_failed

Deplane could not deploy the connected branch, for example because the repository is empty or the branch is gone. The message says which.

Fix: Fix the problem on GitHub or in the app's Settings, then run `deplane github deploy` again.

### github_deploy_slow

GitHub's commit did not reach Deplane within 2 minutes.

Fix: Run `deplane status` in a minute; the deploy may still start.

### github_link_exists

Your account is already linked to a GitHub account.

Fix: email support@deplane.cloud to change the linked GitHub account.

### github_login_failed

GitHub sign-in did not complete.

Fix: start again from the sign-in page.

### github_not_connected

The app is not connected to a GitHub repository.

Fix: Connect one in the app's **Settings**.

### github_not_linked

No Deplane account is linked to this GitHub account.

Fix: sign in with your sign-in link, then link GitHub from your account page.

### github_preview_app

Pull request previews follow the app they belong to and cannot be connected to a repository themselves.

Fix: Connect the app the preview belongs to.

### github_repo_empty

The connected repository has no commits yet, so there is nothing to deploy.

Fix: Push a first commit to the branch. Deplane deploys it automatically.

### github_repo_not_allowed

You have not given Deplane access to that repository, or your approval is older than an hour.

Fix: Press **Connect GitHub**. On GitHub, add the repository to the Deplane app's repository access, then pick it again.

### github_repo_not_visible

An AI tool asked to deploy a GitHub repository that the Deplane GitHub App cannot read for you.

Fix: give the Deplane GitHub App access to the repository from the app's Settings tab in the dashboard, then ask again.

### github_root_missing

The root folder set for the app is not in the repository at the commit being deployed.

Fix: Fix the root folder in the app's **Settings**, or leave it empty for the repository's root.

### github_setup_failed

GitHub did not confirm the new GitHub App. Its confirmation code works once, for an hour.

Fix: Start again from /admin/github.

### github_unavailable

Deploying from GitHub is not set up on this Deplane installation yet.

Fix: Deploy with `deplane deploy` or by uploading a folder in the dashboard.

### has_account

The address already has a Deplane account with its own team. Being in more than one team is coming soon.

Fix: invite a different address for now, or sign in with the existing account.

### http_status

The CLI got an HTTP error with no Deplane error in it, for example from a proxy. The code is `http_` followed by the status, such as `http_502` or `http_503`.

Fix: try again later. If you set `DEPLANE_API_URL`, check that it points to the Deplane API.

### image_invalid

The image the build produced could not be read.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### image_not_found

The build finished, but its image could not be found.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### impersonation_read_only

A Deplane administrator viewing a team (for support) can only look: every change is refused while viewing.

Fix: Stop viewing as the team from the red banner.

### instances_on_cron

A cron job was given an instance count. Each run of a cron job is one instance.

Fix: leave instances out for a cron job; set its schedule instead.

### internal

Something went wrong on our side, or the CLI hit an unexpected problem.

Fix: try again, with `--debug` for details. If it keeps happening, email support@deplane.cloud with the request ID.

### invalid_alert_channel

The alert channel's kind or name is not valid.

Fix: Use slack, discord or webhook (email is not delivered yet), and a name of at most 60 characters.

### invalid_alert_settings

An alert threshold is out of range: the error rate is between 0.1% and 100%, the response time between 100 and 60000 ms.

Fix: Pick a value in range, like 5% or 2000 ms.

### invalid_alert_target

The webhook address is not valid for its kind: Slack needs https://hooks.slack.com/services/…, Discord https://discord.com/api/webhooks/…, and a webhook a public https:// address.

Fix: Copy the URL again from Slack, Discord, or your endpoint.

### invalid_api_url

`DEPLANE_API_URL` is not a valid URL.

Fix: set it to a URL such as `https://api.deplane.cloud`, or unset it.

### invalid_app_name

App names are 3 to 40 characters: lowercase letters, digits, and single hyphens, starting with a letter and not ending with a hyphen.

Fix: pick a name like `my-app`.

### invalid_arguments

An AI tool called a Deplane tool with arguments it cannot use, such as a missing app name or a malformed build ID.

Fix: the tool checks the tool's input schema and calls it again; list apps with list_apps and builds with builds.

### invalid_auto_rollback

`deplane config --auto-rollback` got a value other than on or off.

Fix: use `deplane config --auto-rollback on` or `deplane config --auto-rollback off`.

### invalid_autoscale

The autoscaling ceiling is not valid: it must be more than the number of instances and at most 1000, and a stopped app cannot autoscale.

Fix: set `max_instances` above `instances` (for example `deplane scale 1 --max 5`), or 0 to turn autoscaling off.

### invalid_branch

The branch name is not valid.

Fix: Use the branch's name as GitHub shows it, for example `main`.

### invalid_category

An abuse report's category is not one of the allowed ones.

Fix: use `phishing`, `malware`, `spam`, `csam`, `copyright`, `illegal`, or `other`.

### invalid_client

Deplane does not know the AI tool that sent this request. Its registration may have been removed.

Fix: connect Deplane again from the AI tool, which registers it afresh.

### invalid_client_metadata

The AI tool sent registration details Deplane cannot accept: unreadable JSON, text with NUL characters, or a client that needs a secret.

Fix: Deplane supports public clients only. Register with `token_endpoint_auth_method` set to `none` and send a single JSON object.

### invalid_code

The authenticator code is not correct.

Fix: enter the current 6-digit code from your authenticator app.

### invalid_command

A worker's or cron job's command is empty, too long, or spans lines.

Fix: give one line of at most 1000 characters, for example `node worker.js`. It runs through the image's shell (`/bin/sh -c`).

### invalid_company

The company name in an access request is longer than 200 characters.

Fix: shorten the company name.

### invalid_config

`deplane.toml` is not valid: it is not TOML, has an unknown setting, or has a bad value.

Fix: fix the line the message names. `deplane.toml` knows `app` and, under `[service]`, `port` (1 to 65535), `instances`, `size` (`small`, `medium`, or `large`), and `health_check` (a path starting with `/`). Or delete the file and run `deplane launch`.

### invalid_conversation

The conversation sent to the assistant is not valid: it must end with your question, and each message needs a role and text.

Fix: Ask again; the dashboard and `deplane ask` send it correctly.

### invalid_database_name

Database names are 3 to 30 characters: lowercase letters, digits and single hyphens, starting with a letter.

Fix: pick a name such as `main`, `orders`, or `analytics-db`.

### invalid_domain

The hostname is not a public domain name Deplane can route.

Fix: enter a hostname such as `www.example.com` or `example.com`, without `https://` or a path.

### invalid_drill

A drill result was malformed: its start must come before its end, neither in the future, with a summary of at most 8000 characters.

Fix: send the result `infra/dr/drill.sh` sends.

### invalid_email

The email address is not valid.

Fix: enter an address like `you@company.com`.

### invalid_entitlements

An admin sent plan limits with an unknown key or a bad value.

Fix: use the keys and value types shown by `GET /v1/admin/plans`.

### invalid_files

An AI tool sent files to deploy that Deplane cannot pack: no files, more than 5,000, more than 25 MB in all, a path that is not a clean relative path (absolute, or with `..`, `//` or a backslash) or that appears twice, or content marked base64 that is not valid base64.

Fix: send each file as {path, content, encoding}: a relative path, utf8 or base64 content.

### invalid_findings

The watcher's findings were malformed: at most 50 checks, each with a lowercase name and a detail of at most 500 characters.

Fix: send `{"findings":[{"check":"canary","detail":"…"}]}`.

### invalid_flag

A flag got a value it does not take, or a value out of range. For example, `--json=true`, or `--expires-in-days 500`.

Fix: use the flag as the message says. `deplane help` lists the flags.

### invalid_grant

The sign-in code or refresh token is wrong, expired, or was already used. If a code or refresh token is used twice, Deplane ends that connection as a precaution.

Fix: connect Deplane again from the AI tool.

### invalid_health_check

The health check is not a valid path.

Fix: use a path that starts with `/` and has no spaces, for example `/healthz`, or leave it out for a TCP check.

### invalid_image_digest

A release was given an image reference that is not a sha256 digest.

Fix: pass a digest like `sha256:` followed by 64 hex characters. Releases made by `deplane deploy` always have one.

### invalid_instances

The number of instances is not a whole number of 0 or more.

Fix: run `deplane scale 2`, or `deplane scale 0` to stop the app.

### invalid_json

The request body is not valid JSON for this endpoint, has unknown fields, or contains more than one object.

Fix: check the request format at https://api.deplane.cloud/v1/openapi.yaml and send exactly one JSON object.

### invalid_kind

An admin instance list was filtered by a kind of microVM that does not exist.

Fix: use `kind=app`, `kind=worker`, `kind=database`, or `kind=build`.

### invalid_limit

A list request asked for too few or too many entries.

Fix: use a `limit` from 1 to 200, for example `?limit=50`.

### invalid_mode

A passkey or GitHub sign-in was started with an unknown mode.

Fix: reload the page, or start again from the sign-in page.

### invalid_name

The name in an access request is empty or longer than 200 characters.

Fix: enter your name or your company's name.

### invalid_payload

The webhook's body is not valid JSON.

Fix: Only GitHub sends webhooks to Deplane; nothing to do.

### invalid_period

A metrics request asked for a period Deplane does not chart.

Fix: use `period=1h`, `period=24h`, `period=7d`, or `period=30d`.

### invalid_plan

The plan does not exist or is not offered any more.

Fix: Pick one of the plans listed in the admin console's Settings.

### invalid_port

The port is not between 1 and 65535.

Fix: use the port your app listens on. Deplane also sets it as `PORT`.

### invalid_process_kind

A process must be a worker or a cron job.

Fix: use kind `worker` (always running) or `cron` (on a schedule).

### invalid_process_name

Process names are 2 to 22 characters: lowercase letters, digits and hyphens, starting with a letter. `web` is the app itself.

Fix: pick a name such as `worker`, `emails`, or `nightly-report`.

### invalid_range

A usage request asked for a range Deplane does not report.

Fix: use `range=24h`, `range=7d`, `range=30d`, `range=month`, or `range=prev_month`. A server's history in the admin console takes `range=24h` or `range=7d`.

### invalid_recovery_code

The recovery code is not correct or was already used.

Fix: check the code and try again. Each recovery code works once.

### invalid_redirect_uri

The return address is not allowed. It must be https, or http on a loopback address (localhost or 127.0.0.1), have no fragment, and match one the AI tool registered.

Fix: update the AI tool and connect again. If you build the tool, register only addresses that meet these rules.

### invalid_region

The region is not available.

Fix: use region `fra`, or leave the region out.

### invalid_report_status

An admin passed a report status that does not exist.

Fix: for `deplane admin abuse list`, use `open`, `investigating`, `actioned`, `rejected`, or `all`. For `deplane admin abuse resolve`, use `investigating`, `actioned`, or `rejected`.

### invalid_report_url

An abuse report's URL is missing or is not a valid `http` or `https` address.

Fix: paste the full address of the page you are reporting, for example `https://example-app.deplane.dev/login`.

### invalid_request

The connection request is missing something or is malformed. Deplane requires PKCE with the `S256` method.

Fix: update the AI tool and connect again. If you build the tool, send a `code_challenge` made with `S256` and a `state` of at most 500 characters.

### invalid_restore_time

The restore time is not a time Deplane understands.

Fix: use `latest`, a time like `2026-10-15T14:31:20Z`, or in the CLI `2026-10-15 16:31` (your local time) or `-10m` (ten minutes ago).

### invalid_role

A team role is `member` or `owner`.

Fix: use `member` (deploys and manages apps) or `owner` (also invites and removes people).

### invalid_root_dir

The root folder is not a plain path inside the repository.

Fix: Use a path like `apps/web` (no `..`), or leave it empty.

### invalid_schedule

The cron schedule is not valid.

Fix: use five fields in UTC (minute, hour, day of month, month, day of week), for example `*/15 * * * *` or `0 3 * * *`, or `@hourly`, `@daily`, `@weekly`, `@monthly`.

### invalid_scope

There is no such secret kind.

Fix: use `runtime` (the default) or `build`. In the CLI, pass `--build` for build secrets.

### invalid_secret

An argument to `deplane secrets set` is not `NAME=VALUE`.

Fix: pass each secret as `NAME=VALUE`, for example `deplane secrets set DATABASE_URL=postgres://...`.

### invalid_secret_name

Secret names use capital letters, digits, and underscores, and do not start with a digit.

Fix: rename it, for example `DATABASE_URL`. See [Secrets](secrets.md#names).

### invalid_secret_value

A secret value contains a NUL byte, which environment variables cannot hold.

Fix: encode the value, for example as base64.

### invalid_setting

The value is not valid for that setting.

Fix: Check the value and try again.

### invalid_signature

A webhook's signature did not match Deplane's GitHub App secret.

Fix: Only GitHub can send webhooks to Deplane; nothing to do.

### invalid_size

There is no such size.

Fix: use `small`, `medium`, or `large`.

### invalid_sleep

Apps sleep after 5, 15 or 60 minutes without a request, or never; a stopped app cannot sleep.

Fix: use `deplane scale --sleep 15m`, or `--sleep off`.

### invalid_sort

An admin usage request asked to rank teams by something Deplane does not total.

Fix: use `sort=cpu`, `sort=memory`, `sort=bandwidth`, `sort=requests`, `sort=build`, or `sort=instances`.

### invalid_source

The upload is not a gzip-compressed tar archive, or it is damaged.

Fix: upload with `deplane deploy`, which packages the folder for you.

### invalid_stack

The stack label sent with an app's settings is not a short label.

Fix: send at most 40 letters, digits, spaces, and `. + # - /`, such as `Next.js` or `Python`. The CLI and dashboard send it for you.

### invalid_status

An admin passed an access request status that does not exist.

Fix: use `pending`, `approved`, or `denied`.

### invalid_tail

`--tail` is not a number of lines from 0 to 1000.

Fix: for example `deplane logs --tail 200`.

### invalid_team_name

A team name is 2 to 50 characters.

Fix: pick a name like Acme or Acme Engineering.

### invalid_text

The request contains a NUL character or text that is not valid UTF-8.

Fix: Remove the control characters and send it again.

### invalid_token_kind

A token kind other than `cli` or `ci` was requested.

Fix: use kind `ci` for automation. `deplane tokens create` does this for you.

### invalid_token_name

A token name must be 1 to 100 characters.

Fix: name the token after where it is used, for example `github-actions`.

### invalid_ttl

The token lifetime is out of range.

Fix: use 1 to 365 days, or leave it out for the default of 90 days.

### invalid_use_case

The use case in an access request is longer than 2000 characters.

Fix: shorten the description.

### invalid_version

The release version is not a positive number.

Fix: run `deplane releases` to see the versions, then `deplane rollback 3` or `deplane rollback v3`.

### invite_invalid

The invitation link was already used, revoked, or is older than 7 days.

Fix: ask the person who invited you for a new link.

### key_rejected

The service did not accept the API key.

Fix: Copy the key again from the service's console and paste it whole.

### key_unchecked

Deplane could not check the key with the service, so it was not saved.

Fix: Try again in a minute.

### kubernetes_unavailable

The API server cannot read the cluster, so the admin console cannot show servers.

Fix: set KUBECONFIG for deplane-api (operators).

### last_owner

A team needs at least one owner.

Fix: make someone else an owner first.

### layer_device_file

The built image contains a device file.

Fix: do not create device files in the image, for example with `mknod`. Deplane provides `/dev`.

### layer_path_traversal

The built image contains a path that points outside the image.

Fix: check the Dockerfile's `COPY` and `ADD` steps, and any archives they unpack, for paths with `..` in them.

### layer_setuid

The built image contains a setuid or setgid file outside the system folders, or replaces a system folder such as `/usr` or `/bin` with a link.

Fix: remove the setuid or setgid bit (`chmod u-s,g-s`) or install the program under `/usr/bin`. Keep `/usr`, `/bin`, `/sbin`, and `/usr/local/bin` as real folders.

### layer_too_large

A layer of the built image is larger than 2 GB.

Fix: make the image smaller. Leave build tools, caches, and data files out of the final stage.

### layer_unsupported

The built image has a layer type Deplane does not run.

Fix: build with a standard Dockerfile or without one. Foreign and zstd layers are not supported.

### limit_apps

Your organization has as many apps as its plan allows.

Fix: destroy an app you no longer need with `deplane apps destroy NAME`, or email support@deplane.cloud to raise the limit.

### limit_build_minutes

Your organization used all its build minutes for this month.

Fix: wait until the 1st of next month (UTC), or email support@deplane.cloud to raise the limit.

### limit_instances

The change needs more instances, across all your apps, than your plan allows.

Fix: use fewer instances, scale down another app, or email support@deplane.cloud to raise the limit.

### limit_log_streams

Your organization already has as many live log streams open as its plan allows. A deploy that follows its build log counts too.

Fix: stop another `deplane logs -f` or a running deploy, then try again. A deploy still finishes without showing the log.

### limit_memory

The change needs more memory, across all instances of all your apps, than your plan allows.

Fix: use a smaller size or fewer instances, scale down another app, or email support@deplane.cloud to raise the limit.

### limit_size

Your plan does not include this instance size.

Fix: use a size your plan includes (the message lists them), or email support@deplane.cloud.

### logs_unavailable

Logs are not available right now.

Fix: try again in a few minutes. If it keeps happening, email support@deplane.cloud.

### magic_link_invalid

The sign-in link is invalid, expired, or already used.

Fix: request a new link on the sign-in page. Links work once and expire after 15 minutes.

### missing_database

A `deplane db` command needs the database it acts on.

Fix: pass its name, for example `deplane db attach main --app shop`. `deplane db` lists them.

### missing_delivery

A GitHub webhook arrived without its X-GitHub-Delivery ID, so Deplane refused it. GitHub always sends one; a request without it is not from GitHub.

Fix: Nothing to do if you use the Deplane GitHub App. Custom senders must forward GitHub's headers unchanged.

### missing_domain

A `deplane domains` command needs the domain it acts on.

Fix: pass it, for example `deplane domains add www.example.com`. `deplane domains` lists the app's domains.

### missing_email

A `deplane team` command needs an email address.

Fix: pass it, for example `deplane team invite colleague@company.com`.

### missing_flag_value

A flag that needs a value was given none.

Fix: pass it as `--flag VALUE`, for example `--tail 200`.

### missing_id

The command needs an ID.

Fix: pass it, for example `deplane tokens revoke ID` or `deplane disks restore APP BACKUP-ID`. `deplane tokens list` and `deplane disks backups APP` show the IDs.

### missing_name

The command needs a name.

Fix: for example `deplane apps destroy my-app` or `deplane tokens create github-actions`.

### missing_process

A `deplane processes` command needs the process it acts on.

Fix: pass its name, for example `deplane processes scale worker 2`. `deplane processes` lists them.

### missing_reason

A suspension needs a reason.

Fix: pass `--reason TEXT`, for example `deplane admin suspend-app NAME --reason "Phishing, report abr_..."`.

### missing_report

The command needs an abuse report ID.

Fix: pass it, for example `deplane admin abuse show ID`. `deplane admin abuse list` shows the IDs.

### missing_request

The command needs an access request's email or ID.

Fix: for example `deplane admin approve dev@example.com`.

### missing_target

`deplane admin unsuspend` needs exactly one target.

Fix: pass `--app NAME` or `--org SLUG`, not both.

### network_error

The CLI could not reach the Deplane API, or the connection broke.

Fix: check your internet connection and run the command again. Set `DEPLANE_API_URL` if you use a different API.

### no_app

No app is selected. There is no `deplane.toml` here and no `--app` flag.

Fix: pass `--app NAME`, or run the command in a folder with a `deplane.toml`. `deplane launch` creates one.

### no_backup_yet

The database has no finished full copy yet, so it cannot be restored.

Fix: the first copy finishes a few minutes after a database is created; try again soon.

### no_builds

An AI tool asked to wait for a deploy of an app that has never been built.

Fix: deploy it with deploy_files or deploy_github first.

### no_config_dir

There is no keychain and no config folder to store your login in.

Fix: set `DEPLANE_TOKEN` instead.

### no_earlier_release

There is no earlier release that ran successfully, so `deplane rollback` has nothing to go back to.

Fix: run `deplane releases` and roll back to a specific version with `deplane rollback VERSION`.

### no_passkey

There is no passkey on this account yet.

Fix: set up a passkey first, from your account page.

### no_pending_request

There is no pending access request for that email.

Fix: list them with `deplane admin requests`.

### no_disk_space

There is no free disk space on the platform right now, so the disk was not added. We have been alerted.

Fix: try again later or contact support (support@deplane.cloud). See [Disks](disks.md).

### no_releases

This app has no releases yet, so there is nothing to roll back to.

Fix: deploy it first with `deplane deploy`.

### no_secrets

No secrets or secret names were given.

Fix: run `deplane secrets set NAME=VALUE` or `deplane secrets unset NAME`.

### no_team

This account is not in a team any more.

Fix: Ask a team owner to invite you again, or request access at /beta.

### not_a_member

The address is not in your team.

Fix: run `deplane team` to see the members.

### not_found

The resource does not exist, or you do not have access to it. Deplane answers the same way in both cases, so nobody can find out what other organizations have.

Fix: check the name or ID. `deplane apps` lists your apps.

### not_logged_in

You are not logged in.

Fix: run `deplane login`, or set `DEPLANE_TOKEN`.

### not_signed_in

Your sign-in session in the browser has ended.

Fix: sign in again.

### not_suspended

An admin tried to unsuspend an app or organization that is not suspended.

Fix: nothing to do. Check the name or slug.

### nothing_to_change

An app settings change had no port, health check, or automatic rollback setting.

Fix: set the port and health check in `deplane.toml` under `[service]`, then run `deplane deploy`. Turn automatic rollback on or off with `deplane config --auto-rollback on|off`.

### nothing_to_redeploy

The app has never been built, so there is no source to build again.

Fix: deploy it first with `deplane deploy`, from the dashboard, or by connecting GitHub.

### nothing_to_scale

`deplane scale` was given neither a number of instances nor a size.

Fix: run `deplane scale 2` or `deplane scale --size medium`.

### nothing_to_switch

The database you switch from is not attached to any app, or it is the same database.

Fix: pass the original database with `--from`, or attach the restored database to an app with `deplane db attach`.

### oauth_not_allowed

Only you, signed in to the dashboard, can connect an AI tool. CLI logins, CI tokens, AI tool connections, and admin views of a team cannot approve a connection.

Fix: sign in to the dashboard yourself and try again.

### oauth_request_expired

This connection request expired after 10 minutes or was already answered.

Fix: start connecting Deplane again from your AI tool.

### oauth_unavailable

Connecting AI tools is not set up on this server, so the OAuth endpoints and the connections list are off.

Fix: use a CI token from the Tokens page instead.

### ops_not_allowed

An ops token tried something other than deploying the operations team's canary.

Fix: use your own login for anything else.

### origin_not_allowed

A browser on another website sent an access request. The API takes them from a browser only on the Deplane site.

Fix: request access on the Deplane site's [beta page](https://deplane.io/beta), or email support@deplane.cloud. The CLI and scripts that send no `Origin` header are not affected.

### outside_backup_window

The time is outside the database's restore window. The message lists the window, or windows when there are gaps.

Fix: pick a time inside it, or restore the latest moment.

### owners_only

Only the team's owners can invite or remove people.

Fix: ask an owner of the team.

### passkey_ceremony_missing

No passkey request is in progress in this browser.

Fix: reload the page and try again.

### passkey_failed

The passkey could not be verified.

Fix: try again with a passkey registered to this account on this site.

### passkey_required

This needs your passkey or security key. Admins confirm only with a passkey, and approving a CLI login needs one.

Fix: confirm with your passkey or security key, then try again.

### passkeys_unavailable

Passkeys are not set up on this server.

Fix: email support@deplane.cloud.

### payload_too_large

The webhook's body is larger than 10 MB.

Fix: Only GitHub sends webhooks to Deplane; nothing to do.

### preview_database_needs_previews

Preview databases were turned on with pull request previews off. A preview database belongs to a preview, so there would be nothing to give it to. (HTTP 422)

Fix: Turn previews on, or leave preview databases off.

### process_exists

The app already has a worker or cron job with that name.

Fix: pick another name, or change the existing process.

### quota_exceeded

A general quota was reached. Like the `limit_` codes, the CLI exits with code 6.

Fix: follow the fix in the message, or email support@deplane.cloud to raise the limit.

### railpack_plan_failed

Deplane could not work out how to build this project without a Dockerfile. The message shows the last lines of the build planner's output.

Fix: add a Dockerfile, or follow the messages in the build log. Check that your project files, such as `package.json` or `requirements.txt`, are in the folder you deploy.

### rate_limited

Too many requests in a short time. The response has a `Retry-After` header.

Fix: wait a minute and try again. See the rate limits in [Limits](limits.md#rate-limits).

### registry_unavailable

The built image could not be checked because our image storage was unavailable.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### release_not_found

That release version does not exist for this app.

Fix: run `deplane releases` to see the versions.

### report_too_long

A field of an abuse report is longer than allowed.

Fix: shorten the details. Attach evidence by email to abuse@deplane.cloud instead.

### reserved_domain

The hostname is one of Deplane's own domains.

Fix: every app already has an address on Deplane's domain. Connect a domain you own instead.

### restore_running

A restore of this disk is already under way.

Fix: wait for it to finish; the app starts again when it is done. A backup cannot start, and the disk cannot be destroyed, during a restore.

### schedule_on_worker

A worker was given a schedule. Workers always run.

Fix: leave the schedule out, or create a cron job instead.

### second_factor_locked

Too many wrong authenticator or recovery codes. Codes are locked until the time in the message.

Fix: use your passkey, or try again after that time.

### secret_name_reserved

`PORT` and names starting with `DEPLANE_` are set by Deplane.

Fix: pick another name.

### secret_not_found

You tried to remove secrets that are not set. Nothing was changed.

Fix: run `deplane secrets list` to see the names. For build secrets, pass `--build`.

### secret_too_large

A secret value is larger than 32 KB.

Fix: store large files elsewhere and put their location in the secret.

### secrets_too_large

Together, the app's secrets of this kind would be larger than 256 KB.

Fix: remove secrets you no longer need with `deplane secrets unset NAME`.

### session_missing

Your sign-in session in the browser has ended.

Fix: reload the page and try again.

### source_mismatch

The uploaded source does not match the build that was queued for it.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### source_too_large

The project is larger than the upload limits: 100 MB compressed or 2 GiB uncompressed.

Fix: add build output, dependencies, and large data files to `.dockerignore` or `.gitignore`, then deploy again.

### source_too_many_files

The project has more than 200,000 files.

Fix: add dependencies and build output, for example `node_modules`, to `.dockerignore` or `.gitignore`.

### source_unavailable

The uploaded source could not be loaded into the build.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### step_up_required

This action needs a fresh confirmation with your second factor from the last 5 minutes (a passkey for admins). Creating tokens, inviting or removing team members, destroying apps, deleting, restoring or switching databases, and admin commands need it. Destroying an app and deleting, restoring or switching a database each use up their confirmation: the next one asks again.

Fix: run the command in a terminal. The CLI opens your browser so you can confirm, then retries. For 5 minutes after that, the other actions also work from scripts. See [Agents, CI, and scripts](agents.md#actions-that-need-a-fresh-passkey).

### template_app_unhealthy

A template's app was built but did not start (its health check failed). The deploy stopped at its last step; everything it made is kept.

Fix: read the app's logs (`deplane logs --app APP`), then retry with `deplane templates retry DEPLOY-ID` or the dashboard's Retry.

### template_build_failed

A template's build failed. The deploy stopped; everything it made is kept.

Fix: open the build log on the app's page, then retry; a retry builds again.

### template_credentials_not_yours

Only the person who started a template deploy can see the admin sign-in it set up; for a deploy started by a CI token, a team owner can.

Fix: ask the teammate who deployed it, or a team owner.

### template_credentials_shown

The admin sign-in of this template deploy was already shown, more than 10 minutes ago. Deplane shows it once (the same person can ask again within 10 minutes, in case the first answer was lost) and keeps no way to show it later.

Fix: for Vaultwarden, set a new `ADMIN_TOKEN` in the app's Variables and redeploy. Grafana, Listmonk and Gitea offer no reset Deplane can reach: delete the app and deploy the template again, or email support@deplane.cloud.

### template_deploy_failed

`deplane launch --template` followed a deploy that failed. The message says which step and why.

Fix: run `deplane templates retry DEPLOY-ID` to continue from that step, or `deplane templates delete DEPLOY-ID` to remove what it made.

### template_deploy_not_done

The admin sign-in of a template deploy is shown once the deploy is done.

Fix: wait for the deploy to finish (`deplane templates list` shows it), then ask again.

### template_deploy_not_failed

Only a deploy that failed can be retried; this one is running, done or deleted.

Fix: see where it is with `deplane templates list`.

### template_deploy_running

Your team is already deploying a template (one at a time), or you tried to delete a deploy that is still running.

Fix: wait for it to finish or fail; `deplane templates list` shows it.

### template_needs_upgrade

The template needs more than your plan includes, such as a larger size, more memory, more instances, apps, databases or disk. The message says what it needs and what your plan has.

Fix: see the larger plans at https://deplane.cloud/pricing, or email support@deplane.cloud.

### template_no_credentials

This deploy's template sets up no admin sign-in, or the deploy was made before its template did (2026-10-27), so there is nothing to show.

Fix: follow the template's note to sign in.

### template_no_room

Your plan could hold the template, but your team is using too much of it right now. The message says what it needs and what is free.

Fix: destroy or scale down an app (`deplane apps`), or delete a database or disk you no longer need, then deploy again.

### template_not_found

There is no template with that name.

Fix: see the templates with `deplane templates list` or at https://deplane.cloud/templates.

### template_not_ready

This template's image is not ready yet, so it cannot be deployed.

Fix: pick another template, or try again later.

### template_resource_gone

Something a template deploy made (its app, database or disk) was deleted outside the deploy, so it cannot continue.

Fix: delete the deploy (Delete all of it, or `deplane templates delete DEPLOY-ID`) and deploy the template again.

### template_timeout

A step waited too long: the database was not ready in 15 minutes, or the build and rollout took more than 45.

Fix: retry. If it keeps happening, email support@deplane.cloud.

### token_in_env

`DEPLANE_TOKEN` is set, so a stored login would not be used.

Fix: unset `DEPLANE_TOKEN`, then run `deplane login` again.

### too_many_alert_channels

A team can have 10 alert channels.

Fix: Remove one you no longer use first.

### too_many_databases

Your team already has 5 databases, the most allowed. Pull request preview databases do not count.

Fix: delete one you no longer need, or email support@deplane.cloud.

### too_many_deploys

The app was deployed 10 times in the last hour, the most allowed per app.

Fix: wait a few minutes and deploy again. Commands that do not build, such as `deplane scale`, `deplane secrets set`, and `deplane rollback`, still work.

### too_many_domains

The app already has 10 custom domains, the most allowed.

Fix: remove a domain you no longer use, then add the new one.

### too_many_invites

The team has 20 open invitations, the most allowed.

Fix: revoke invitations that were not used.

### too_many_processes

The app already has 10 workers and cron jobs, the most allowed.

Fix: remove one you no longer need first.

### too_many_uploads

Your organization already has two uploads in progress.

Fix: wait for them to finish, then run the command again.

### totp_exists

An authenticator app is already set up on this account.

Fix: use your existing authenticator app.

### totp_setup_missing

No authenticator setup is in progress.

Fix: open the authenticator setup page again.

### totp_unavailable

Authenticator apps are not available for this account. Admin accounts use only passkeys.

Fix: use a passkey or security key.

### unauthorized

Your login is missing, expired, or revoked.

Fix: run `deplane login`. In CI, check that `DEPLANE_TOKEN` holds a token that has not expired or been revoked.

### unexpected_argument

The command got an argument it does not take.

Fix: run `deplane help` for usage. See the [CLI reference](cli.md).

### unknown_command

There is no such command.

Fix: run `deplane help` to see the commands.

### unknown_file

A detection request included a file that detection does not read.

Fix: send only the project's manifest files (package.json, requirements.txt, pyproject.toml, go.mod, Gemfile, composer.json, pom.xml, Dockerfile, index.html, and similar). The dashboard does this for you.

### unknown_flag

There is no such flag.

Fix: run `deplane help` to see the flags.

### unknown_setting

That setting cannot be changed from the admin console.

Fix: Use one of the settings listed in Admin, Settings.

### unsafe_link

A symbolic link in the project points outside the project folder.

Fix: remove the link, or copy what it points to into the project folder. `deplane deploy` skips such links and tells you.

### unsafe_path

The upload contains a path that is unsafe: outside the project folder, through a symbolic link, or listed twice.

Fix: upload with `deplane deploy`, which packages each file once and only from the project folder. Replace symbolic links to folders with real folders.

### unsupported_entry

The upload contains something that is not a file, folder, or symbolic link.

Fix: remove device files, pipes, and hard links from the project folder.

### unsupported_grant_type

The token request used a grant type Deplane does not offer.

Fix: use `authorization_code` or `refresh_token`.

### unsupported_media_type

An upload was not sent as a gzip-compressed tar archive.

Fix: use `deplane deploy`, which packages and uploads the folder for you.

### unsupported_response_type

Deplane supports only the authorization code flow (`response_type=code`).

Fix: update the AI tool and connect again. If you build the tool, use the authorization code flow with PKCE.

### upload_interrupted

The upload was interrupted.

Fix: run the command again. The CLI retries uploads automatically.

### usage

The build runner was started incorrectly. This is a problem on our side.

Fix: run `deplane deploy` again. If it keeps happening, email support@deplane.cloud.

### invalid_redis_name

A Redis name is 3 to 30 characters: lowercase letters, digits and single hyphens, starting with a letter.

Fix: pick a name such as `cache`, `queue` or `sessions`.

### limit_redis

Your plan allows fewer Redis than your team would then have.

Fix: destroy one you no longer need with `deplane redis destroy NAME`, or email support@deplane.cloud to raise the limit.

### mcp_redis_url

AI tools connected to Deplane cannot set `REDIS_URL` by hand.

Fix: attach a Redis with the `attach_redis` tool, or set it yourself in the dashboard. See [MCP](mcp.md).

### no_redis_space

There is no free Redis space on the platform right now. We are alerted automatically.

Fix: try again later, or email support@deplane.cloud.

### redis_attached_elsewhere

The app already uses another Redis as `REDIS_URL`. An app has one Redis.

Fix: detach the other one first with `deplane redis detach NAME --app APP`.

### redis_exists

Your team already has a Redis with that name.

Fix: pick another name.

### redis_failed

The Redis a template deploy made could not start.

Fix: Retry; if it fails again, email support@deplane.cloud.

### redis_not_found

Your team has no Redis with that name.

Fix: see your team's Redis with `deplane redis list`.

### redis_on_preview

A pull request preview cannot use a Redis.

Fix: attach the Redis to the app itself; its previews run without it.

### redis_url_in_use

The app already has a variable called `REDIS_URL` that did not come from a Redis here, and attaching would overwrite it.

Fix: remove it with `deplane secrets unset REDIS_URL --app APP`, then attach the Redis.

### redis_busy

Apps kept attaching to the Redis while it was being destroyed, so it was left as it was.

Fix: try destroying it again.

### watch_not_allowed

A watch token tried something other than reading the platform's health or reporting checks and drills.

Fix: use your own login for anything else.
