# Error codes

> Every error code the daemon and the SDK return, with its message, generated from the product's translations.

Source: https://pithyx.org/docs/reference/errors/
Markdown: https://pithyx.org/docs/reference/errors.md

The API returns errors as RFC 9457 problem details with a stable `code`, `params`, an English `detail` and the `requestId`. Codes starting with `sdk.` come from the SDK's transport in the browser, not from the daemon. This list is generated from `i18n/en/errors.json`; `{name}` marks a parameter.

## app

- `app.app.busy`: The app {id} is being installed, updated or removed. Wait until that is done.
- `app.app.no_previous`: {id} has no version before its last update to go back to.
- `app.app.not_found`: No app with the id {id} is installed.
- `app.backend.endpoint_unknown`: The app has no backend endpoint named {endpoint}.
- `app.backend.missing`: The app has no backend.
- `app.backend.start_failed`: The app's backend did not start. The app's log shows what its containers wrote.
- `app.backend.storage_unavailable`: The app's backend needs the folder for {storage}, which is not ready ({reason, select, unmapped {no folder is assigned} other {its pool is missing or locked}}).
- `app.backend.unavailable`: The app's backend is not running or does not answer. Try again in a moment.
- `app.backend.unsupported`: This error came from versions of Pithyx before 1.0, which installed apps without a backend only. This version runs app backends; update the box if you still see it.
- `app.compose.key_unsupported`: The app's Compose file uses {key} at {path}, which Pithyx does not allow.
- `app.compose.reference_unknown`: The app's backend refers to {name} at {path}, which is not declared.
- `app.compose.right_missing`: The app's Compose file needs the right {right} at {path}, which its manifest does not declare.
- `app.compose.right_unused`: The app's manifest declares the right {right} at {path}, which its Compose file does not use.
- `app.compose.storage_mismatch`: The storage {storage} does not match the Compose file at {path}: {reason, select, not_mounted {the service does not mount it} not_listed {the service mounts it without being listed in the manifest} read_only {it is read-only and must be mounted with :ro} other {the manifest and the Compose file disagree}}.
- `app.compose.value_invalid`: The app's Compose file has a value Pithyx refuses at {path}: {reason, select, required {it is missing} type {it has the wrong type} format {its format is not valid} range {it is out of range} unpinned {the image is not pinned with @sha256} interpolation {it uses $ for a variable (write $$ for a dollar sign)} no_value {the variable has no value} duplicate {it appears twice} reserved {it is reserved for Pithyx} host_path {it mounts a folder of the host} anonymous {the volume has no name} cycle {the services depend on each other in a circle} image_and_build {the service has both image and build, use one of them} other {it is not valid}}.
- `app.compose.yaml_invalid`: The app's Compose file cannot be read: {reason, select, too_large {it is larger than 64 KB} not_utf8 {it is not UTF-8} character {it contains a tab or another character that is not allowed} syntax {it is not valid YAML} documents {it must contain exactly one document} too_deep {it is nested too deeply} directive {it contains a YAML directive} anchor {it uses anchors or aliases} tag {it uses YAML tags} duplicate_key {{path} appears twice} merge_key {it uses a merge key at {path}} key_not_string {a key at {path} is not text} other {it breaks a rule for Compose files}}.
- `app.docker.unavailable`: The container service does not answer, so app backends cannot run right now.
- `app.elevated.unsupported`: The app asks for the right {right}, which this version of Pithyx does not grant.
- `app.icon.invalid`: The app's icon cannot be used: {reason, select, too_large {it is larger than 64 KB} malformed {it is not a valid SVG file} not_svg {it is not an SVG image} viewbox {its viewBox is missing or not square} doctype {it contains a DOCTYPE} processing_instruction {it contains a processing instruction} element_forbidden {it contains the element {element}} event_attribute {it contains the event attribute {attribute}} external_href {it links to something outside the file} style_import {its styles use @import} style_url {it loads something outside the file with url()} style_escape {its styles contain escapes} other {it breaks a rule for icons}}.
- `app.image.mismatch`: The image {image} is not the one the app's package names. Pithyx does not run it.
- `app.image.unavailable`: The image {image} of the app's backend could not be loaded or downloaded.
- `app.manifest.cron_invalid`: The schedule at {path} is not a valid cron expression: {cron}
- `app.manifest.duplicate`: The manifest has {value} twice (at {path}).
- `app.manifest.id_invalid`: The app id {id} is not valid. It is the author's domain reversed plus the app name, for example com.example.chat.
- `app.manifest.id_reserved`: The app id {id} is reserved for the apps that come with Pithyx.
- `app.manifest.invalid_json`: The app's manifest (pithyx.json) is not valid JSON.
- `app.manifest.pithyx_invalid`: The Pithyx version range {pithyx} in the manifest is not valid.
- `app.manifest.reference_unknown`: The manifest refers to {name} at {path}, which it does not declare.
- `app.manifest.schema_violation`: The app's manifest is not valid at {path} ({keyword}).
- `app.manifest.sdk_invalid`: The SDK version range {sdk} in the manifest is not valid.
- `app.manifest.version_unsupported`: This app needs a newer version of Pithyx (manifest version {version}, this box reads version {supported}).
- `app.manifest.window_size_invalid`: The app's smallest window size is larger than its default size.
- `app.mapping.invalid`: The folder cannot be used for the storage {storage}: {reason, select, unknown {the app does not ask for this storage} access {the app asks to read it only, so it cannot get read and write access} other {the request is not valid}}.
- `app.package.box_too_old`: This version needs Pithyx {range}; this box runs {version}. Update Pithyx first.
- `app.package.downgrade_unsupported`: This older version cannot read the app's data (data version {installed} installed, {target} in this version). Use "Back to the previous version" after an update instead.
- `app.package.invalid`: The file is not a valid app package: {reason, select, gzip {it is not gzip-compressed or it is damaged} format {it is not a tar archive this box reads} checksum {a header is damaged} truncated {it ends too early} trailing_data {there is data after its end} entry_type {{path} is a link or a special file} extended_header {it has an extended header that is not allowed} name_mismatch {the long name of {path} does not match its own name} other {it cannot be read}}.
- `app.package.layout_invalid`: The app package is not valid: {reason, select, missing {{path} is missing} unsafe {the path {path} is not allowed} duplicate {{path} is in it twice} unexpected {{path} does not belong in an app package} reserved {{path} uses a name reserved for the backend} other {{path} is not allowed}}.
- `app.package.lock_invalid`: The app's list of backend images does not fit ({reason, select, missing {it is missing} invalid {it is not valid} stale {it does not match the backend} other {nothing for {architecture}}}).
- `app.package.not_found`: The checked package is no longer there. Upload the file again.
- `app.package.too_large`: The app package is too large: {reason, select, size {the file may have at most {limit} MB} unpacked {its files may have at most {limit} MB together} files {it may have at most {limit} files} manifest {pithyx.json may have at most {limit} KB} other {it exceeds a limit}}.
- `app.permission.denied`: The app is not allowed to do this ({permission}).
- `app.permission.not_requested`: The app does not ask for the permission {permission}.
- `app.pool.fixed`: Apps live on the pool {pool}. They cannot move to another pool while an app is installed.
- `app.pool.required`: Choose a pool for the app data.
- `app.pool.unavailable`: The pool {pool} cannot hold apps now: {reason, select, missing {it is not imported} offline {it is not online} read_only {it is read-only} locked {it is locked} not_prepared {it was not set up by Pithyx} other {it is not available}}.
- `app.storage.key_invalid`: The app used a key that is empty or longer than {maxLength} characters.
- `app.storage.not_found`: The app's storage {storage} does not exist or no folder is assigned to it yet.
- `app.storage.too_large`: The app tried to store more than it may keep. The limit is {maxKb} KB.
- `app.token.invalid`: The app's access expired. Close the app and open it again.

## auth

- `auth.account.disabled`: This account is deactivated. Ask an administrator to activate it again.
- `auth.challenge.expired`: The sign-in step has expired. Please sign in again.
- `auth.credentials.invalid`: The user name or password is incorrect.
- `auth.csrf.header_missing`: The request was rejected because a security header is missing.
- `auth.desktop.not_allowed`: You may not sign in to the desktop. Ask an administrator for the desktop sign-in right.
- `auth.display_name.invalid`: The display name can have at most {maxLength} characters and no control characters.
- `auth.password.too_common`: This password is too well known. Choose one that is harder to guess.
- `auth.password.too_long`: The password can have at most {maxLength} characters.
- `auth.password.too_short`: The password needs at least {minLength} characters.
- `auth.permission.denied`: You do not have permission for this action.
- `auth.rate.limited`: Too many attempts. Try again in {retryAfterSeconds, plural, one {# second} other {# seconds}}.
- `auth.recovery.invalid`: The user name or recovery key is incorrect.
- `auth.session.expired`: The session has expired. Please sign in again.
- `auth.setup.already_done`: This system has already been set up.
- `auth.totp.already_enabled`: Two-factor authentication is already enabled.
- `auth.totp.invalid`: The code is incorrect or has already been used.
- `auth.totp.not_enrolled`: Two-factor authentication has not been set up yet.
- `auth.username.invalid`: User names start with a lowercase letter or an underscore and contain only lowercase letters, digits, underscores and hyphens, at most 32 characters.
- `auth.username.reserved`: The user name {username} is reserved for the system.

## desktop

- `desktop.device.not_found`: No saved desktop was found for that device. It may have expired.
- `desktop.item.conflict`: This desktop item was changed on another device in the meantime.
- `desktop.item.invalid`: The desktop item could not be saved because it is not in a known format.
- `desktop.item.limit_reached`: The desktop is full. It holds at most {max} items.
- `desktop.item.not_found`: This desktop item no longer exists. It may have been deleted on another device.
- `desktop.layout.conflict`: The desktop layout was saved from another tab in the meantime.
- `desktop.layout.invalid`: The desktop layout could not be saved because it is not in a known format.
- `desktop.layout.too_large`: The desktop layout is too large to save. At most {maxWindows} windows and {maxAppDataKb} KB of app data are kept.
- `desktop.note.too_long`: The note is too long. A note holds at most {maxLength} characters.

## fileservices

- `fileservices.service.unavailable`: {service, select, smb {SMB} sftp {SFTP} other {This service}} cannot be switched on: its program is not installed on this system.
- `fileservices.workgroup.invalid`: Enter a workgroup of 1 to {max} letters, digits, dots, dashes or underscores, starting with a letter or digit.

## fs

- `fs.cursor.invalid`: The list position is no longer valid. Load the folder again.
- `fs.entry.access_denied`: The system does not allow access to this item.
- `fs.entry.exists`: “{name}” already exists here.
- `fs.entry.is_folder`: This is a folder, not a file.
- `fs.entry.not_folder`: This is a file, not a folder.
- `fs.entry.not_found`: The file or folder was not found. It may have been moved or deleted.
- `fs.folder.not_empty`: The folder is not empty.
- `fs.io.failed`: The file system reported an error (errno {errno}).
- `fs.name.invalid`: This name cannot be used. Names must not be empty, contain a slash, or be longer than 255 bytes.
- `fs.operation.into_itself`: A folder cannot be copied or moved into itself.
- `fs.operation.invalid`: This file operation is not valid.
- `fs.path.invalid`: This path is not valid. Paths are relative to the share, without “.” or “..”, and at most {maxBytes} bytes long.
- `fs.range.not_satisfiable`: The requested part of the file does not exist.
- `fs.share.data_choice_required`: Choose what happens with the data: keep it, or delete it for good.
- `fs.share.dataset_name_invalid`: No dataset name can be made from “{name}”. Use at least one letter from a to z or a digit.
- `fs.share.description_invalid`: The description can have at most {max} characters and no line breaks.
- `fs.share.exists`: A share with this name already exists.
- `fs.share.folder_dev_only`: Existing folders can only be registered as shares on a development machine. Create a shared folder instead; it gets its own dataset.
- `fs.share.invalid`: The share could not be created. It needs a name and an existing folder outside the system directories.
- `fs.share.name_mismatch`: The typed name does not match. Type {name} exactly.
- `fs.share.name_reserved`: The name {name} is used by Pithyx itself. Choose another name.
- `fs.share.no_dataset`: This shared folder is a plain folder, not a dataset. Its files can only be kept.
- `fs.share.not_found`: The share was not found, or you have no access to it.
- `fs.share.path_taken`: Something else is already mounted at {path}. Choose another name.
- `fs.share.pool_not_prepared`: The pool {pool} has no place for shared folders (pithyx/shares), so none can be created on it.
- `fs.share.read_only`: You can only read in this share.
- `fs.share.unavailable`: {name} cannot be opened right now: {reason, select, pool_missing {its pool is not connected} pool_unavailable {its pool stopped because disks are missing} other {its folder is not mounted}}. It comes back on its own once its disks are back.
- `fs.thumbnail.not_found`: There is no preview of this file yet.
- `fs.thumbnail.too_many`: Ask for at most {max} previews at once.
- `fs.trash.retention_invalid`: The recycle bin keeps items between 0 and {max} days (0 keeps them until it is emptied).
- `fs.upload.incomplete`: The upload was interrupted. Nothing was saved.
- `fs.version.not_found`: This version is no longer there. The snapshot may have been deleted; reload the list.
- `fs.volume.full`: There is not enough free space.
- `fs.volume.read_only`: The storage is read-only.

## homes

- `homes.choice.invalid`: Choose what happens to the home folder: a shared folder to move its files into, or type the user name to delete it.
- `homes.home.in_use`: This home folder still belongs to a user. Only the home folder of a deleted user can be deleted or moved on its own, and a user's home folder only while its pool is gone.
- `homes.home.name_mismatch`: Type {name} exactly to confirm.
- `homes.home.not_found`: This home folder does not exist (anymore).
- `homes.move.running`: The home folders are moving to another pool already. Wait until the move has finished.
- `homes.pool.no_space`: The pool has too little free space for the home folders: {neededBytes, number} bytes are needed, {availableBytes, number} are free.
- `homes.pool.taken`: The target pool has a home folder named {folder} already.
- `homes.pool.unavailable`: The pool {pool} cannot hold home folders now: {reason, select, missing {it is not imported} offline {it is not online} read_only {it is read-only} locked {it is locked} not_prepared {it was not set up by Pithyx} not_mounted {its home folders are not mounted} other {it is not available}}.
- `homes.pool.unchanged`: The home folders are on this pool already.
- `homes.quota.invalid`: A quota is at least 1 MiB, or no limit.

## installer

- `installer.check.failed`: This computer does not meet a requirement of Pithyx. The first page of the installer shows which.
- `installer.claim.required`: Another browser owns this installation. To start over, restart the computer from the USB stick.
- `installer.claim.taken`: This installation is already in use in another browser. To start over, restart the computer from the USB stick.
- `installer.disk.count`: Choose one disk, or two different disks for a mirror.
- `installer.disk.unsuitable`: Pithyx cannot be installed on this disk. Choose another one.
- `installer.erase.not_confirmed`: Confirm that all data on the chosen disks will be erased.
- `installer.hostname.invalid`: Use lowercase letters, digits and hyphens for the name, at most 63 characters, not starting or ending with a hyphen.
- `installer.install.failed`: The installation failed. Nothing was installed completely; you can try again. The log of the installer has the details.
- `installer.install.running`: The installation is already running or finished.
- `installer.keyboard.invalid`: Choose a keyboard layout from the list.
- `installer.reboot.not_ready`: The computer can only restart once the installation is finished.

## jobs

- `jobs.job.not_found`: This job does not exist or has already been removed.

## logs

- `logs.app.invalid`: The app id {app} is not valid.
- `logs.archive.pool_unavailable`: The pool {pool} cannot hold the log archive now. It may be missing, locked or read-only.
- `logs.batch.too_large`: An app can send at most {max} log entries at once.
- `logs.query.invalid`: The log filter is not valid. Check the time range.
- `logs.settings.invalid`: {field} must be between {min} and {max}.

## network

- `network.address.invalid`: The {field, select, ipv6Address {IPv6} other {IPv4}} address of {name} is not valid. Enter it with its prefix length, for example {field, select, ipv6Address {2001:db8::10/64} other {192.168.1.10/24}}.
- `network.apply.failed`: The network change could not be applied ({command} failed) and was rolled back. The Log Center has the details.
- `network.bond.member_invalid`: {member} cannot join the bond {name}: {reason, select, not_card {it is not a network card} configured {it has settings of its own; remove them first} other_bond {it is in another bond} vlan_parent {it carries a VLAN} other {it is not available}}.
- `network.bond.members_missing`: The bond {name} needs at least one network card.
- `network.bond.primary_invalid`: The primary card of the bond {name} must be one of its cards.
- `network.change.empty`: These are the settings the box has already.
- `network.change.not_found`: This change no longer waits for a confirmation: it was kept, undone or rolled back.
- `network.change.pending`: Another network change waits for its confirmation. Keep or undo it first.
- `network.config.unreachable`: After this change no interface would have an address, so nobody could reach the box.
- `network.default_interface.invalid`: {name} cannot carry the default route: it needs its own settings, must be on and must get a gateway.
- `network.dns.invalid`: “{server}” is not an IPv4 or IPv6 address.
- `network.dns.too_many`: Enter at most {max} name servers.
- `network.firewall.failed`: The firewall rules could not be applied. The setting is saved; the Log Center has the details.
- `network.gateway.invalid`: The {field, select, ipv6Gateway {IPv6} other {IPv4}} gateway of {name} must be an address in its network.
- `network.global.not_changeable`: Pithyx does not change the host name, name servers or default route of a development machine.
- `network.host_name.invalid`: A host name has 1 to 63 letters, digits and hyphens and does not start or end with a hyphen.
- `network.interface.duplicate`: The name {name} is already taken.
- `network.interface.kind_invalid`: The settings do not fit {name}.
- `network.interface.name_invalid`: “{name}” cannot be the name of a bond or VLAN: use 1 to 15 lower-case letters, digits, dots, hyphens or underscores, starting with a letter.
- `network.interface.not_changeable`: Pithyx may not change {name} on this machine.
- `network.interface.unknown`: This box has no network card {name}.
- `network.mtu.invalid`: The MTU of {name} must be between {min} and {max} bytes.
- `network.search_domain.invalid`: “{domain}” is not a valid domain name.
- `network.search_domain.too_many`: Enter at most {max} search domains.
- `network.vlan.duplicate`: {parent} has a VLAN with the id {id} already.
- `network.vlan.id_invalid`: The VLAN id of {name} must be between 1 and 4094.
- `network.vlan.parent_invalid`: {parent} cannot carry the VLAN {name}: choose a network card or a bond.

## notifications

- `notifications.message.invalid`: The notification was not sent: its {field, select, app {app id is not valid} title {title is empty or longer than {maxLength} characters} other {text is longer than {maxLength} characters}}.
- `notifications.notification.not_found`: This notification no longer exists.

## permissions

- `permissions.grant.invalid`: The right “{resource}” cannot be given like this: it is unknown, given twice, or the level does not fit (read or read and write for a shared folder).

## proxy

- `proxy.access.denied`: You may not open {host}. An administrator can let you in on the proxy host.
- `proxy.address.denied`: Your address may not open this page.
- `proxy.address.invalid`: “{value}” is no IP address and no range such as 192.168.1.0/24.
- `proxy.auth.required`: Sign in first.
- `proxy.basic_auth.invalid`: The Basic Auth user “{username}” is not valid: the name needs 1 to 64 characters without a colon and may appear only once, the password 1 to 1024 characters.
- `proxy.basic_auth.password_missing`: Enter a password for the new user “{username}”.
- `proxy.certificate.missing`: Upload the certificate and its private key.
- `proxy.certificate.name_mismatch`: The certificate does not cover {name}.
- `proxy.domain.invalid`: “{name}” is no valid domain.
- `proxy.domain.taken`: Another host already answers {name}.
- `proxy.domains.missing`: Enter at least one domain.
- `proxy.domains.too_many`: {max, plural, one {Enter at most # domain.} other {Enter at most # domains.}}
- `proxy.header.invalid`: The header “{name}” is not allowed. Check its name and value; the proxy sets some headers itself, and each may appear only once.
- `proxy.headers.too_many`: {max, plural, one {Set at most # header.} other {Set at most # headers.}}
- `proxy.host.not_found`: There is no proxy host with the number {id}.
- `proxy.host.unknown`: This name is not set up on this box.
- `proxy.limit.out_of_range`: The value must be between {min} and {max}.
- `proxy.loop.detected`: The proxy host leads back to itself.
- `proxy.redirect.not_found`: There is no redirect host with the number {id}.
- `proxy.redirect.status_invalid`: {status} is no redirect status. Use 301, 302, 307 or 308.
- `proxy.redirect.target_invalid`: “{target}” is no complete http or https address.
- `proxy.sign_in.address_invalid`: “{address}” is no address like https://nas.home.arpa:7484.
- `proxy.sign_in.group_not_found`: There is no group named {name}.
- `proxy.sign_in.user_not_found`: There is no user named {name}.
- `proxy.stream.name_invalid`: {max, plural, one {The name may have at most # character and no control characters.} other {The name may have at most # characters and no control characters.}}
- `proxy.stream.not_found`: There is no stream with the number {id}.
- `proxy.stream.port_in_use`: Another program already uses port {port}.
- `proxy.stream.port_privileged`: Port {port} is below 1024. Confirm that you want to use it.
- `proxy.stream.port_reserved`: Port {port} belongs to a service of the box.
- `proxy.stream.port_taken`: Another stream already uses port {port}.
- `proxy.stream.protocol_missing`: Choose TCP, UDP or both.
- `proxy.target.invalid`: “{host}” is no valid host name or IP address.
- `proxy.target.loop`: The target is this box on port {port}, where the proxy itself answers.
- `proxy.target.on_box`: {host}:{port} is this box. Confirm that the host should lead to one of the box's own services.
- `proxy.target.timeout`: The target did not answer in time.
- `proxy.target.unavailable`: The target cannot be reached.
- `proxy.ticket.target_invalid`: This address does not belong to a proxy host with the Pithyx sign-in.
- `proxy.websockets.disabled`: This host does not pass WebSockets on.

## realtime

- `realtime.message.invalid`: The live connection received a message it does not understand.
- `realtime.topic.invalid`: {topic} is not a valid topic name or pattern.
- `realtime.topic.unknown`: There is no live data topic named {topic}.
- `realtime.upgrade.required`: This address only accepts WebSocket connections.

## request

- `request.body.invalid`: The request contains invalid data.
- `request.media_type.unsupported`: The request uses a content type the server does not accept.
- `request.method.not_allowed`: This API endpoint does not support the request method.
- `request.route.not_found`: This API endpoint does not exist.

## sdk

- `sdk.backend.endpoint_unknown`: The app asked for a backend connection it does not have ({endpoint}).
- `sdk.backend.unreachable`: The app could not reach its backend ({endpoint}). Check the connection to the box.
- `sdk.method.unknown`: This version of Pithyx does not support what the app asked for ({method}).
- `sdk.protocol.unsupported`: This app needs another version of Pithyx (protocol {protocol}, supported {min} to {max}).
- `sdk.request.invalid`: The app sent a request the desktop cannot process ({method}).
- `sdk.request.timeout`: The desktop did not answer the app in time ({method}).
- `sdk.transfer.cancelled`: The transfer was cancelled.
- `sdk.transport.closed`: The connection between the app and the desktop is closed. Open the app again.

## storage

- `storage.alert.not_found`: This alert is no longer active. Its cause is gone.
- `storage.command.failed`: The storage command {command} failed (exit code {exitCode}). Nothing after it was run; the log has the details.
- `storage.command.timed_out`: {command} did not finish within {minutes, plural, one {# minute} other {# minutes}}. A disk of the pool probably stopped answering and ZFS is waiting for it. Check the disks in Storage. If other pools stop responding too, restart the box.
- `storage.dataset.compression_invalid`: Pithyx does not set the compression {compression}. Choose off, lz4, zle, zstd (levels 1 to 19) or gzip (levels 1 to 9).
- `storage.dataset.exists`: A dataset named {name} exists already.
- `storage.dataset.in_use_by_share`: The share {share} has its folder in {dataset}. Delete the share on the shared folders page first; there you choose what happens to its data.
- `storage.dataset.limit_invalid`: {property, select, quota {The quota} other {The reservation}} cannot be negative. Use 0 for none.
- `storage.dataset.managed`: Pithyx finds {dataset} by its name (a home folder, an app or system data), so it cannot be renamed or deleted here.
- `storage.dataset.name_invalid`: Dataset names use letters, digits, ., - and _, start with a letter or digit and have up to 64 characters.
- `storage.dataset.name_mismatch`: Type the full dataset name {name} exactly to confirm.
- `storage.dataset.not_found`: There is no dataset named {dataset}. Reload the page.
- `storage.dataset.property_unsupported`: {dataset} does not take the setting {property}. Volumes, the pool root and the datasets of the Pithyx layout take only compression, and record size is for file systems only.
- `storage.dataset.protected`: {dataset} is the pool root or part of the Pithyx layout. Pithyx does not rename or delete it.
- `storage.dataset.quota_below_used`: The quota must be at least the space the dataset uses now, snapshots and child datasets included.
- `storage.dataset.record_size_invalid`: The record size must be a power of two from 4 KiB to 1 MiB.
- `storage.dataset.reservation_too_large`: The pool cannot reserve that much for this dataset now. Choose a smaller reservation.
- `storage.dataset.unchanged`: Nothing to change: {dataset} has these settings already.
- `storage.disk.not_found`: The disk is no longer there. Reload the list and choose again.
- `storage.disk.refused`: The disk may not be used: {reason, select, system_disk {it holds the system} mounted {a file system on it is in use} pool_member {it belongs to a pool} not_test_disk {it is not a declared test disk} other {it is not safe to use}}.
- `storage.encryption.unavailable`: Encryption comes with the key vault in the next update. A pool can only be encrypted when it is created, so create it without encryption only if that is fine for its data.
- `storage.import.device_unknown`: The device {device} of this pool is on no disk Pithyx knows, so it cannot check it. Nothing was imported.
- `storage.import.force_required`: Pool {name} was last used by another system. Import it only if that system no longer uses it: choose to force the import and type the pool name.
- `storage.import.not_found`: This pool is no longer found on the disks. Scan again.
- `storage.import.not_importable`: Pool {name} cannot be imported ({state}). Connect its missing disks and scan again.
- `storage.import.preview_required`: Import pool {name} read-only first and check its datasets, then import it for use.
- `storage.plan.action_invalid`: Unknown storage action.
- `storage.plan.expired`: This plan is more than 10 minutes old. Show it again to check the disks once more.
- `storage.plan.not_found`: This plan is no longer there (it ran already, expired or the daemon restarted). Show it again.
- `storage.plan.stale`: A disk changed after the plan was shown. Nothing was changed; show the plan again.
- `storage.pool.disk_count`: {layout} needs at least {min, plural, one {# disk} other {# disks}}; {count, plural, one {# is} other {# are}} selected.
- `storage.pool.disks_missing`: Disks of {name} are not connected, so it cannot be destroyed or exported now: the command would stop the pool and hang until the box restarts. Connect the disks again first, or restart the box to forget the pool.
- `storage.pool.encryption_required`: Answer the encryption question first: it can only be decided when the pool is created.
- `storage.pool.expanding`: Pool {name} is being expanded already. The next disk can be added when that is done.
- `storage.pool.layout_invalid`: Unknown pool layout.
- `storage.pool.name_invalid`: Pool names start with a lowercase letter and use up to 32 lowercase letters, digits, - and _. Names like mirror or raidz are reserved.
- `storage.pool.name_mismatch`: Type the pool name {name} exactly to confirm.
- `storage.pool.name_taken`: A pool named {name} exists already.
- `storage.pool.not_found`: There is no pool named {name}.
- `storage.pool.not_prepared`: Pithyx did not set up the pool {pool} (it has no pithyx dataset), so it creates nothing on it.
- `storage.pool.read_only`: Pool {name} is imported read-only and cannot be changed. Import it for use first.
- `storage.pool.suspended`: {name} has stopped all reads and writes because too many of its disks are gone. Destroying or exporting it now would hang until the box restarts. Connect the disks again; Pithyx then resumes the pool on its own.
- `storage.schedule.invalid`: This schedule cannot be set. Choose Off, Weekly or Monthly for an existing pool.
- `storage.scrub.not_running`: Pool {pool} is not being scrubbed right now.
- `storage.scrub.running`: Pool {pool} is being scrubbed already.
- `storage.snapshot.confirmation_mismatch`: The name you typed does not match the dataset. Nothing was rolled back.
- `storage.snapshot.dataset_not_found`: There is no dataset named {dataset}. Reload the page.
- `storage.snapshot.exists`: A snapshot named {name} exists already. Wait a second and try again.
- `storage.snapshot.held`: The snapshot {name} is held and cannot be deleted. Release the hold first.
- `storage.snapshot.newer_exist`: The newer snapshots changed since the plan was shown: the dataset now has {count, plural, one {# newer snapshot} other {# newer snapshots}}. Nothing was rolled back; show the plan again.
- `storage.snapshot.not_found`: There is no snapshot named {name}. Reload the list.
- `storage.snapshot.not_pithyx`: Pithyx deletes only snapshots it took. {name} was made by someone else and stays.
- `storage.snapshot.schedule_invalid`: Each schedule is hourly, daily, weekly or monthly, once, and keeps between 1 and {max} snapshots.
- `storage.vdev.not_found`: The pool has no such device (any more). Reload and choose again.
- `storage.vdev.not_raidz`: Only a RAID-Z group can be expanded by a disk; {vdev} is not one.
- `storage.volume.size_invalid`: A volume needs a size of at least 1 MiB.
- `storage.volume.too_large`: The volume does not fit the free space of the pool. Make it smaller or create it as a sparse volume.
- `storage.zfs.unavailable`: ZFS did not answer in time or reported an error, so Pithyx cannot show what this would change. Try again in a moment. If it keeps happening, a pool may be waiting for disks that are gone: see Storage.

## store

- `store.app.not_found`: The catalog has no app {id} {version} for this box.
- `store.catalog.architecture_missing`: The catalog lists an image at {path} without the architecture {architecture}.
- `store.catalog.built_in`: The catalogs of the Pithyx project cannot be removed, only switched off.
- `store.catalog.busy`: The catalog {catalog} is being checked already.
- `store.catalog.data_version_decreased`: The catalog lowers the data version at {path} to {dataVersion}, after {previous} in an older version.
- `store.catalog.exists`: This box has the catalog {catalog} already.
- `store.catalog.id_reserved`: The catalog uses the id {id} at {path}, which only the official Pithyx catalog may use.
- `store.catalog.invalid_json`: The catalog's file {file} cannot be read as JSON.
- `store.catalog.mismatch`: The catalog's index has {value} at {path}, but this box expects {expected}.
- `store.catalog.not_found`: This box has no catalog {catalog}, or it is switched off.
- `store.catalog.rule_violation`: The pull request breaks a catalog rule: {rule, select, one_app {{path} lies outside the one app folder a pull request may change} required_file {{path} is missing} file_type {{path} is a kind of file a catalog does not accept} binary {{path} is binary or not UTF-8} minified {{path} looks minified or generated} media {{path} is not the image or font its name says} unpinned {line {line} of {path} uses the image {image}, which is not pinned with @sha256} screenshot {{path} is not a screenshot directly in screenshots/ as a PNG, JPEG or WebP file with a lower case name of at most 1 MB} screenshots {{path} holds more than {limit} screenshots} app_size {{path} is larger than {limit} bytes} folder_id {the folder of {path} must be named like the app's id {id}} manifest_field {the manifest {path} needs the field {field}} license {{license} in {path} is not an OSI approved license} version_not_higher {version {version} in {path} is not higher than the published {published}} maintainer {{author} is not a maintainer of the app} maintainers_invalid {{path} is not a valid list of maintainers} other {{path} breaks a rule}}.
- `store.catalog.schema_violation`: The catalog's file {file} is not valid at {path} ({keyword}).
- `store.catalog.sequence_old`: The catalog's index is older (sequence {sequence}) than one this box already checked ({known}), so the box keeps its copy.
- `store.catalog.signature_invalid`: The catalog's index is not signed correctly ({reason, select, missing {the signature is missing} malformed {the signature file is not valid} untrusted {no signature is by a key this box trusts for its channel} mismatch {a signature does not match the index} other {the signature does not prove it}}), so the box keeps its last checked copy.
- `store.catalog.unreachable`: The catalog cannot be fetched: {reason, select, timeout {the server did not answer in time} auth {the repository refused access; check the URL and the deploy key} host_key {the server's key differs from the one this box pinned} branch {it has not published anything for this channel yet} other {the fetch failed}}. The box keeps its last verified copy.
- `store.catalog.url_invalid`: This is not a catalog URL the box fetches: {reason, select, scheme {use https:// or SSH (git@host:owner/repository.git)} host {the host is missing or not allowed} other {the path is not allowed}}.
- `store.catalog.version_unsupported`: The catalog's file {file} has format version {version}, this box reads version {supported}. Update Pithyx to use this catalog.
- `store.package.hash_mismatch`: A file of the catalog does not match its index ({path}). The box does not install it.

## system

- `system.backup.category_missing`: This backup does not contain {category, select, users {the users} sharedFolders {the shared folders} storage {the storage settings} system {the system settings} certificates {the certificates and keys} apps {the apps} other {{category}}}.
- `system.backup.invalid`: This file is not a Pithyx configuration backup, or it is damaged.
- `system.backup.password_wrong`: The backup password is wrong.
- `system.backup.restore_expired`: The checked backup is no longer available. Choose the file again.
- `system.backup.restore_failed`: The restore could not be applied. Nothing was changed; the details are in the Log Center.
- `system.backup.restore_running`: A restore is already running.
- `system.backup.too_large`: This file is larger than a configuration backup can be (at most {maxMb} MB).
- `system.backup.too_new`: A newer version of Pithyx ({version}) created this backup. Update this box first.
- `system.internal.unexpected`: Something went wrong on the server. The details are in the logs.
- `system.origin.forbidden`: The request came from another website and was rejected.
- `system.time.apply_failed`: The time setting could not be applied ({command} ended with exit code {exitCode}). The log has the details.
- `system.time.server_invalid`: “{server}” is neither a host name nor an address.
- `system.time.servers_too_many`: Enter at most {max} time servers.
- `system.time.zone_invalid`: The system does not know the time zone “{zone}”.

## tls

- `tls.custom.expired`: The certificate is not valid now: it has not started yet or has already ended.
- `tls.custom.invalid`: That is no certificate in PEM format, or it is larger than 64 KiB.
- `tls.custom.key_mismatch`: The private key is unreadable, protected by a password or does not belong to the certificate.
- `tls.issued.not_found`: There is no issued certificate with the number {id}.
- `tls.name.invalid`: {name} is no valid DNS name or IP address.
- `tls.name.not_permitted`: The box's certificate authority may not sign {name}. Create a new authority that includes it, or use a certificate of your own.
- `tls.names.missing`: Enter at least one name or address.
- `tls.names.too_many`: {max, plural, one {Enter at most # name.} other {Enter at most # names.}}
- `tls.validity.out_of_range`: The validity must be between {min} and {max} days.

## update

- `update.apply.failed`: The update failed while {step, select, snapshot {taking the snapshot} install {installing the packages} debian {installing the Debian updates} bootloader {writing GRUB to the disks} health {checking the new version} other {{step}}} ({command}, exit code {exitCode}). If it got past the snapshot, the box went back to the previous version.
- `update.apply.running`: An update or a rollback is already running. Wait until the box has restarted.
- `update.channel.invalid`: The update channel's file cannot be read; the box keeps what it knew.
- `update.channel.mismatch`: The update source answers with the {channel} channel, but this box follows {expected}.
- `update.channel.sequence_old`: The update source sent an older channel file ({sequence}) than this box saw before ({known}). It was ignored.
- `update.channel.signature_invalid`: The update channel's signature is {reason, select, missing {missing} malformed {damaged} untrusted {from a key this box does not trust} other {wrong}}. The box ignores it.
- `update.download.mismatch`: The downloaded update file is not the one the channel names. Nothing was installed; try again later.
- `update.file.architecture`: This update file is for {architecture}, but this box is {box}.
- `update.file.channel`: This is a {channel} update file, but this box follows the {boxChannel} channel. Switch the channel in Settings > Updates to install it.
- `update.file.hash_mismatch`: The update file is damaged: {path} does not match its manifest. Download it again.
- `update.file.invalid`: This is not a Pithyx update file, or it is damaged.
- `update.file.minimum`: This update needs at least Pithyx {minimum}; this box has {installed}. Install a version in between first.
- `update.file.missing_entry`: The update file is incomplete: {path} is missing.
- `update.file.not_found`: There is no uploaded update file any more. Upload it again.
- `update.file.older`: This update file brings Pithyx {version}, but the box already has {installed}. An older version only comes back through a rollback.
- `update.file.signature_invalid`: The update file's signature is {reason, select, missing {missing} malformed {damaged} untrusted {from a key this box does not trust} other {wrong}}. Nothing was changed.
- `update.file.too_large`: The update file is larger than {limit, number} bytes.
- `update.file.unexpected_entry`: The update file contains {path}, which its manifest does not name. Nothing was changed.
- `update.none.available`: There is no newer version on this channel.
- `update.rollback.unconfirmed`: The typed version does not match {version}. Nothing was changed.
- `update.snapshot.not_found`: The snapshot {snapshot} does not exist any more.
- `update.source.invalid`: The update source file does not pass its check ({reason, select, json {not JSON, or larger than 64 KB} url {the URL must use https and contain '{channel}'} schema {a field is missing, unknown or malformed, or a public key is not 32 bytes} duplicate_key {a key id appears twice} other {{reason}}}).
- `update.source.unreachable`: The update source cannot be reached ({reason, select, network {no connection} timeout {no answer in time} status {answer {status}} missing {the channel has no release yet} scheme {only https is allowed} other {{reason}}}). The box tries again tomorrow; you can upload an update file instead.
- `update.space.insufficient`: The system disk has {free, number} bytes free, but the update needs {needed, number}.
- `update.system.unsupported`: Updates apply only to a box installed with the Pithyx installer. This machine is laid out differently ({reason}).

## users

- `users.account.refused`: The Linux account {username} cannot be created ({reason}). A system account may already use this name.
- `users.gid.exhausted`: No group ids are left. Every id from 30000 to 39999 has been given out once.
- `users.group.builtin`: The group users holds every user. It cannot be renamed, deleted or given members.
- `users.group.description_invalid`: The description can have at most {max} characters on one line.
- `users.group.exists`: A group named {name} already exists.
- `users.group.name_invalid`: Use lowercase letters, digits, hyphens and underscores, starting with a letter or underscore, at most 32 characters.
- `users.group.name_reserved`: The name {name} belongs to the system. Choose another one.
- `users.group.not_found`: The group was not found. Someone may have deleted it.
- `users.group.refused`: The Linux group {name} cannot be created ({reason}). A system group may already use this name.
- `users.uid.exhausted`: No user ids are left. Every id from 20000 to 29999 has been given out once.
- `users.user.exists`: A user named {username} already exists.
- `users.user.last_admin`: The last administrator cannot be deleted or lose the administrator right.
- `users.user.not_found`: The user was not found. Someone may have deleted it.
- `users.user.self`: You cannot delete your own account.

