Skip to content

Error codes

View as Markdown

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

CodeMessage
app.app.busyThe 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_foundNo app with the id {id} is installed.
app.backend.endpoint_unknownThe app has no backend endpoint named {endpoint}.
app.backend.missingThe app has no backend.
app.backend.start_failedThe app's backend did not start. The app's log shows what its containers wrote.
app.backend.storage_unavailableThe 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.unavailableThe app's backend is not running or does not answer. Try again in a moment.
app.backend.unsupportedThis 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_unsupportedThe app's Compose file uses {key} at {path}, which Pithyx does not allow.
app.compose.reference_unknownThe app's backend refers to {name} at {path}, which is not declared.
app.compose.right_missingThe app's Compose file needs the right {right} at {path}, which its manifest does not declare.
app.compose.right_unusedThe app's manifest declares the right {right} at {path}, which its Compose file does not use.
app.compose.storage_mismatchThe 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_invalidThe 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_invalidThe 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.unavailableThe container service does not answer, so app backends cannot run right now.
app.elevated.unsupportedThe app asks for the right {right}, which this version of Pithyx does not grant.
app.icon.invalidThe 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.mismatchThe image {image} is not the one the app's package names. Pithyx does not run it.
app.image.unavailableThe image {image} of the app's backend could not be loaded or downloaded.
app.manifest.cron_invalidThe schedule at {path} is not a valid cron expression: {cron}
app.manifest.duplicateThe manifest has {value} twice (at {path}).
app.manifest.id_invalidThe 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_reservedThe app id {id} is reserved for the apps that come with Pithyx.
app.manifest.invalid_jsonThe app's manifest (pithyx.json) is not valid JSON.
app.manifest.pithyx_invalidThe Pithyx version range {pithyx} in the manifest is not valid.
app.manifest.reference_unknownThe manifest refers to {name} at {path}, which it does not declare.
app.manifest.schema_violationThe app's manifest is not valid at {path} ({keyword}).
app.manifest.sdk_invalidThe SDK version range {sdk} in the manifest is not valid.
app.manifest.version_unsupportedThis app needs a newer version of Pithyx (manifest version {version}, this box reads version {supported}).
app.manifest.window_size_invalidThe app's smallest window size is larger than its default size.
app.mapping.invalidThe 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_oldThis version needs Pithyx {range}; this box runs {version}. Update Pithyx first.
app.package.downgrade_unsupportedThis 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.invalidThe 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_invalidThe 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_invalidThe 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_foundThe checked package is no longer there. Upload the file again.
app.package.too_largeThe 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.deniedThe app is not allowed to do this ({permission}).
app.permission.not_requestedThe app does not ask for the permission {permission}.
app.pool.fixedApps live on the pool {pool}. They cannot move to another pool while an app is installed.
app.pool.requiredChoose a pool for the app data.
app.pool.unavailableThe 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_invalidThe app used a key that is empty or longer than {maxLength} characters.
app.storage.not_foundThe app's storage {storage} does not exist or no folder is assigned to it yet.
app.storage.too_largeThe app tried to store more than it may keep. The limit is {maxKb} KB.
app.token.invalidThe app's access expired. Close the app and open it again.

auth

CodeMessage
auth.account.disabledThis account is deactivated. Ask an administrator to activate it again.
auth.challenge.expiredThe sign-in step has expired. Please sign in again.
auth.credentials.invalidThe user name or password is incorrect.
auth.csrf.header_missingThe request was rejected because a security header is missing.
auth.desktop.not_allowedYou may not sign in to the desktop. Ask an administrator for the desktop sign-in right.
auth.display_name.invalidThe display name can have at most {maxLength} characters and no control characters.
auth.password.too_commonThis password is too well known. Choose one that is harder to guess.
auth.password.too_longThe password can have at most {maxLength} characters.
auth.password.too_shortThe password needs at least {minLength} characters.
auth.permission.deniedYou do not have permission for this action.
auth.rate.limitedToo many attempts. Try again in {retryAfterSeconds, plural, one {# second} other {# seconds}}.
auth.recovery.invalidThe user name or recovery key is incorrect.
auth.session.expiredThe session has expired. Please sign in again.
auth.setup.already_doneThis system has already been set up.
auth.totp.already_enabledTwo-factor authentication is already enabled.
auth.totp.invalidThe code is incorrect or has already been used.
auth.totp.not_enrolledTwo-factor authentication has not been set up yet.
auth.username.invalidUser names start with a lowercase letter or an underscore and contain only lowercase letters, digits, underscores and hyphens, at most 32 characters.
auth.username.reservedThe user name {username} is reserved for the system.

desktop

CodeMessage
desktop.device.not_foundNo saved desktop was found for that device. It may have expired.
desktop.item.conflictThis desktop item was changed on another device in the meantime.
desktop.item.invalidThe desktop item could not be saved because it is not in a known format.
desktop.item.limit_reachedThe desktop is full. It holds at most {max} items.
desktop.item.not_foundThis desktop item no longer exists. It may have been deleted on another device.
desktop.layout.conflictThe desktop layout was saved from another tab in the meantime.
desktop.layout.invalidThe desktop layout could not be saved because it is not in a known format.
desktop.layout.too_largeThe desktop layout is too large to save. At most {maxWindows} windows and {maxAppDataKb} KB of app data are kept.
desktop.note.too_longThe note is too long. A note holds at most {maxLength} characters.

fileservices

CodeMessage
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.invalidEnter a workgroup of 1 to {max} letters, digits, dots, dashes or underscores, starting with a letter or digit.

fs

CodeMessage
fs.cursor.invalidThe list position is no longer valid. Load the folder again.
fs.entry.access_deniedThe system does not allow access to this item.
fs.entry.exists“{name}” already exists here.
fs.entry.is_folderThis is a folder, not a file.
fs.entry.not_folderThis is a file, not a folder.
fs.entry.not_foundThe file or folder was not found. It may have been moved or deleted.
fs.folder.not_emptyThe folder is not empty.
fs.io.failedThe file system reported an error (errno {errno}).
fs.name.invalidThis name cannot be used. Names must not be empty, contain a slash, or be longer than 255 bytes.
fs.operation.into_itselfA folder cannot be copied or moved into itself.
fs.operation.invalidThis file operation is not valid.
fs.path.invalidThis path is not valid. Paths are relative to the share, without “.” or “..”, and at most {maxBytes} bytes long.
fs.range.not_satisfiableThe requested part of the file does not exist.
fs.share.data_choice_requiredChoose what happens with the data: keep it, or delete it for good.
fs.share.dataset_name_invalidNo dataset name can be made from “{name}”. Use at least one letter from a to z or a digit.
fs.share.description_invalidThe description can have at most {max} characters and no line breaks.
fs.share.existsA share with this name already exists.
fs.share.folder_dev_onlyExisting folders can only be registered as shares on a development machine. Create a shared folder instead; it gets its own dataset.
fs.share.invalidThe share could not be created. It needs a name and an existing folder outside the system directories.
fs.share.name_mismatchThe typed name does not match. Type {name} exactly.
fs.share.name_reservedThe name {name} is used by Pithyx itself. Choose another name.
fs.share.no_datasetThis shared folder is a plain folder, not a dataset. Its files can only be kept.
fs.share.not_foundThe share was not found, or you have no access to it.
fs.share.path_takenSomething else is already mounted at {path}. Choose another name.
fs.share.pool_not_preparedThe pool {pool} has no place for shared folders (pithyx/shares), so none can be created on it.
fs.share.read_onlyYou 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_foundThere is no preview of this file yet.
fs.thumbnail.too_manyAsk for at most {max} previews at once.
fs.trash.retention_invalidThe recycle bin keeps items between 0 and {max} days (0 keeps them until it is emptied).
fs.upload.incompleteThe upload was interrupted. Nothing was saved.
fs.version.not_foundThis version is no longer there. The snapshot may have been deleted; reload the list.
fs.volume.fullThere is not enough free space.
fs.volume.read_onlyThe storage is read-only.

homes

CodeMessage
homes.choice.invalidChoose 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_useThis 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_mismatchType {name} exactly to confirm.
homes.home.not_foundThis home folder does not exist (anymore).
homes.move.runningThe home folders are moving to another pool already. Wait until the move has finished.
homes.pool.no_spaceThe pool has too little free space for the home folders: {neededBytes, number} bytes are needed, {availableBytes, number} are free.
homes.pool.takenThe target pool has a home folder named {folder} already.
homes.pool.unavailableThe 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.unchangedThe home folders are on this pool already.
homes.quota.invalidA quota is at least 1 MiB, or no limit.

installer

CodeMessage
installer.check.failedThis computer does not meet a requirement of Pithyx. The first page of the installer shows which.
installer.claim.requiredAnother browser owns this installation. To start over, restart the computer from the USB stick.
installer.claim.takenThis installation is already in use in another browser. To start over, restart the computer from the USB stick.
installer.disk.countChoose one disk, or two different disks for a mirror.
installer.disk.unsuitablePithyx cannot be installed on this disk. Choose another one.
installer.erase.not_confirmedConfirm that all data on the chosen disks will be erased.
installer.hostname.invalidUse lowercase letters, digits and hyphens for the name, at most 63 characters, not starting or ending with a hyphen.
installer.install.failedThe installation failed. Nothing was installed completely; you can try again. The log of the installer has the details.
installer.install.runningThe installation is already running or finished.
installer.keyboard.invalidChoose a keyboard layout from the list.
installer.reboot.not_readyThe computer can only restart once the installation is finished.

jobs

CodeMessage
jobs.job.not_foundThis job does not exist or has already been removed.

logs

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

network

CodeMessage
network.address.invalidThe {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.failedThe 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_missingThe bond {name} needs at least one network card.
network.bond.primary_invalidThe primary card of the bond {name} must be one of its cards.
network.change.emptyThese are the settings the box has already.
network.change.not_foundThis change no longer waits for a confirmation: it was kept, undone or rolled back.
network.change.pendingAnother network change waits for its confirmation. Keep or undo it first.
network.config.unreachableAfter 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_manyEnter at most {max} name servers.
network.firewall.failedThe firewall rules could not be applied. The setting is saved; the Log Center has the details.
network.gateway.invalidThe {field, select, ipv6Gateway {IPv6} other {IPv4}} gateway of {name} must be an address in its network.
network.global.not_changeablePithyx does not change the host name, name servers or default route of a development machine.
network.host_name.invalidA host name has 1 to 63 letters, digits and hyphens and does not start or end with a hyphen.
network.interface.duplicateThe name {name} is already taken.
network.interface.kind_invalidThe 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_changeablePithyx may not change {name} on this machine.
network.interface.unknownThis box has no network card {name}.
network.mtu.invalidThe 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_manyEnter at most {max} search domains.
network.vlan.duplicate{parent} has a VLAN with the id {id} already.
network.vlan.id_invalidThe 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

CodeMessage
notifications.message.invalidThe 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_foundThis notification no longer exists.

permissions

CodeMessage
permissions.grant.invalidThe 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

CodeMessage
proxy.access.deniedYou may not open {host}. An administrator can let you in on the proxy host.
proxy.address.deniedYour 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.requiredSign in first.
proxy.basic_auth.invalidThe 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_missingEnter a password for the new user “{username}”.
proxy.certificate.missingUpload the certificate and its private key.
proxy.certificate.name_mismatchThe certificate does not cover {name}.
proxy.domain.invalid“{name}” is no valid domain.
proxy.domain.takenAnother host already answers {name}.
proxy.domains.missingEnter at least one domain.
proxy.domains.too_many{max, plural, one {Enter at most # domain.} other {Enter at most # domains.}}
proxy.header.invalidThe 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_foundThere is no proxy host with the number {id}.
proxy.host.unknownThis name is not set up on this box.
proxy.limit.out_of_rangeThe value must be between {min} and {max}.
proxy.loop.detectedThe proxy host leads back to itself.
proxy.redirect.not_foundThere 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_foundThere is no group named {name}.
proxy.sign_in.user_not_foundThere 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_foundThere is no stream with the number {id}.
proxy.stream.port_in_useAnother program already uses port {port}.
proxy.stream.port_privilegedPort {port} is below 1024. Confirm that you want to use it.
proxy.stream.port_reservedPort {port} belongs to a service of the box.
proxy.stream.port_takenAnother stream already uses port {port}.
proxy.stream.protocol_missingChoose TCP, UDP or both.
proxy.target.invalid“{host}” is no valid host name or IP address.
proxy.target.loopThe 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.timeoutThe target did not answer in time.
proxy.target.unavailableThe target cannot be reached.
proxy.ticket.target_invalidThis address does not belong to a proxy host with the Pithyx sign-in.
proxy.websockets.disabledThis host does not pass WebSockets on.

realtime

CodeMessage
realtime.message.invalidThe live connection received a message it does not understand.
realtime.topic.invalid{topic} is not a valid topic name or pattern.
realtime.topic.unknownThere is no live data topic named {topic}.
realtime.upgrade.requiredThis address only accepts WebSocket connections.

request

CodeMessage
request.body.invalidThe request contains invalid data.
request.media_type.unsupportedThe request uses a content type the server does not accept.
request.method.not_allowedThis API endpoint does not support the request method.
request.route.not_foundThis API endpoint does not exist.

sdk

CodeMessage
sdk.backend.endpoint_unknownThe app asked for a backend connection it does not have ({endpoint}).
sdk.backend.unreachableThe app could not reach its backend ({endpoint}). Check the connection to the box.
sdk.method.unknownThis version of Pithyx does not support what the app asked for ({method}).
sdk.protocol.unsupportedThis app needs another version of Pithyx (protocol {protocol}, supported {min} to {max}).
sdk.request.invalidThe app sent a request the desktop cannot process ({method}).
sdk.request.timeoutThe desktop did not answer the app in time ({method}).
sdk.transfer.cancelledThe transfer was cancelled.
sdk.transport.closedThe connection between the app and the desktop is closed. Open the app again.

storage

CodeMessage
storage.alert.not_foundThis alert is no longer active. Its cause is gone.
storage.command.failedThe 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_invalidPithyx does not set the compression {compression}. Choose off, lz4, zle, zstd (levels 1 to 19) or gzip (levels 1 to 9).
storage.dataset.existsA dataset named {name} exists already.
storage.dataset.in_use_by_shareThe 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.managedPithyx finds {dataset} by its name (a home folder, an app or system data), so it cannot be renamed or deleted here.
storage.dataset.name_invalidDataset names use letters, digits, ., - and _, start with a letter or digit and have up to 64 characters.
storage.dataset.name_mismatchType the full dataset name {name} exactly to confirm.
storage.dataset.not_foundThere 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_usedThe quota must be at least the space the dataset uses now, snapshots and child datasets included.
storage.dataset.record_size_invalidThe record size must be a power of two from 4 KiB to 1 MiB.
storage.dataset.reservation_too_largeThe pool cannot reserve that much for this dataset now. Choose a smaller reservation.
storage.dataset.unchangedNothing to change: {dataset} has these settings already.
storage.disk.not_foundThe disk is no longer there. Reload the list and choose again.
storage.disk.refusedThe 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.unavailableEncryption 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_unknownThe device {device} of this pool is on no disk Pithyx knows, so it cannot check it. Nothing was imported.
storage.import.force_requiredPool {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_foundThis pool is no longer found on the disks. Scan again.
storage.import.not_importablePool {name} cannot be imported ({state}). Connect its missing disks and scan again.
storage.import.preview_requiredImport pool {name} read-only first and check its datasets, then import it for use.
storage.plan.action_invalidUnknown storage action.
storage.plan.expiredThis plan is more than 10 minutes old. Show it again to check the disks once more.
storage.plan.not_foundThis plan is no longer there (it ran already, expired or the daemon restarted). Show it again.
storage.plan.staleA 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_missingDisks 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_requiredAnswer the encryption question first: it can only be decided when the pool is created.
storage.pool.expandingPool {name} is being expanded already. The next disk can be added when that is done.
storage.pool.layout_invalidUnknown pool layout.
storage.pool.name_invalidPool 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_mismatchType the pool name {name} exactly to confirm.
storage.pool.name_takenA pool named {name} exists already.
storage.pool.not_foundThere is no pool named {name}.
storage.pool.not_preparedPithyx did not set up the pool {pool} (it has no pithyx dataset), so it creates nothing on it.
storage.pool.read_onlyPool {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.invalidThis schedule cannot be set. Choose Off, Weekly or Monthly for an existing pool.
storage.scrub.not_runningPool {pool} is not being scrubbed right now.
storage.scrub.runningPool {pool} is being scrubbed already.
storage.snapshot.confirmation_mismatchThe name you typed does not match the dataset. Nothing was rolled back.
storage.snapshot.dataset_not_foundThere is no dataset named {dataset}. Reload the page.
storage.snapshot.existsA snapshot named {name} exists already. Wait a second and try again.
storage.snapshot.heldThe snapshot {name} is held and cannot be deleted. Release the hold first.
storage.snapshot.newer_existThe 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_foundThere is no snapshot named {name}. Reload the list.
storage.snapshot.not_pithyxPithyx deletes only snapshots it took. {name} was made by someone else and stays.
storage.snapshot.schedule_invalidEach schedule is hourly, daily, weekly or monthly, once, and keeps between 1 and {max} snapshots.
storage.vdev.not_foundThe pool has no such device (any more). Reload and choose again.
storage.vdev.not_raidzOnly a RAID-Z group can be expanded by a disk; {vdev} is not one.
storage.volume.size_invalidA volume needs a size of at least 1 MiB.
storage.volume.too_largeThe volume does not fit the free space of the pool. Make it smaller or create it as a sparse volume.
storage.zfs.unavailableZFS 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

CodeMessage
store.app.not_foundThe catalog has no app {id} {version} for this box.
store.catalog.architecture_missingThe catalog lists an image at {path} without the architecture {architecture}.
store.catalog.built_inThe catalogs of the Pithyx project cannot be removed, only switched off.
store.catalog.busyThe catalog {catalog} is being checked already.
store.catalog.data_version_decreasedThe catalog lowers the data version at {path} to {dataVersion}, after {previous} in an older version.
store.catalog.existsThis box has the catalog {catalog} already.
store.catalog.id_reservedThe catalog uses the id {id} at {path}, which only the official Pithyx catalog may use.
store.catalog.invalid_jsonThe catalog's file {file} cannot be read as JSON.
store.catalog.mismatchThe catalog's index has {value} at {path}, but this box expects {expected}.
store.catalog.not_foundThis box has no catalog {catalog}, or it is switched off.
store.catalog.rule_violationThe 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_violationThe catalog's file {file} is not valid at {path} ({keyword}).
store.catalog.sequence_oldThe catalog's index is older (sequence {sequence}) than one this box already checked ({known}), so the box keeps its copy.
store.catalog.signature_invalidThe 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.unreachableThe 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_invalidThis 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_unsupportedThe catalog's file {file} has format version {version}, this box reads version {supported}. Update Pithyx to use this catalog.
store.package.hash_mismatchA file of the catalog does not match its index ({path}). The box does not install it.

system

CodeMessage
system.backup.category_missingThis 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.invalidThis file is not a Pithyx configuration backup, or it is damaged.
system.backup.password_wrongThe backup password is wrong.
system.backup.restore_expiredThe checked backup is no longer available. Choose the file again.
system.backup.restore_failedThe restore could not be applied. Nothing was changed; the details are in the Log Center.
system.backup.restore_runningA restore is already running.
system.backup.too_largeThis file is larger than a configuration backup can be (at most {maxMb} MB).
system.backup.too_newA newer version of Pithyx ({version}) created this backup. Update this box first.
system.internal.unexpectedSomething went wrong on the server. The details are in the logs.
system.origin.forbiddenThe request came from another website and was rejected.
system.time.apply_failedThe 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_manyEnter at most {max} time servers.
system.time.zone_invalidThe system does not know the time zone “{zone}”.

tls

CodeMessage
tls.custom.expiredThe certificate is not valid now: it has not started yet or has already ended.
tls.custom.invalidThat is no certificate in PEM format, or it is larger than 64 KiB.
tls.custom.key_mismatchThe private key is unreadable, protected by a password or does not belong to the certificate.
tls.issued.not_foundThere is no issued certificate with the number {id}.
tls.name.invalid{name} is no valid DNS name or IP address.
tls.name.not_permittedThe box's certificate authority may not sign {name}. Create a new authority that includes it, or use a certificate of your own.
tls.names.missingEnter 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_rangeThe validity must be between {min} and {max} days.

update

CodeMessage
update.apply.failedThe 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.runningAn update or a rollback is already running. Wait until the box has restarted.
update.channel.invalidThe update channel's file cannot be read; the box keeps what it knew.
update.channel.mismatchThe update source answers with the {channel} channel, but this box follows {expected}.
update.channel.sequence_oldThe update source sent an older channel file ({sequence}) than this box saw before ({known}). It was ignored.
update.channel.signature_invalidThe 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.mismatchThe downloaded update file is not the one the channel names. Nothing was installed; try again later.
update.file.architectureThis update file is for {architecture}, but this box is {box}.
update.file.channelThis is a {channel} update file, but this box follows the {boxChannel} channel. Switch the channel in Settings > Updates to install it.
update.file.hash_mismatchThe update file is damaged: {path} does not match its manifest. Download it again.
update.file.invalidThis is not a Pithyx update file, or it is damaged.
update.file.minimumThis update needs at least Pithyx {minimum}; this box has {installed}. Install a version in between first.
update.file.missing_entryThe update file is incomplete: {path} is missing.
update.file.not_foundThere is no uploaded update file any more. Upload it again.
update.file.olderThis update file brings Pithyx {version}, but the box already has {installed}. An older version only comes back through a rollback.
update.file.signature_invalidThe 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_largeThe update file is larger than {limit, number} bytes.
update.file.unexpected_entryThe update file contains {path}, which its manifest does not name. Nothing was changed.
update.none.availableThere is no newer version on this channel.
update.rollback.unconfirmedThe typed version does not match {version}. Nothing was changed.
update.snapshot.not_foundThe snapshot {snapshot} does not exist any more.
update.source.invalidThe 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.unreachableThe 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.insufficientThe system disk has {free, number} bytes free, but the update needs {needed, number}.
update.system.unsupportedUpdates apply only to a box installed with the Pithyx installer. This machine is laid out differently ({reason}).

users

CodeMessage
users.account.refusedThe Linux account {username} cannot be created ({reason}). A system account may already use this name.
users.gid.exhaustedNo group ids are left. Every id from 30000 to 39999 has been given out once.
users.group.builtinThe group users holds every user. It cannot be renamed, deleted or given members.
users.group.description_invalidThe description can have at most {max} characters on one line.
users.group.existsA group named {name} already exists.
users.group.name_invalidUse lowercase letters, digits, hyphens and underscores, starting with a letter or underscore, at most 32 characters.
users.group.name_reservedThe name {name} belongs to the system. Choose another one.
users.group.not_foundThe group was not found. Someone may have deleted it.
users.group.refusedThe Linux group {name} cannot be created ({reason}). A system group may already use this name.
users.uid.exhaustedNo user ids are left. Every id from 20000 to 29999 has been given out once.
users.user.existsA user named {username} already exists.
users.user.last_adminThe last administrator cannot be deleted or lose the administrator right.
users.user.not_foundThe user was not found. Someone may have deleted it.
users.user.selfYou cannot delete your own account.