Skip to content
Console →
Website →
Asking an AI? Paste this URL https://keelson.dev/llms.txt

Error codes

Errors are returned with a code and a hint that explains how to resolve them. You can pass them directly to an AI agent for resolution. When a workspace-named code replaces an older tenant-named code, error.aliases contains the old code for compatibility; no removal date is set. This page groups a human-readable list by where each error occurs.

These findings are reported before upload and can also be checked with keelson deploy --check. Errors stop the deployment; warnings do not. A missing dependency manifest is an error for Go, but only a warning for Python and Node.js.

CodeCauseResolution
missing_dependency_manifestNo dependency manifest for the selected runtimeFor Go, add go.mod to the project root. For Python or Node.js, add a manifest if the app uses external libraries; no dependency manifest is required for a standard-library-only app
command_installs_dependenciescommand contains pip install / npm install / go buildRemove it and leave only the start command
runtime_command_mismatchThe languages of runtime and command do not match (for example, node with python-slim)Correct either one
assets_dir_emptyassets.dir is missing or empty, or the path uses the wrong letter caseRun the build and check the path
assets_fallback_missingThe assets.fallback file is not in assets.dirCheck the build output
db_wiring_fail (warning)db.mode does not match the database connection in the codeSwitch to a libSQL client that reads KEELSON_DB_URL
file_wiring_fail (warning)State files or uploads are written to local diskReplace this with the Files / Media SDK
CodeCauseResolution
invalid_keelson_configInvalid YAML, a db.mode other than libsql / none, db.migrate used with none, env beginning with KEELSON_, a path under /__keelson, an unknown runtime, more than 10 crons, or another configuration errorCorrect the issue described in message
config_missing_fieldA required field such as slug, runtime, or db is missingAdd it
env_value_not_stringAn env value or key is not quoted, a key is duplicated, or a merge key is usedQuote every value and key
description_too_longdescription is longer than 300 charactersShorten it
workers_not_supportedworkers: is presentRemove it and use crons
DB_DATABASES_REMOVEDdatabases: is presentRemove it. Use db.mode: libsql for persistent data
SQLITE_LOCAL_SQLITE_INVALID_PATHA db.local_sqlite.paths value is outside /tmp/Use /tmp/ or :memory:
CRON_TIMEOUT_EXCEEDS_STANDARD_LIMITA crons[].timeout value exceeds 600 secondsReduce it or split the operation
plan_cron_limit / plan_cron_min_interval / plan_schedule_timeoutThe number, interval, or timeout of crons exceeds the plan limitReduce it or upgrade the plan
reserved_path_conflictThe build output has an __keelson directory at its rootRename the directory
ARTIFACT_SQLITE_FILE_DRIVERA file-based SQLite client such as sqlite3 or better-sqlite3 was detectedMigrate to a libSQL client. For temporary use, declare it in db.local_sqlite
ARTIFACT_EXEC_NODE_CRON / _APSCHEDULER / _BACKGROUND_TASKS / _SET_INTERVAL (notice)An in-app scheduler was detectedMove it to crons

These are shown by keelson status / keelson diagnose.

CodeCauseResolution
deploy.config.invalidInvalid keelson.yaml contentCorrect the reported key and deploy again
deploy.config.secret_missingA secret declared in secrets.required is not setSet every secret with keelson secrets set <KEY> (the value is read from standard input), then deploy again
deploy.artifact.invalidArchive problem such as a missing lockfile or detection of a blocked itemCorrect the reported issue
deploy.build.failedBuild failed because dependency resolution failed, a build script produced an error, or the build exceeded 900 secondsCheck the deploy logs
deploy.build.image_too_largeThe image is too largeRemove unnecessary dependencies or files
deploy.runtime.start_failedThe app exited during startup or the container did not reach the running stateRead the stored startup logs with keelson logs deploy <deploy_id>, then verify PORT and 0.0.0.0
deploy.runtime.health_check_failedThe app may have exited during startup, or / (or health.path) returns 5xx or does not respond within 120 secondsRead the stored startup logs with keelson logs deploy <deploy_id>, then check the listening port and health.path
deploy.runtime.migration_faileddb.migrate exited with a nonzero status. The previous revision continues serving trafficCorrect the migration and deploy again
deploy.verify.failedA verify path cannot be fetched, or the Content-Type of JavaScript or CSS does not matchCheck the path and build output
deploy.plan.limit_exceededA plan limit was exceededReduce usage or upgrade the plan
deploy.plan.cron_count_exceededThe app declares more crons than the plan allowsReduce the number of crons or upgrade the plan
deploy.plan.cron_interval_too_shortA cron fires more often than the plan’s minimum intervalIncrease the interval or upgrade the plan
deploy.plan.schedule_timeout_exceededAn explicit crons[].timeout exceeds the plan’s ceilingLower the timeout or upgrade the plan
deploy.app.suspendedThe app is suspendedResume it before deploying
deploy.app.operation_in_progressThe deploy could not start because another operation was in progress for this appWait for the other operation to finish, then deploy again
deploy.platform.temporarily_unavailableTemporary outageWait briefly and retry
deploy.platform.errorPlatform errorContact support with the deploy_id
deploy_in_progress (409)Another deploy or app operation is in progressWait for the operation to finish, then run the same command again
build_rate_limit_exceeded / build_guardrail_exceeded (429)The limit for build count, build time, concurrent builds, or consecutive failures was exceededThe message states when the restriction clears. For consecutive failures, fix the cause and wait until the stated time. The trial build allowance is cumulative and does not reset by waiting; change plans in that case
saved_config_unsupported (409)The keelson.yaml for a redeploy or rollback does not conform to the current schemaCorrect it and perform a normal deploy
region_not_available (422)The selected region is not accepting new applicationsCreate the app in Japan (jp-tokyo) or wait for the region to open
region_unknown (422)The selected value is not a Keelson logical region keyUse jp-tokyo (Japan) or us-oregon (US West), not a cloud-provider region name
region_immutable (422)A deploy tried to change an existing application’s placement regionRemove --region and deploy again, or create a separate application
CodeMeaningResolution
not_logged_inNot logged inRun keelson login
multiple_workspaces / workspace_ambiguous / workspace_not_found / no_workspacesThe workspace cannot be identifiedUse --workspace <slug>. Search with keelson workspaces list --query
app_not_foundThe app was not foundCheck the slug. For a new app, use --new
app_manage_requiredThe app exists, but you do not have manage permissionAsk a current manager to add you to a group with manage permission. Workspace OWNERs and ADMINs can add themselves with keelson groups members add <group> <email>
app_deletingThe app is being deletedWait for completion
forbiddenYou do not have permission. CONSOLE_ONLY_OPERATION identifies an operation limited to the consoleCheck the role and app permissions
confirmation_requiredThe operation requires browser approvalOpen the displayed URL and approve it. Do not run the command again
confirmation_expired / confirmation_rejectedApproval expired after 15 minutes or was rejectedRun the command again
deploy_failedDeploy failedRun keelson diagnose <deploy_id>
sql_failedSQL in db apply failed and was rolled backCorrect the SQL
last_manage_binding_removed / no_effective_manager / self_lockoutaccess set would leave the manage group list empty or leave no effective managerRetain a manage group. To remove yourself, use --allow-self-lockout
transientTemporary network errorRetry with --retry
skill_outdated (meta.skill_outdated)The Skill is older than the CLIRun keelson install-agent --yes
DisplayStateResolution
Login screenNot logged inLog in with an account registered in the workspace
”Access denied” (403)The user is not a member, is blocked, or lacks app view permissionAsk an administrator to register the member or grant permission
”This application is only available from approved networks” (403)Rejected by IP controls. The page shows the source IPAsk an administrator to add an access source for that IP
”The app cannot start right now because no app slot is available.” (503)Limit on the number of apps that can run concurrentlyWait about 5 minutes. Consider priority startup or a plan change
”Starting the app”Starting from sleepWait a few seconds; the page reloads automatically
”This application has been suspended” (503)The app is suspendedAn administrator must resume it
”App not found” (404)The URL is wrong or the app was deletedCheck the URL
410 GoneThe app URL changed. The old URL is reserved for 30 daysDirect users to the new URL
504The app did not respond within 120 secondsShorten the operation or move it to a cron
501WebSocket is not supportedUse SSE or polling

When the same situation occurs through an API or XHR request, the response has the same status as JSON and the x-keelson-error header contains the reason, such as ip-restricted, app-view-denied, capacity-full, or app-suspended.

External integrations (app tokens / Webhook)

Section titled “External integrations (app tokens / Webhook)”

The detailed reason is returned in X-Keelson-Auth-Error; for compatibility, the JSON detail remains machine-forbidden or webhook-forbidden for IP allowlist denials.

machine-forbidden and webhook-forbidden intentionally group a missing app, a token belonging to another app, and a route that disappeared so callers cannot use the response to determine whether an app exists.

X-Keelson-Auth-ErrorCause
invalid-app-tokenThe token is invalid or revoked
machine-scope-deniedThe token scope (api / webhook) does not match the path
machine-endpoint-deniedThe path or method is not declared in auth.endpoints
machine-forbidden / webhook-forbiddenThe app is missing, the token belongs to another app, or the route disappeared
machine-ip-not-allowedThe request came from outside the app token’s allowed IP ranges
invalid-webhook-secretThe Webhook secret does not match
webhook-scope-deniedThe token does not have the webhook scope
webhook-ip-not-allowedThe request came from outside the Webhook token’s allowed IP ranges
webhook-endpoint-blockedThe path is reserved by the platform, such as /api/webhooks/email