Skip to content

error codes

github-actions[bot] edited this page Oct 26, 2026 · 59 revisions

Error Codes Reference

Every user-facing error in the ɳSelf CLI includes a stable code, a plain-language explanation, and a suggested fix. This page is the catalog for all registered error codes.


How errors appear in the CLI

An error that carries a code (a structured error, or a known failure such as Docker not running) prints a block on stderr:

Error: [E001] Docker not installed
  Why: The docker binary was not found in PATH.
  Fix: Install Docker: https://docs.docker.com/get-docker/
  Docs: https://nself.org/docs/reference/error-codes#e001

The Why, Fix and Docs lines appear only when they have content. Every other error still prints one line, Error: <message>, and exits 1.

The code in brackets (e.g., [E001]) is stable across CLI versions. You can search this page by code to find the cause and fix. The exit status is the Exit column of the code's row; see Exit-Codes for the classes.

The coded block and the exit classes (2, 3, 4) are v1.5 behaviour. They are on from v1.5.0 and opt-in before that with NSELF_V15=1; see Compat-V15. Without it, errors print as Error: <message> and exit 1.


Looking up an error

  • Copy the bracketed code from the terminal output (e.g., E102).
  • Search this page for that code (Ctrl+F or Cmd+F).
  • The fix column gives you the fastest path to resolution.

Docker (E001-E049)

These errors occur when the CLI cannot find or communicate with Docker.

Code Exit Summary Why Fix
E001 2 Docker not installed The docker binary was not found in PATH. Install Docker: https://docs.docker.com/get-docker/
E002 2 Docker daemon not running The Docker daemon is not responding to commands. Start Docker Desktop or run: sudo systemctl start docker
E003 2 Docker Compose not available docker compose v2 plugin is not installed. Update Docker Desktop or install the compose plugin manually.
E004 2 docker-compose.yml not found No docker-compose.yml exists in the project directory. Run 'nself build' to generate the compose file.
E005 2 Port conflict A required port is already in use by another process. Run 'nself doctor' to identify the conflict, then stop the conflicting process or change the port in .env.

Config (E050-E099)

These errors occur during configuration validation or when reading .env files.

Code Exit Summary Why Fix
E050 1 No .env file found No .env or .env.dev file exists in the project directory. Run 'nself init' to generate a configuration file.
E051 1 Invalid config key The configuration key contains invalid characters. Config keys must contain only A-Z, 0-9, and underscores.
E052 1 Config validation failed One or more configuration values are invalid. Run 'nself config validate' to see all issues, then fix the reported values.
E053 1 Weak password detected A password field does not meet minimum length or contains insecure patterns. Use a strong, randomly generated password of at least 16 characters.
E054 1 Invalid project name Project name contains characters not allowed in Docker and DNS contexts. Use only lowercase letters, numbers, and hyphens. Must start with a letter.
E055 1 Duplicate route detected Two or more services are configured with the same nginx route. Check ROUTE values in .env and ensure each service has a unique route.
E056 1 Unknown config key The key is not recognized by nself. Check for typos. Run 'nself config list' to see all valid keys.
E057 1 Insecure password pattern A password matches a known insecure pattern such as a dictionary word, a repeated character or a default value. Replace it with a randomly generated password of at least 16 characters.
E058 1 CORS wildcard not allowed in production The CORS origin list contains a wildcard while the environment is production. List the exact origins in HASURA_GRAPHQL_CORS_DOMAIN, or use a development environment for wildcards.
E059 1 Secret is empty or a placeholder A required secret is empty or still holds a placeholder value from the template. Generate a real value and set it in .env, then run the command again.
E060 1 CLI older than project minimum The project's cli_min_version is newer than this nself CLI. nself update
E061 1 Invalid CLI minimum version cli_min_version in nself.yaml is not semantic version X.Y.Z. Set cli_min_version to a complete semantic version, such as 1.4.0.

Plugin and License (E100-E149)

These errors occur when installing plugins or validating license keys.

Code Exit Summary Why Fix
E100 1 Plugin not found The requested plugin does not exist in the registry. Run 'nself plugin list' to see available plugins.
E101 3 Invalid license key The license key format is invalid. License keys start with 'nself_pro_' followed by 32+ characters. Check your key.
E102 3 License tier insufficient Your license tier does not include this plugin. Upgrade your plan at https://nself.org/pricing
E103 3 License expired The license key has expired. Renew your license at https://nself.org/account
E104 3 License validation failed (network) Cannot reach the license server and no valid local cache exists. Check your internet connection. Previously validated licenses work offline for 7 days.
E105 1 Circular plugin dependency Plugin dependency graph contains a cycle. Report this as a bug at https://github.com/nself-org/cli/issues
E106 1 Invalid plugin manifest The plugin manifest is missing a required field or contains an invalid value. Fix the manifest fields named in the message, or reinstall the plugin: nself add
E107 1 Plugin is not signed A stable plugin release has no signature, so the install was refused. Use a release that carries a signature, or report the missing signature to the plugin publisher.
E108 1 Plugin checksum missing A stable plugin release has no checksum, so the install was refused. Use a release that carries a checksum, or report the missing checksum to the plugin publisher.
E109 1 Duplicate plugin slug The same plugin slug is served by more than one unrelated registry entry. Report this to the registry maintainers. Install the plugin by its full registry name if one is shown.
E110 3 License does not entitle this plugin tier The installed license does not include this Licensed plugin. Check your plan with: nself license status. Upgrade at https://nself.org/pricing if the tier is missing.
E111 1 Forbidden key in a v2 plugin manifest A manifest_version 2 plugin.json carries a key that belongs to the registry or to a legacy format (bundles, tier_pair, author_public_key, signature, checksum). Remove the key from plugin.json. Bundle membership lives in bundles.json and signatures are added by the release pipeline.
E112 1 Plugin manifest compatibility keys drifted The generated compatibility keys (pluginType, binaryName, cliCommands, minNselfVersion, status, isCommercial, licenseType, requires_license, tier) no longer match the v2 fields they are derived from. Regenerate them: go run github.com/nself-org/cli/tools/manifestv2migrate -in plugin.json -compat -write
E113 1 Plugin command collides with a core command commands.command is one of the core command verbs, so the plugin cannot be mounted under it. Rename commands.command in plugin.json to a name that is not a core verb.
E114 1 Unsupported plugin manifest version plugin.json declares a manifest_version this nself release does not read (supported: 1 or absent, and 2). Set manifest_version to 2, or upgrade nself if the manifest was written for a newer release.
E115 2 Plugin catalog unavailable The CLI could not fetch https://plugins.nself.org/catalog.json and has no cached copy to fall back on. Check the network connection and run the command again; once one fetch succeeds the catalog is cached under ~/.nself/cache/plugins and later runs work offline.
E116 2 Plugin catalog invalid The catalog document does not parse as catalog schema 1: it is not JSON, has another schema_version, lists no plugins, or a plugin row is malformed. An invalid document is never cached. Run the command again in a few minutes; if it keeps failing, update the CLI and report the problem at https://github.com/nself-org/plugins/issues.
E117 1 Command provided by an uninstalled plugin The command is not built in and no installed plugin provides it, but the cached plugin catalog lists a plugin that does. Install the plugin named in the message with nself add , then run the command again.
E118 2 Plugin migrations not applied in time The bounded wait ended before the plugin's /health reported every migration applied: it reported fewer applied than expected, or it never answered HTTP 200 (hang, error status, redirect). The plugin applies its own SQL at boot; the CLI never applies it. Read the plugin logs (docker logs nself_) for the failing migration. A slow first boot needs a longer wait: set NSELF_PLUGIN_READY_TIMEOUT (seconds).
E119 2 Plugin health lacks migrations status The plugin declares migrations but its /health response has no valid "migrations" {applied, expected} field (absent, wrong type, negative, applied above expected, or a body over 1 MiB), so readiness cannot be proven. Update the plugin to a release built on sdk/go/migrate, which serves the migrations field in /health.
E120 1 Plugin ships migrations without boot apply The plugin has a migrations/ directory but its manifest does not declare migrations.apply: boot, so nothing applies the SQL when the plugin starts. Add "migrations": {"dir": "migrations", "apply": "boot"} to plugin.json and apply the files at boot with sdk/go/migrate.
E121 1 Plugin release signature is invalid The release signature in the registry does not verify for this tarball, or it is malformed. The download may have been tampered with. Retry the install. If it keeps failing, report the plugin and version to nself-org/plugins; do not bypass the check.
E122 1 Plugin release signed by an unknown key The release signature names a key id that this CLI does not trust for this plugin tier. Trusted keys are compiled into the CLI. Update the CLI (nself update) so it carries the current release keys, then retry the install.
E123 1 Plugin release signed by a revoked key The key that signed this release has been revoked, so the release is no longer trusted. Install a newer release of the plugin, or update the CLI (nself update) and retry.
E124 1 Plugin download checksum mismatch The downloaded tarball does not match the checksum published in the registry. Nothing was extracted. Retry the install. If the mismatch repeats, the download source may be corrupted or tampered with; report it to nself-org/plugins.
E125 3 Licensed plugin entitlement JWT unavailable The CLI could not obtain a verified ping-issued licence JWT covering every licensed plugin within grace. A still-valid runtime token is retained unless rejected or its key was removed; otherwise the runtime guard stays closed. Set a valid licence with nself license set, check connectivity to ping.nself.org, and run nself license refresh followed by nself build.
E126 1 Plugin entitlement file is stale The verified entitlement JWT expired more than seven days ago. Licensed plugins stop serving after the thirty-day grace ends. Run nself license refresh followed by nself build before the entitlement grace expires.
E127 1 Plugin declares no seed command The plugin's manifest has no seed.command, so nself db seed --plugin has nothing to run inside its container. Ask the plugin author to declare an idempotent seed argv under "seed": {"command": [...]} in plugin.json, or seed the data another way.
E128 1 Compose plugin has no compose fragment The plugin declares a compose service (service.kind compose, or a Dockerfile and a port), but it ships no docker-compose.plugin.yml, so nself build would silently leave it out of the stack. Reinstall or update the plugin so its docker-compose.plugin.yml is present, or ask the plugin author to mark it service.kind cli or library if it runs no container.
E129 1 Plugin fragment uses a foreign external network The plugin's docker-compose.plugin.yml attaches a service to an external network other than the project network, which would reach outside this stack. Attach the service to ${DOCKER_NETWORK} only, or remove the plugin; ask the plugin author to drop the external network from the fragment.
E130 1 plugin compose fragment violates policy (ADR 0027) A plugin compose fragment asks for something the plugin policy forbids, such as mounting the Docker socket. Remove the offending setting from the plugin's docker-compose.plugin.yml, or remove the plugin.
E131 1 Plugin tier change needs --tier An update would move an installed plugin to another tier (free or licensed), and nself never changes the tier of an existing install on its own. Re-run with --tier free or --tier licensed to choose the tier on purpose, or keep the installed tier by leaving the plugin as it is.
E132 1 No active entitlement refresh timer A licensed plugin is installed but no host timer refreshes the entitlement file, so the plugin stops serving 30 days after the last build, start or manual refresh. The timer is missing, was removed with its project or binary, or the project or nself binary path failed the safety rule (unsafe-path). Run nself build to install the timer again, or nself license refresh from your own scheduler. NSELF_ENTITLEMENT_AUTOREFRESH=false turns the timer off on purpose.
E133 1 Plugin still referenced by a bundle The plugin is a member of an installed bundle (the bundle install ledger lists it under installed_by), so removing it on its own would leave that bundle half installed. Remove the bundle that references it (nself bundle remove ; plugins no other bundle needs and you did not install yourself go with it), or pass --force to remove only this plugin.
E134 1 Bundle not installed The bundle install ledger at /.nself-state/bundles.json does not record this bundle, so nothing it installed is removable as a unit. A bundle is recorded only when all of its plugins are installed. Remove the individual plugins with nself plugin remove .
E135 2 Bundle not app-ready Every plugin of the bundle was installed, but a later step did not finish: reconcile, start, readiness (boot migrations applied), tracking (every manifest table tracked in Hasura) or health. The message names the bundle, the step and the plugin. Read the failing step in the report, fix its cause (docker logs nself_ for readiness), then run the bundle install again; plugins that are already installed are not reinstalled.
E136 1 Bundle ledger lists a missing plugin The bundle install ledger records a plugin whose directory or plugin.json is gone from the plugin directory, so the ledger and the disk disagree. Reinstall the bundle (nself bundle install ) to restore the missing plugin.
E137 1 Template requires a plugin that is in no registry The clone template lists a required plugin that neither the free nor the licensed plugin catalog publishes, so the project it writes could not run. Pick another template, or scaffold without this one and add the plugin yourself once it is published. List what exists with: nself plugin search.
E138 1 MinIO moved to a plugin In v1.5 core object storage is SeaweedFS and MinIO is no longer a core service. Run nself add minio to keep the minio_data volume and minio service name with unchanged data, or set OBJECT_STORAGE_ENABLED=true and MINIO_ENABLED=false for a new empty SeaweedFS store, or set MINIO_ENABLED=false if this project does not use MinIO. Back up and move existing data dump-first.
E139 2 Update stack step failed, resumable A stack upgrade step failed. The journal records the failed step and the verified recovery backup; production recovery awaits the operator. Read .nself/state/update-stack.json and retry nself update stack --yes. If awaiting-operator or rollback-failed, run the exact backup restore command shown, then restart the previous images from the pinned snapshot (.nself/state/update-stack-previous-*.json) with the docker compose command shown, before starting a new upgrade.
E140 2 Plugin tables not tracked in Hasura The plugin installed and reported its boot migrations applied, but the CLI could not track its manifest tables in Hasura (Hasura unreachable, the admin call failed, or a table the manifest lists does not exist in Postgres), so the plugin's tables are not queryable through GraphQL. The message names the plugin, the untracked tables and the underlying error. Run the install again: tracking is idempotent and only tracks what is still missing. Check that Hasura is up with nself db hasura (status) and that the plugin applied its migrations (docker logs nself_).
E141 1 Plugin command binary already provided by another plugin The plugin declares a command whose binary (nself-) another installed plugin already publishes. The command proxy runs one binary per command, so installing this plugin would replace the other plugin's command. The message names both plugins and the command. Remove the other plugin first (nself remove <plugin>) if you mean to replace its command, or install a version of this plugin whose cliCommands do not overlap. Plugin authors: give each command a name unique to the plugin.
E142 1 Object storage credentials missing or unusable OBJECT_STORAGE_ENABLED=true needs S3_ACCESS_KEY and S3_SECRET_KEY: they are the SeaweedFS S3 identity, and the store refuses to start without usable ones. Set both in .env.secrets. Each must be nonempty and contain no double quote, backslash or control character.

SSL and Network (E150-E199)

These errors occur during SSL certificate generation or network operations.

Code Exit Summary Why Fix
E150 2 mkcert not installed mkcert is not installed; falling back to OpenSSL self-signed certs. Install mkcert: brew install mkcert (macOS) or see https://github.com/FiloSottile/mkcert
E151 2 SSL certificate generation failed Could not generate SSL certificates for the configured domain. Check domain configuration and ensure openssl is available.

Database, Backup and Recovery (E200-E249)

These errors occur when the CLI interacts with the PostgreSQL container, backups, restores and disaster recovery.

Code Exit Summary Why Fix
E200 2 Database not running PostgreSQL container is not running or not accepting connections. Run 'nself start' to start all services, or 'nself doctor' to diagnose.
E201 2 Migration failed A database migration could not be applied. Check the migration SQL for errors. Run 'nself db migrate --status' to see pending migrations.
E202 2 Backup failed Database backup operation failed. Ensure sufficient disk space and that the database is running.
E203 1 Migration validation failed The migration dry run found an error in the migration SQL before anything was applied. Fix the SQL named in the message and run the migration again. No changes were applied.
E204 2 Migration prerequisite missing An object the migration depends on does not exist in the live schema. Apply the earlier migrations first: nself db migrate. Run nself doctor if the schema looks wrong.
E205 2 Backup not found The requested backup file or backup ID does not exist. List available backups with: nself backup list
E206 2 Backup verification failed The backup failed its integrity check, so it may be corrupt or incomplete. Create a fresh backup: nself backup create. Do not restore from the failed file.
E207 2 Backup restore failed The backup could not be restored into the database. Check that the database is running and has enough disk space, then retry. Run nself doctor for details.
E208 2 Backup encryption failed The backup could not be encrypted. Check the backup encryption key setting and that the key file is readable, then retry.
E209 2 Backup decryption failed The backup could not be decrypted with the configured key. Check that the key matches the one used to create the backup, then retry.
E210 2 Remote backup operation failed Copying a backup to or from the remote destination failed. Check the remote destination settings and network access, then retry.
E211 2 Backup prune failed Old backups could not be removed according to the retention policy. Check file permissions on the backup directory and the remote destination, then retry.
E212 2 WAL archive failed PostgreSQL could not archive a write-ahead log segment. Check free disk space and the archive destination. Run nself doctor for details.
E213 2 Disaster recovery drill failed The disaster recovery drill did not complete successfully. Read the drill report for the failing step, fix it and run the drill again.
E214 2 Standby promotion failed The standby database could not be promoted to primary. Check the standby status and replication lag, then retry the promotion.
E215 2 Disaster recovery rollback failed Rolling back a disaster recovery step failed. Check the current database role on each node before taking any further action.
E216 2 Split-brain fence failed The old primary could not be fenced, so two nodes might accept writes. Stop the old primary by hand before continuing, then retry the fence step.
E217 2 Off-box backup is stale The newest off-box backup heartbeat is older than --max-age, is missing, or reports a failed backup. Check the backup schedule on the production host (nself backup schedule, then its systemd journal) and run nself backup stream once by hand.
E218 2 Restore drill is stale or failed The newest restore drill is older than --max-drill-age, never ran, or its restore did not match the backup. Run nself backup drill --from --identity --heartbeat-to from the owner machine and read the mismatches it lists.
E219 2 Backup heartbeat unreadable The heartbeat object could not be fetched or parsed, so freshness is unknown. Unknown is treated as not OK. Check the heartbeat remote and its credentials (--heartbeat-to or NSELF_BACKUP_HEARTBEAT_REMOTE), then read the object with rclone cat.
E220 2 Restore drill cannot start The drill needs a running Docker daemon, the age binary for encrypted backups, and free disk of twice the download size. Start Docker, install age, or free disk space in the temp directory (TMPDIR), then run the drill again.
E222 2 Backup identity could not be created or read nSelf could not create, secure or read the age identity under ~/.config/nself (missing age-keygen, unwritable directory, a symlink or a file that is not an age identity). An existing identity is never overwritten. Install age, fix the directory permissions (0700), or pass --recipient <age1...> and manage the key yourself.
E223 2 Backup identity missing for decrypt Backups encrypted to an auto-created identity can only be decrypted with that identity file. Without it they are unrecoverable. Restore the identity file from your off-host copy to ~/.config/nself/-age.key, or pass the command's key flag (restore --decrypt-key, restore-remote --key, drill --identity).
E224 2 No backup recipient and automatic key creation is disabled NSELF_BACKUP_NO_AUTO_KEY=1 is set, so nSelf will not create an identity, and no recipient is configured. Backups are never written in the clear by default. Pass --recipient <age1...|ssh-...|github:user>, set BACKUP_AGE_RECIPIENTS, run nself backup init-key, or pass --no-encrypt to write in the clear.

Health (E250-E299)

These errors occur during health checks run by nself doctor, nself health, nself status and startup probes.

Code Exit Summary Why Fix
E250 2 Service unhealthy A service health check returned an unhealthy status. Run 'nself doctor --verbose' for detailed diagnostics.
E251 2 Health check timeout The health check did not complete within the timeout period. The service may be starting slowly. Wait and retry, or check logs with 'nself logs'.
E252 2 Service not found The named service is not part of this project stack. Run nself status to list the services in this project, and check the spelling.

Init and Project (E300-E349)

These errors occur during nself init or when the CLI validates the working directory.

Code Exit Summary Why Fix
E300 1 Project already initialized A .env file already exists in this directory. Use 'nself config set' to modify existing config, or delete .env to reinitialize.
E301 1 Source directory detected You are running nself inside the CLI source repository. Change to your project directory first: cd /path/to/your/project

Domain (E350-E399)

These errors occur when the CLI validates domain names or port numbers from config.

Code Exit Summary Why Fix
E350 1 Invalid domain name The configured domain name is not valid. Use a valid domain like 'example.com' or 'localhost'.
E351 1 Invalid port number Port number is outside the valid range (1-65535). Use a port number between 1024 and 65535 for non-privileged ports.

CLI (E400-E449)

These errors come from the command line itself: usage, JSON support, destructive-action gates and moved commands.

Code Exit Summary Why Fix
E400 classified Unclassified error The command failed with an error that has no specific code. Read the message. If it looks like a bug, report it at https://github.com/nself-org/cli/issues
E401 1 Invalid usage A flag or argument was missing, unknown or had an invalid value. Run the command with --help to see the accepted flags and arguments.
E402 1 JSON output not supported This command or flag combination cannot produce JSON output. Run the command without --json, or use nself help --json to see which commands support it.
E403 4 Destructive action blocked A safety gate refused a destructive action. Read the message for the missing confirmation or flag, check the target environment, then confirm explicitly.
E404 1 Command moved to a plugin This command now lives in a plugin that is not installed. Run the nself add command printed in the message, then run the command again.
E405 1 Plugin command not mounted (name collision) The plugin's commands.command collides with a core command verb, a cobra-native command or alias, or another installed plugin's command, so it was not mounted. Rename commands.command in the plugin's plugin.json to a free name, or remove the other plugin claiming it, then run nself again.
E406 1 Mounted plugin binary missing, not executable or outside the plugins dir The plugin declares a commands block, but its binary was not found in the plugins bin dir, is not executable, or resolves (after symlinks) outside the plugins directory. Reinstall the plugin with nself add ; if it was installed by hand, put an executable nself- binary in ~/.nself/plugins/bin/.
E407 1 Builtin family not mounted This builtin command family is disabled or was removed from the local installation, so its commands are not mounted. Run nself add to restore the builtin family.
E410 1 Command removed in v1.5 This command was removed in nSelf v1.5 and has no replacement. Read the message for what to use instead, or run nself --help to see the current commands.
E420 1 Invalid machine request The request sent over MCP or HTTP does not match the command's parameters. Send only the args, flags and confirm members the command's params schema lists, with the right types.
E421 1 Command not exposed on machine surfaces This command is not served over MCP or HTTP, or the secret values passed to a machine-invoked child are unusable (bad bundle, an unused or reused value); the reason is in the cause. Run the command from a terminal, or call a command that is exposed.
E422 2 Command produced no single JSON document The command ran but its standard output was not exactly one JSON document. Run the same command in a terminal with --json and read its output; report the command if it prints text in JSON mode.
E423 2 Command invocation timed out The command did not finish before the invocation timeout and was stopped. Raise the server invocation timeout, or use a command form that returns sooner.
E424 4 Confirmation does not match The confirm value is not a live server-issued nonce or plan id for this exact request: it was reused, expired, unknown, computed by the client, or issued for a different request. Send the request again without confirm, read the confirmation it returns, and repeat the identical request with that confirm value.
E425 1 Consent or plan-id flag set by the caller Consent flags (such as --yes or --force) and plan-id flags belong to the invoker; a machine request cannot set them. Remove the flag from the request and use the confirmation round trip: the server adds it once you confirm.
E426 3 Machine token missing, invalid or insecure The machine surface needs a bearer token it can trust: the token file is unreadable or readable by others, or a non-loopback bind lacks --allowed-host and a configured token. Set NSELF_MCP_TOKEN or keep ~/.nself/mcp-token at mode 0600; for a non-loopback --host also pass --allowed-host .
E428 1 Host not allowed The request Host is outside the server's allowed hosts and port. Use the configured listener host or pass --allowed-host explicitly.
E429 1 Origin not allowed The request Origin is outside the server's allowed HTTP origins. Use an allowed HTTP origin on the listener port.
E430 1 Malformed HTTP request The method, JSON body, content type, body size or Accept header is invalid. POST a JSON machine request no larger than 1 MiB and accept application/json or application/x-ndjson.
E431 2 Server saturated All machine invocation slots are in use. Retry after one second.
E432 1 No such route The registry has no command at this route. Read /openapi.json and use a documented command route.
E433 1 Legacy MCP tool removed in v1.5 This MCP tool ran raw SQL outside the migration ledger, and v1.5 no longer serves it. Write the change as a migration with 'nself db migrate create', then apply it with 'nself db migrate up'.
E434 1 Unknown configuration key or unbound flag nself config explain was given a key that is not a known configuration key, or a command flag that supplies no configuration key. Run 'nself config list' for the known keys, or 'nself help --json' and read each flag's env field for the flags that supply one.
E435 1 nself.yaml has a type or syntax error nself.yaml cannot be read as YAML, or a key holds a value of the wrong type (for example plugins as a number, or a plugin entry that is a map instead of a name). Fix the value at the reported line so it matches schemas/nself-yaml.v1.schema.json (see the nself.yaml wiki page).
E436 1 Unknown key in nself.yaml nself.yaml has a key that nself does not read. Silent keys hide typos and drift. Rename the key to x- if it is app metadata, or remove it. nself reads app, bundle, bundles and plugins only.
E437 1 Plugin registry surface declaration invalid A mounted plugin declares invalid confirmation or surface fields. Fix the plugin manifest confirm flags and surface declaration, then reinstall it.

Reconcile and locks (E450-E479)

Change-plan (E450) and operation-lock (E460) codes. The other codes in this block are documented here when their Tickets register them.

Code Exit Summary Why Fix
E450 1 Plan id does not match The plan you confirmed no longer matches what this command would change, because an input changed or the plan id is not one this project produces. Re-run nself build --plan and pass the new plan_id.
E451 1 Plan id cannot bind generated secrets This build generates secrets, and random values cannot be reproduced from a plan id. Set the secrets in .env.secrets first, or run nself build and confirm at the prompt (or with --yes, without --plan-id).
E452 1 Planned files were not written After the build, a file the confirmed plan listed is missing, has other content, or has another mode. Re-run nself build --plan to see what differs, then run nself build again; check that the project is writable.
E453 1 Plan id cannot bind plugin changes The plan installs or removes plugins, and what those change is only known after they run, so a plan id cannot describe the final render. Run nself build --yes without --plan-id (the render after the plugin changes is printed and held), or install or remove the plugins first.
E454 1 Plan id cannot bind certificate or trust effects Certificate bytes are generated at runtime and host trust state can change independently; artifact byte confirmation excludes these effects. Run nself build and confirm at the prompt (or with --yes, without --plan-id), or provision certificates and host trust first.
E455 1 Stack does not match nself.lock.yaml nself start --frozen found a service image, an installed plugin version or checksum, or the CLI minor that differs from the project lock, or the project has no lock. Run nself build to regenerate the stack from the lock, or accept the change by running nself build --write-lock and committing the new nself.lock.yaml.
E456 1 Update source unavailable nself update --plan or --yes could not get an answer from the CLI release lookup or the plugin registry, so it cannot build a plan. Retry in a few minutes. Nothing was changed.
E457 1 Update source rate limited The CLI release lookup or the plugin registry answered nself update --plan or --yes with HTTP 429. Retry in a few minutes. Nothing was changed.
E460 1 Project operation lock held Another nself command is changing this project and holds its operation lock. Wait for the running nself command to finish, or stop it, then run this command again.
E465 1 Image unavailable The locked image could not be pulled from its upstream or digest-identical mirror. Run nself doctor images, then check registry access and the locked digest.
E470 2 ACME issuance failed The ACME client could not obtain a certificate from the certificate authority. Check that the names resolve to this server and that port 80 or the DNS credential is reachable, then run the command that failed again. A certificate that is already managed can be tested with nself config trust ssl renew --dry-run.
E471 2 Certificate install or verification failed The new certificate was issued but could not be installed, or nginx did not serve it after the reload. The error text says whether the previous certificate was restored. Run nginx -t in the nginx container, fix the reported error, then run the command that failed again (nself config trust ssl renew --force for a certificate that is already managed).
E472 1 DNS credential missing A DNS-01 certificate needs the DNS provider credential, and it is not in the secret store. Store the credential with nself config secrets set , then run the command again.

Deploy (E480-E499)

These errors come from nself deploy and related commands. Only the codes registered so far are listed.

Code Exit Summary Why Fix
E480 1 Proxy provider plugin missing The selected proxy provider plugin is not installed. Install the selected proxy provider plugin and retry the build.
E481 1 Route not expressible by provider The selected proxy cannot represent one of the project's routes. Use nginx or simplify the route before selecting this provider.
E482 1 Proxy provider refused in fronted mode A fronted project does not own the serving proxy. Change the proxy provider in the fronting project.
E483 1 Unknown deploy environment The environment you named is not in the deploy inventory (.nself/control-plane.yaml or NSELF_DEPLOY_HOST_), so nothing was deployed. A deploy never falls back to another environment. Run nself deploy environments to list the known environments, then re-run with one of them, or add the environment with nself env target add.
E484 1 Invalid deploy host The host does not match the deploy host grammar. Use [user@]host[:port] and set remote_path separately.
E485 1 Invalid deploy inventory The control-plane inventory violates a required field or invariant. Correct the named field in .nself/control-plane.yaml.
E486 1 No deploy target matched The selector matched no server. Run nself deploy targets to list available targets.
E487 1 Deploy host key is unknown A secret-bearing operation requires a trusted host key. Verify the fingerprint and enrol it with nself env target add --trust-host-key.
E488 2 Promote rolled back A promotion step failed after the verified snapshot, so the target was restored. Fix the named failing step and retry the promotion.
E489 2 Promote rollback failed Recovery failed, or a healthy promotion could not save its final record; the message identifies the target state. Read the snapshot, backup and tar evidence in the message. If manual rollback is required, restore the saved artifacts, then on the target run nself backup restore --yes and nself doctor.
E490 1 Release drift Source and target per-platform image identities differ or cannot be verified. Rebuild the release so every service resolves to the source manifest digest, then retry.
E491 1 Deploy image architecture unavailable At least one image has no proven manifest for a target host architecture. Publish the missing platform or use a compatible image, then rebuild and retry.
E492 1 Release manifest invalid The release manifest is missing, malformed, or from a schema major this nself does not read. Rebuild the release with a matching nself ci, then run the promotion with --release .
E493 3 Release signature or key rejected The release manifest is not a ci-release DSSE envelope signed by a key this project trusts (wrong payload type, unknown key id, key of another purpose, bad signature, or unreadable trust files). Add the coordinator's public key to .nself/trust/ci-release.keys on the default branch (or ~/.nself/ci/trust/ci-release.keys), then retry.
E494 3 Release signing key revoked The key that signed the release manifest is listed in ci-release.revoked. Re-sign the release with a current coordinator key; never remove a revocation to proceed.
E495 1 Image digest not in release manifest A per-platform image digest the promotion would deploy is not listed in the signed release manifest. Promote only images the release produced, or build a new release that lists them.
E496 1 Release revision mismatch The revision in the release manifest differs from the revision in the evidence beside it. Use the manifest and evidence of one release run; do not mix directories.
E497 1 Release evidence not acceptable The ci plugin reports the evidence is not current, bound, passing and release-class at the manifest revision, or could not judge it. Run nself ci evidence verify --file /evidence.json --at-revision and fix what it reports.
E498 1 Release quarantined The ci plugin reports the release evidence as quarantined. Wait for the release to be cleared by the coordinator, or promote a different release.
E499 1 Verified release required This target requires a verified release, but --release was not given or the ci plugin is not installed. Install the ci plugin (nself add ci) and pass --release to deploy promote.

Adopt (E500-E529)

These errors come from adopting an existing stack: custom services that name dependencies, networks, build contexts and host binds. Only the codes registered so far are listed.

Code Exit Summary Why Fix
E500 1 Custom service dependency is not valid CS_N_DEPENDS_ON names a service that does not exist in this project, uses a condition other than started, healthy or completed, or forms a dependency cycle. Use name[:started|healthy|completed], comma-separated, name a core service, another custom service or a service from an installed plugin, and remove circular dependencies.
E501 1 Custom service network is not allowed CS_N_NETWORKS names a network that does not start with <PROJECT_NAME>_. A custom service never joins another project's network. Rename the network to <PROJECT_NAME>_ (lowercase letters, digits, - and _), or remove it from CS_N_NETWORKS.
E502 1 Custom service host bind is not allowed CS_N_VOLUMES binds a writable absolute host path outside the project, or the Docker socket, or the host root. These give the container control of the host. Use a named volume or a project-relative path, mount an outside path read-only (:ro), and never mount /var/run/docker.sock or /.
E503 1 Shared proxy: name or certificate already served by another project A server name or certificate directory this project would put on the shared host proxy is already served by the proxy's owner or by another registered project, or the owner's ssl/ directory cannot be written safely (a symlink, or no permission). Give this project its own domain or certificate directory, or remove the other project's registration with nself uninstall in its directory. Never replace a symlink in the owner's ssl/ by hand.
E504 1 Shared proxy: upstream host is ambiguous across projects A route upstream host that this build leaves as written is the name of a service, or a verbatim upstream host, of the proxy's owner or of another registered project. On one shared nginx that name could reach the wrong project. Point the route at a container name (<PROJECT_NAME>_<service>) or at a host name that is not a service of another project.
E505 1 NGINX_MODE is not valid here NGINX_MODE is set to a value other than shared, or NGINX_MODE=shared is combined with NGINX_FRONTED_BY, or the project's proxy provider is not nginx. Set NGINX_MODE=shared only on the project that owns the host nginx, with no NGINX_FRONTED_BY and nginx as the proxy provider, or unset NGINX_MODE.
E506 1 Shared proxy: attaching the owner's nginx failed The owner's nginx could not be connected to this project's network, nginx -t rejected the combined configuration, or the reload failed. The owner keeps serving its previous configuration and the network is disconnected again. When the test named a project's files, those files were moved to nginx/shared/quarantine// in the owner's directory. Read the nginx error above, fix the named conf in the project that owns it, and run nself build && nself start there again; a successful start restores quarantined files. If the owner's nginx container is not running, start the owner first.
E507 1 Required Postgres extension unavailable The plugin declares requires.postgres_extensions and the project's Postgres (the running cluster, or the configured image when it is stopped) does not provide one of them. Use a Postgres image that ships the extension; for vector run nself db image switch --to pgvector.
E508 1 Postgres extension availability unknown for a custom image (warning) The postgres image is neither postgres:* nor pgvector/pgvector:* and the database is not running, so nself cannot tell which extensions it ships. Start the stack so the cluster can be checked, or use an image that ships the extension. The install continues.
E509 1 Image switch preflight failed The switch cannot start safely: postgres is not running, the target is not a known pgvector image of the same major version, the disk is too small, or the cluster has a feature the switch cannot move. Fix the item named above and run nself db image switch --to pgvector --plan again. Nothing was changed.
E510 1 Image switch verification mismatch The restored copy differs from the original (rows, schema, sequences, roles, grants), or the original changed after it was dumped. Nothing was switched. Check that nothing else writes to the database while the switch runs, then run the switch again. The old volume was not touched.
E511 1 Image switch restore failed Restoring the dump into the new volume failed (for example an extension the old database uses is not in the pgvector image). Nothing was switched and the new volume was removed. Read the error above, fix the cause in the old database, and run the switch again. The old volume was not touched.
E512 1 Image switch incomplete A postgres image switch started in this project and has not finished, so commands that change the project are blocked. Run nself db image switch --to pgvector --resume to finish it, or nself db image switch --rollback to go back to the old volume.
E513 1 Vector search cannot be generated or tracked The column is not a vector(n) column, the table is not tracked in the project's on-disk Hasura metadata, no on-disk metadata exists, or the search function is missing from Postgres when tracking it. Point at a vector(n) column of a tracked table (nself db hasura metadata export writes the on-disk metadata), and run nself db migrate up --migration-dir migrations before --track.
E514 1 Role cannot use the vector search function A role named in --roles has no select permission on the searched table, or a role with a select permission hides the vector column or does not expose the table's select at the root (query_root_fields or subscription_root_fields without select, the relationship-only pattern). The function orders by that column and Hasura exposes it to every select role, so such a role could learn hidden data or read every row. Give the role a select permission on the table, pass only roles that have one (--roles), and give every select role the vector column and a root select (or remove that role's permission).
E515 1 Unknown portable bundle format or major version The bundle manifest is not a version 1 nself portable export, so this nself cannot read it safely. Re-export the bundle with a matching nself release, or upgrade nself if the bundle comes from a newer one.
E516 1 Portable bundle failed its integrity check A bundle file is missing, changed, truncated, unlisted or has an unsafe name, so the bundle cannot be trusted. Export the bundle again from the source and keep it unmodified, then re-run the command.
E517 1 Import source unreachable Import source unreachable. Check the source environment variable and connectivity.
E518 1 Unsupported source Postgres major Unsupported source Postgres major. Use POSTGRES_VERSION matching the source, Postgres 12 or later.
E519 1 Import target schema is not empty Import target schema is not empty. Import into a fresh started project; existing user tables are never overwritten.
E520 1 Import extraction failed Import extraction failed. Check source access and repeat the export.
E521 1 Import load failed Import load failed. Read report.json under .nself/import, then reset the target with nself db reset --yes, nself stop and nself start, and import again.
E522 1 Import verification could not run Import verification could not run. Check target service health and read access; the load is complete, so reset with nself db reset --yes only to import again.
E523 1 Import verification found mismatches Import verification found mismatches. Read report.json under .nself/import and resolve every non-exempt mismatch; to import again reset with nself db reset --yes, nself stop and nself start.
E524 1 Import source not registered Import source not registered. Use a registered db import source.
E525 1 Not enough free disk for export Available disk is below the export estimate. Free disk space or choose another --out directory.
E526 1 Secret found in export A resolved secret occurs in exported text or SQL. The bundle was removed. Remove the secret from the source data before exporting again.
E527 1 Export output is not empty The output exists and is not an empty directory. Choose a new or empty --out directory.
E528 1 Custom service build context is not allowed CS_N_PATH reaches above the repository root, or an ancestor build context has no ignore file that excludes */.env and */.secrets (a bare .env matches only the context root). The whole directory is sent to the image builder. Point CS_N_PATH at the project or at an ancestor no higher than the directory that holds .git, and add */.env and **/.secrets to that directory's .dockerignore.
E529 1 Import requires an object store Import requires an object store. Enable object storage or explicitly use --skip-storage.

See Config-Custom-Services for the keys and Import-Export-Format for the bundle codes.


Secret (E540-E549)

These errors come from resolving secrets for a service.

Code Exit Summary Why Fix
E540 1 Invalid secret reference The reference, environment name or store name is invalid, or references collide on a NAME. Use project/NAME, team/NAME, release/NAME, environment//NAME or deploy//NAME with distinct uppercase names and no reserved environments.
E541 1 Secret reference not found The encrypted file or requested key does not exist. Create the secret with config secrets set in the mapped store using the operator identity.
E542 1 Secret resolution requires FIFO stdout Stdout is not a named or anonymous pipe. Pipe config secrets resolve --json to the secret consumer; do not redirect to a file.
E543 1 Age identity unreadable or decryption failed The identity cannot be read, cannot decrypt this store, or the decrypted store is invalid. Check SECRETS_AGE_KEY_PATH and have the operator grant this identity access to the required file.
E544 1 Secret class or recipient change not permitted Only the store owner may change recipients, the owner cannot be removed, and release or deploy changes require explicit release-class consent. Run recipient changes with the store owner identity, preserve its recipient, and use --allow-release-class only for an eligible dedicated trusted node. Use secrets rekey for owner changes.

JSON error object

With --json (v1.5 mode), a failure writes exactly one error envelope to stdout and the human block above still goes to stderr:

{
  "schema_version": "1",
  "command": "start",
  "error": {
    "code": "E002",
    "message": "docker info failed: docker daemon is not running",
    "cause": "The Docker daemon is not responding to commands.",
    "remediation": "Start Docker Desktop or run: sudo systemctl start docker",
    "docs_url": "https://nself.org/docs/reference/error-codes#e002",
    "exit_code": 2,
    "class": "infra"
  }
}
Field Rule
code ^E[0-9]{3}$. The error's own code; else the code of the matching known failure (when several match, the highest class wins: auth, then destructive, then infra, then user); else E400.
message What happened.
cause Omitted when empty. The Why line.
remediation Omitted when empty. The Fix line.
docs_url Omitted when empty. The Docs line.
exit_code The process exit status.
class user (1), infra (2), auth (3), destructive_blocked (4), other (any other status).

command is the command path without nself ("" when the failure came before a command was resolved). Message, cause and remediation are redacted: URL credentials, tokens, e-mail addresses and IPs are masked, and raw arguments are never included. The schema is schemas/error.v1.schema.json.



Code allocation

Codes are grouped in blocks. A block has exactly one category, so the category of a code follows from its number. A new block or range needs an entry in the plan first; the registry (internal/errs) rejects a code outside its owner's range, a mismatched category, and any code in the reserved range.

Block Category Use
E001-E049 docker Docker and Compose
E050-E099 config Configuration and secrets
E100-E149 plugin Plugins, licenses, entitlements
E150-E199 ssl Certificates
E200-E249 database Database, migrations, backups, recovery
E250-E299 health Service health
E300-E349 init Project setup
E350-E399 domain Domains and ports
E400-E449 cli Usage, JSON output, command moves
E450-E479 reconcile Reconcile, locks, ACME
E480-E499 deploy Deploy and release verification
E500-E529 adopt Adopting existing stacks
E540-E549 secret Secret resolution
E600-E719 reserved The ci plugin's own registry; never allocated in the CLI
E720-E739 reserved The k8s plugin's own registry; never allocated in the CLI. See cmd-k8s.

Codes are never reused or renumbered. Several blocks have no registered codes yet; a block appears in the tables above once it has one.



Error codes in scripts

If you are scripting around the CLI, branch on the exit status (see Exit-Codes) and parse the bracketed code from stderr, or use --json and read error.code from stdout:

output=$(nself start 2>&1)
if [ $? -ne 0 ]; then
  code=$(printf '%s' "$output" | grep -oE '\[E[0-9]+\]' | head -1)
  printf 'nself failed with %s\n' "$code"
fi


Related pages

← Home | _Sidebar

Home


Getting Started


Commands


Features


Configuration


Plugins (87 + 10 monitoring)

Free (25)
Pro (62)
Planned (26)
  • plugin-audit
  • plugin-blog
  • plugin-checkout
  • plugin-commerce
  • plugin-drm
  • plugin-export
  • plugin-flow
  • plugin-import
  • plugin-ldap
  • plugin-mailgun
  • plugin-media
  • plugin-oauth-providers
  • plugin-pages
  • plugin-postmark
  • plugin-rate-limit
  • plugin-reports
  • plugin-saml
  • plugin-scheduler
  • plugin-sendgrid
  • plugin-sso
  • plugin-subscription
  • plugin-thumb
  • plugin-transcoder
  • plugin-twilio
  • plugin-waf
  • plugin-watermark

Guides


Architecture


Reference


Machine interface


Licensing


Security


Brand


Operations


Contributing


Admin


Changelog


All commands (21)

Clone this wiki locally