# Error codes

| Code | Meaning | Fix |
|---|---|---|
| [DETECT_NO_PROJECT](/docs/errors/DETECT_NO_PROJECT.md) | No deployable project found in this directory. | Run deploy from the directory that contains package.json, pyproject.toml, requirements.txt or Gemfile. |
| [DETECT_UNSUPPORTED_FRAMEWORK](/docs/errors/DETECT_UNSUPPORTED_FRAMEWORK.md) | The framework in this project is not supported yet. | Supported today: Next.js, Express, Hono, Fastify, any Node app with a start script that listens on process.env.PORT, Django, Flask, FastAPI, Vite, Spring Boot and Rust. Convert the app to one of those and deploy again. |
| [DETECT_AMBIGUOUS_ENTRYPOINT](/docs/errors/DETECT_AMBIGUOUS_ENTRYPOINT.md) | More than one way to start this app was found. | Set "start" in package.json scripts to the single command that starts the server, then re-run deploy. |
| [ENGINE_CONVERSION_REQUIRED](/docs/errors/ENGINE_CONVERSION_REQUIRED.md) | This app uses a database engine the platform does not host. | Postgres is the platform database. Convert the data layer to Postgres (keep the ORM, change the provider/dialect and any engine-specific SQL), then re-run deploy. If you must keep SQLite, no change is needed: it will run on the stateful tier. |
| [AUTH_PROVIDER_AVAILABLE](/docs/errors/AUTH_PROVIDER_AVAILABLE.md) | This app implements its own login, but the platform already signs people in. | Remove the auth library and read the signed-in user with getUser(request) from @uarpie/sdk. Invited people are signed in by the platform before the app runs. This is a warning; deploy continues. |
| [BUILD_FAILED](/docs/errors/BUILD_FAILED.md) | The build failed. | Open log_url, fix the first error in the build output, then re-run deploy. |
| [BUILD_MISSING_DEPENDENCY](/docs/errors/BUILD_MISSING_DEPENDENCY.md) | Build failed: a module the code imports is not in package.json. | Add the missing module to dependencies in package.json, then re-run deploy. |
| [BUILD_TIMEOUT](/docs/errors/BUILD_TIMEOUT.md) | The build ran longer than the limit and was stopped. | Remove heavy postinstall steps or large assets from the build, then re-run deploy. |
| [BUILD_IMAGE_TOO_LARGE](/docs/errors/BUILD_IMAGE_TOO_LARGE.md) | The built app is larger than the runtime limit. | Move large static files to storage (see @uarpie/sdk storage) and remove unused dependencies, then re-run deploy. |
| [MIGRATE_FAILED](/docs/errors/MIGRATE_FAILED.md) | The database migration failed. | Open log_url, fix the failing migration, then re-run deploy. The previous version is still live. |
| [MIGRATE_DESTRUCTIVE_BLOCKED](/docs/errors/MIGRATE_DESTRUCTIVE_BLOCKED.md) | The migration would drop or rewrite existing data and was not applied. | Make the migration additive (add columns/tables instead of dropping or renaming), or re-run deploy with allow_destructive_migration: true after the owner confirms. |
| [PROVISION_FAILED](/docs/errors/PROVISION_FAILED.md) | The platform could not create a resource this app needs. | Re-run deploy. If it fails again with the same code, nothing in the project is wrong; report the deployment_id. |
| [ROUTE_FAILED](/docs/errors/ROUTE_FAILED.md) | The app was built but could not be given an address. | Re-run deploy. The build is cached, so this is fast. |
| [DOMAIN_INVALID](/docs/errors/DOMAIN_INVALID.md) | That is not a domain name the platform can attach. | Use a hostname you control, like app.example.com, without a scheme or path. |
| [DOMAIN_SCREENING_HOLD](/docs/errors/DOMAIN_SCREENING_HOLD.md) | This domain is being reviewed before it can be attached. | No action needed. Check status again later; the owner will be emailed when review completes. |
| [DOMAIN_DNS_PENDING](/docs/errors/DOMAIN_DNS_PENDING.md) | The DNS record for this domain has not been seen yet. | Add the CNAME record in dns_records at the domain's DNS provider, then check status again. |
| [HEALTHCHECK_FAILED](/docs/errors/HEALTHCHECK_FAILED.md) | The new version started but did not answer a request. | Make sure the server listens on process.env.PORT and responds to GET / within 10 seconds. Open log_url for the startup output, then re-run deploy. The previous version is still live. |
| [DEPLOY_IN_PROGRESS](/docs/errors/DEPLOY_IN_PROGRESS.md) | Another deploy of this project is already running. | Wait for the running deployment to finish (poll status with deployment_id), then re-run deploy. |
| [NOTHING_CHANGED](/docs/errors/NOTHING_CHANGED.md) | The app and its settings are identical to the live version. | No action needed. Change a file or a setting and re-run deploy. |
| [SCHEMA_DRIFT](/docs/errors/SCHEMA_DRIFT.md) | Rolling back code only: the database schema changed after the target version. | If the older code fails against the current schema, run rollback again with with_data: true after the owner confirms losing writes since that version's snapshot. |
| [UNAUTHORIZED](/docs/errors/UNAUTHORIZED.md) | No valid credential was presented. | Run deploy from the same machine that created the project, or sign in with `uarpie login`. |
| [FORBIDDEN](/docs/errors/FORBIDDEN.md) | This credential cannot act on that project. | Use the account that owns the project, or ask the owner to invite you. |
| [BIND_TOKEN_EXPIRED](/docs/errors/BIND_TOKEN_EXPIRED.md) | This link has expired. | Re-run deploy to mint a fresh link. It costs nothing. |
| [BIND_TOKEN_CONSUMED](/docs/errors/BIND_TOKEN_CONSUMED.md) | This app is already in use on another device. | Ask the owner to invite you by email from the app's share screen. |
| [PROJECT_NOT_FOUND](/docs/errors/PROJECT_NOT_FOUND.md) | No project with that id exists. | Check deploy.json in the project root, or run list_projects. |
| [PROJECT_EXPIRED](/docs/errors/PROJECT_EXPIRED.md) | This app was never claimed and has been removed. | Re-run deploy to create it again, then open the link and choose "keep this app". |
| [ACCOUNT_REQUIRED](/docs/errors/ACCOUNT_REQUIRED.md) | This action needs a claimed account. | Open the app's link and choose "keep this app" to claim it, then retry. |
| [SPEND_CAP_REACHED](/docs/errors/SPEND_CAP_REACHED.md) | This app is paused because it reached the account's spending limit. | The owner can raise or turn off the limit in the dashboard. No code change will help. |
| [RATE_LIMITED](/docs/errors/RATE_LIMITED.md) | Too many requests in a short time. | Wait for the number of seconds in details.retry_after, then retry. |
| [MAIL_UNDELIVERABLE](/docs/errors/MAIL_UNDELIVERABLE.md) | The email could not be sent. | Check the address for a typo, then try again. Nothing about the app itself is affected — this is only the email. |
| [EGRESS_NOT_ALLOWED](/docs/errors/EGRESS_NOT_ALLOWED.md) | The app tried to reach an address it is not allowed to reach. | Add the hostname to "egress" -> "allow" in deploy.json and deploy again. Apps can only reach addresses they declare; that is deliberate, and it is what stops a package nobody audited sending data somewhere nobody chose. |
| [DESKTOP_SHELL_UNAVAILABLE](/docs/errors/DESKTOP_SHELL_UNAVAILABLE.md) | Desktop apps cannot be made for that system right now. | Nothing in the app is wrong. The platform's desktop shell for that operating system has not been published; try again later or choose another system. |
| [PLAN_LIMIT_REACHED](/docs/errors/PLAN_LIMIT_REACHED.md) | The account's plan does not allow this. | The owner can upgrade the plan in the dashboard, or remove an existing project. |
| [SECRETS_TOO_LARGE](/docs/errors/SECRETS_TOO_LARGE.md) | The app's settings exceed the 4 KB runtime limit. | Move large values (certificates, JSON blobs) to a file in storage and reference it by key. |
| [SOURCE_UNAVAILABLE](/docs/errors/SOURCE_UNAVAILABLE.md) | The source for that version is no longer stored. | Older versions fall outside the plan's retention. Clone the live version instead (omit --version), or ask the owner to upgrade the plan for longer history. |
| [LOGIN_CODE_INVALID](/docs/errors/LOGIN_CODE_INVALID.md) | That sign-in code is not valid or has expired. | Run `uarpie login` again to get a fresh code and open the link it prints within 10 minutes. |
| [MOBILE_STORE_STEP_REQUIRED](/docs/errors/MOBILE_STORE_STEP_REQUIRED.md) | The app's server and web version are live. Publishing the phone app to the App Store or Google Play is not something the platform does yet. | Tell the person their app is usable now: open the link on the phone and choose 'Add to Home Screen'. A store listing is a separate step that needs their own Apple Developer account ($99/year) or Google Play account ($25) and a review by Apple or Google; once connected, the build and upload can be automated, but that is not available yet. Do not promise a store release or a date. |
| [MOBILE_NO_SERVER_FOUND](/docs/errors/MOBILE_NO_SERVER_FOUND.md) | This is a phone app with no server in the folder, so there is nothing to host yet. | If the app talks to a backend, deploy that folder instead. If it needs one, create it (an Express or Hono server with the API routes the app calls) and deploy that; then point the app at the URL the deploy prints. |
| [PUBLISH_NOT_CONFIRMED](/docs/errors/PUBLISH_NOT_CONFIRMED.md) | Making an app public is not something to do on someone's behalf without asking. | Tell the owner in plain words that anyone with the address will be able to open the app and see what is in it, and that invitations stop being needed. Only if they agree, call again with confirm_public: true. If they are unsure, leave it private; it can be published later at any time. |
| [STORE_ACCOUNT_REQUIRED](/docs/errors/STORE_ACCOUNT_REQUIRED.md) | No developer account is connected for that store. | The owner has to enrol with Apple or Google themselves and then connect that account in the dashboard under the app's Address tab. Explain that this is a one-time step involving their own name, payment and identity check; nobody can do it for them. Their app is still installable from its link in the meantime. |
| [STORE_CREDENTIAL_REJECTED](/docs/errors/STORE_CREDENTIAL_REJECTED.md) | Apple or Google refused the connected developer credential. | The key was probably revoked, expired, or lacks permission. Ask the owner to generate a new one in their developer console and connect it again. Do not retry with the same credential. |
| [RELEASE_IN_PROGRESS](/docs/errors/RELEASE_IN_PROGRESS.md) | A release to that store is already running for this app. | Wait for it to finish; check with the releases tool. Starting a second one would be charged twice. |
| [RELEASE_PLATFORM_UNAVAILABLE](/docs/errors/RELEASE_PLATFORM_UNAVAILABLE.md) | Releases to that store are not available yet. | Tell the person their app is installable today by opening its link on the phone and choosing 'Add to Home Screen'. Do not promise a store release or a date. |
| [RELEASE_NOT_CONFIRMED](/docs/errors/RELEASE_NOT_CONFIRMED.md) | A store release costs money, so it needs the amount confirmed before it starts. | Call estimate_release first, show the person the exact amount it returns, and only after they agree call release again passing that quote_id and the same confirm_cents. Never guess the number. |
| [RELEASE_QUOTE_EXPIRED](/docs/errors/RELEASE_QUOTE_EXPIRED.md) | That price quote is no longer current. | Call estimate_release again for a fresh quote, show the person the new amount, and retry with it. |
| [DOMAIN_UNAVAILABLE](/docs/errors/DOMAIN_UNAVAILABLE.md) | That domain cannot be bought here. | Show the person the note in details — taken, premium, or an ending the platform does not sell — and offer the alternatives in details.alternatives, or use add_domain with a domain they already own. |
| [DOMAIN_QUOTE_EXPIRED](/docs/errors/DOMAIN_QUOTE_EXPIRED.md) | That price quote is no longer current. | Call buy_domain again without quote_id for a fresh quote, show the person the new confirmation sentence, and retry with the new quote_id once they say yes. |
| [DOMAIN_ORDER_IN_PROGRESS](/docs/errors/DOMAIN_ORDER_IN_PROGRESS.md) | A domain is already being bought for this app. | Wait for it to finish; read it with GET /v1/projects/{id}/domains/orders. One domain order at a time per app. |
| [AI_UNAVAILABLE](/docs/errors/AI_UNAVAILABLE.md) | Drafting with AI is not set up on this server. | Set ANTHROPIC_API_KEY in the API's environment and restart it. Until then, write the page by hand; nothing else is affected. |
| [SITE_PAGE_PROTECTED](/docs/errors/SITE_PAGE_PROTECTED.md) | That page is part of the site itself and cannot be deleted or given a different address. | Edit its content instead. To take it out of the navigation, turn off nav.show. Only pages created in the console can be deleted. |
| [SITE_SLUG_TAKEN](/docs/errors/SITE_SLUG_TAKEN.md) | Another page or post already uses that address. | Choose a different slug, or edit the existing page instead of creating a second one. |
| [INTEGRATION_NOT_CONFIGURED](/docs/errors/INTEGRATION_NOT_CONFIGURED.md) | That figure comes from an outside service that is not connected. | Set the environment variables named in details.variables on the API and restart it. |
| [VALIDATION_FAILED](/docs/errors/VALIDATION_FAILED.md) | The request was malformed. | Check details.issues for the fields that failed validation and correct them. |
| [INTERNAL](/docs/errors/INTERNAL.md) | Something went wrong on the platform. | Retry once. If it fails again, report the request_id in details. |
