Error codes
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
jobs.job.not_found | This job does not exist or has already been removed. |
logs
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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
| Code | Message |
|---|---|
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. |