{
  "title": "Validators (Beta)",
  "subtitle": "Install and manage L1 nodes on this host. Non-custodial — you keep the keys.",
  "beta": "Beta",
  "tab": {
    "nodes": "Nodes",
    "disk": "Disk",
    "stack": "Software",
    "about": "About"
  },
  "empty": {
    "title": "No validator nodes yet",
    "desc": "Create a testnet node in a few clicks."
  },
  "refresh": "Refresh",
  "software": {
    "engine": "Docker Engine",
    "engineDesc": "Validator nodes run as Compose projects. Install Docker here if it is missing. Image prune stays on the Docker page.",
    "client": "Client",
    "image": "Image",
    "present": "Local",
    "local": "Pulled",
    "missing": "Not pulled",
    "size": "Size",
    "usedBy": "Used by",
    "unused": "No instance",
    "pull": "Pull pin",
    "pulled": "On this host",
    "pulling": "Pull {{ref}}",
    "empty": "No pinned client images",
    "emptyDesc": "The catalog is empty. This should not happen.",
    "daemonDown": "Docker Engine is not running",
    "source": "Source",
    "official": "Official latest",
    "officialNewer": "Official newer",
    "stale": "Behind pin",
    "staleItem": "{{id}} ({{tag}})",
    "pin": "Panel pin",
    "openRelease": "Release notes",
    "chooseOnInstance": "Change the version on the instance page. Pulling an image does not retag a running node."
  },
  "disk": {
    "title": "Validator disk",
    "root": "Data directory",
    "free": "Free",
    "used": "Validator data",
    "fsUsed": "Filesystem used",
    "leftoverTitle": "Leftover data ({{count}})",
    "leftoverEmpty": "No leftover instance directories",
    "leftoverDesc": "Directories under the validators root that are not a store instance. Remove only after you confirm they are unused.",
    "leftoverRemove": "Remove",
    "leftoverRemoveTitle": "Delete leftover validator data?",
    "leftoverRemoveDesc": "Permanently delete {{path}} from disk. This is not a listed node.",
    "browseRoot": "Open in file browser",
    "none": "No instance data yet",
    "warn": "Disk usage is high (70%+)",
    "danger": "Disk usage is critical (85%+)",
    "autoClear": "Auto-clear the largest stopped instance when disk is critical (off by default)",
    "autoClearRisk": "Destructive: the largest stopped instance is deleted without a further prompt. Default is off. Check audit / logs after it fires.",
    "autoClearConfirmTitle": "Enable auto-clear?",
    "autoClearC1": "When disk is critical, the largest stopped instance is deleted without asking again.",
    "autoClearThreshold": "Trigger: filesystem use at or above 85%.",
    "autoClearCandidate": "Current candidate: {{id}}",
    "autoClearCandidates": "Stopped candidates (largest with data first): {{list}}",
    "autoClearNone": "No stopped instance is a candidate right now."
  },
  "chain": {
    "eth": "Ethereum",
    "avax": "Avalanche",
    "near": "NEAR",
    "ada": "Cardano",
    "btc": "Bitcoin",
    "cosmos": "Cosmos Hub",
    "sui": "Sui",
    "aptos": "Aptos",
    "dot": "Polkadot",
    "sol": "Solana"
  },
  "network": {
    "hoodi": "Hoodi",
    "sepolia": "Sepolia",
    "mainnet": "Mainnet",
    "fuji": "Fuji",
    "testnet": "Testnet",
    "preview": "Preview",
    "preprod": "Preprod",
    "westend": "Westend"
  },
  "networkKind": {
    "testnet": "Testnet",
    "mainnet": "Mainnet",
    "mixed": "Mainnet + testnet"
  },
  "profile": {
    "minimal": "Minimal",
    "pruned": "Pruned",
    "validator-ready": "Validator-ready",
    "rpc": "RPC"
  },
  "profileHelp": {
    "title": "The four profiles",
    "desc": "Wizard step 3 offers Minimal, Pruned, Validator-ready, and RPC. They differ by disk and role. The wizard shows the size for the chain you picked. The panel never holds staking keys.",
    "colName": "Profile",
    "colUse": "Use for",
    "colDisk": "Disk",
    "colStake": "Staking validator",
    "useMinimal": "Testnet or a first install. Not a full history.",
    "usePruned": "Follow the chain tip long-term. Keeps recent data only (Pruned).",
    "useValidatorReady": "Sized so you can later attest or propose. Generate keys offline yourself.",
    "useRpc": "Let this host or other services query the chain. Listens on 127.0.0.1 by default.",
    "diskMinimal": "Smallest",
    "diskPruned": "Medium (more than Minimal)",
    "diskValidatorReady": "Largest of the four",
    "diskRpc": "Depends on the chain",
    "stakeNo": "Not suitable",
    "stakeYes": "Yes — offline or misconfigured can lose stake",
    "stakeRpc": "Not a validator",
    "minimal": "Smallest disk. Use for testnets or a first install. Not a full history, and not for a live staking validator.",
    "pruned": "Keeps recent chain state and drops older blocks (Pruned). More disk than Minimal, less than a full node. Use to follow the tip long-term.",
    "validatorReady": "Reserves more disk so you can later attest or propose as a validator. Generate keys offline yourself. Being offline or misconfigured can lose stake.",
    "rpc": "For this host or other services to query the chain. RPC listens on 127.0.0.1 by default and is not published to the internet."
  },
  "col": {
    "id": "ID",
    "chain": "Chain",
    "network": "Network",
    "profile": "Profile",
    "status": "Status",
    "traffic": "Traffic",
    "disk": "Disk"
  },
  "cli": {
    "usage": "Usage: ysk-server validators list|chains|disk|get|status|checklist|logs|create|start|stop|restart|clear|upgrade|set-version|versions|policy|mithril|prune|switch-network|snapshot|compose|compose-write|rewrite-compose|software|pull|leftover-remove|stats|settings|producer-keys|producer-detach|near-account [--chain C] [--network N] [--profile P] [--el EL] [--cl CL] [--el-tag T] [--cl-tag T] [--node-tag T] [--client ID] [--tag T] [--data-path P] [--rpc-port N] [--id ID] [--path PATH] [--file PATH] [--image REF] [--upgrade POLICY] [--confirm TOKEN] [--kes-file P] [--vrf-file P] [--opcert-file P] [--accept-low-disk] [--accept-low-mem] [--accept-mainnet] [--refresh] [--execute] [--json]"
  },
  "clients": {
    "el": "Execution client",
    "cl": "Consensus client",
    "version": "Version",
    "pin": "Panel pin",
    "officialNewer": "Official newer",
    "olderThanPin": "Older than the panel pin",
    "prerelease": "Prerelease",
    "current": "Running now",
    "source": "Image source"
  },
  "mithril": {
    "label": "After the node is up, restore from a Mithril snapshot",
    "hint": "This is a one-time restore after install. It is not written into compose. You can also run it later from the instance page.",
    "action": "Restore with Mithril"
  },
  "errors": {
    "notFound": "Validator instance not found",
    "invalidId": "Invalid instance id",
    "diskLow": "Not enough free disk for this chain, network, and profile",
    "memLow": "Not enough free RAM for this chain's memory cap",
    "diskUnknownMainnet": "Cannot measure free disk; refusing mainnet create",
    "needDocker": "Docker Compose is required and was not found",
    "composeFailed": "docker compose failed",
    "containerNotUp": "Compose started, but the container did not stay running",
    "probeFailed": "The node is not answering RPC yet. Check logs on this page.",
    "oom": "Out of memory. Set a memory limit or add RAM, then restart.",
    "nofile": "The process hit the open-files (nofile) limit. Raise ulimits.nofile and restart.",
    "noContainer": "No compose container exists for this instance.",
    "restarting": "Container is restarting. Check logs on this page.",
    "restartingCount": "Container is restarting ({{n}}). Check logs on this page.",
    "needConfirm": "Clear requires confirm=instance id or CLEAR",
    "mithrilAdaOnly": "Mithril restore is only available for Cardano",
    "needMithrilConfirm": "Mithril requires confirm=instance id or MITHRIL",
    "mithrilBlocked": "Mithril docker run was blocked by the allowlist",
    "mithrilKey": "Could not load the Mithril genesis verification key",
    "mithrilFailed": "Mithril snapshot download failed",
    "pruneFailed": "Prune failed",
    "switchNeedStop": "Stop the node before switching network",
    "switchNeedClear": "Switching network clears chain data. Confirm with instance id or CLEAR",
    "composeMissing": "Compose file not found",
    "composeNotManaged": "Refusing to write a compose file that is not YSK-managed",
    "badDataPath": "Data path must be an absolute directory outside system paths",
    "portInUse": "That RPC port is already used by another validator instance",
    "badTag": "That client version is not an official tag for this image",
    "needVersionConfirm": "Changing version requires confirm=instance id",
    "needMainnetVersionAck": "Mainnet version changes require acceptMainnet",
    "snapshotUnsupported": "No allowlisted snapshot source for this chain",
    "snapshotLookup": "Could not resolve the official snapshot pointer",
    "needSnapshotConfirm": "Snapshot restore requires confirm=instance id or SNAPSHOT",
    "snapshotBlocked": "Snapshot docker run was blocked by the allowlist",
    "snapshotFailed": "Snapshot download or extract failed",
    "producerAdaOnly": "Producer keys are only for Cardano",
    "needProducerConfirm": "Attaching producer keys requires confirm=instance id or PRODUCER",
    "needMainnetProducerAck": "Mainnet producer attach requires acceptMainnet",
    "producerColdRejected": "Cold or pool-owner signing keys are refused. Keep cold keys offline.",
    "producerTooLarge": "That key file is larger than 64 KiB",
    "producerBadType": "That file is not a KES key, VRF key, or operational certificate",
    "producerEmpty": "Provide at least one of kes, vrf, or opcert",
    "switchNeedDetachProducer": "Detach producer keys before switching network",
    "nearAccountInvalid": "Pool name must be a short slug (or the full {pool}{factory} account).",
    "nearKeyMissing": "validator_key.json is missing or has no public_key. Start the node and wait for neard init."
  },
  "notes": {
    "beta": "This feature is Beta. Host changes need root and YSK_EXECUTE=1.",
    "noKeys": "YSK Server never generates or stores staking keys.",
    "dockerSoon": "Install and start from this page wizard. Host changes need root and YSK_EXECUTE=1.",
    "dryCreate": "Wrote instance spec and compose (dry-run). Pass --execute and YSK_EXECUTE=1 to start containers.",
    "dryStart": "Start is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "dryStop": "Stop is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "dryClear": "Clear is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "created": "Node created and compose started",
    "started": "Node started",
    "stopped": "Node stopped",
    "cleared": "Chain data cleared",
    "dryMithril": "Mithril restore is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "mithril": "Mithril snapshot restored; node restarted",
    "dryPrune": "Prune is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "pruned": "Unused project images pruned",
    "pruneProfile": "Client-native prune is the pruned/minimal profile. Recreate to change it.",
    "sameNetwork": "Already on that network",
    "drySwitch": "Network switch is dry-run.",
    "switched": "Network switched and chain data cleared",
    "dryCompose": "Would write compose.yml",
    "composeWrote": "Wrote compose.yml",
    "statsEmpty": "No running containers to measure",
    "autoClearNone": "No stopped instance to auto-clear",
    "drySnapshot": "Snapshot restore is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "snapshotEthEl": "Restored ethPandaOps EL archive and reset CL for checkpoint sync",
    "snapshotEthCl": "Reset CL data for official checkpoint sync",
    "snapshotNear": "Wiped NEAR data; compose will re-init official genesis and epoch sync",
    "nativePrune": "Ran the client-native prune command",
    "dryProducer": "Producer keys are dry-run. Add --execute and YSK_EXECUTE=1.",
    "dryProducerDetach": "Producer detach is dry-run. Add --execute and YSK_EXECUTE=1.",
    "producerPartial": "Wrote hot keys. Attach KES, VRF, and opcert before the node starts as a block producer.",
    "producerAttached": "Hot keys attached; compose rewritten as block producer",
    "producerDetached": "Hot keys removed; compose rewritten as relay",
    "dryDelete": "Delete is dry-run. Pass --execute and YSK_EXECUTE=1.",
    "deleted": "Node deleted",
    "leftoverRemoved": "Removed leftover {{path}}",
    "dryNearAccount": "Would set account_id to {{account}} (pass --execute). Secret is never changed.",
    "nearAccountWrote": "Set account_id to {{account}}. Secret was not changed. Restart the node if it is running."
  },
  "create": "Create node",
  "wizard": {
    "title": "Create node",
    "stepOf": "Step {{n}} / {{total}}",
    "stepChain": "Chain",
    "stepNetwork": "Network",
    "stepProfile": "Profile",
    "stepSummary": "Summary",
    "needDocker": "Docker Engine is not installed. Install it first — this button stays disabled.",
    "diskNeed": "This profile needs about {{need}} · free {{free}}",
    "diskNeedNetwork": "Default (Minimal) for this network needs about {{need}} · free {{free}}",
    "profileHint": {
      "minimal": "Smallest sync — light disk, not for staking.",
      "pruned": "Keeps recent history only (Pruned). Smaller than archive, still usable for RPC.",
      "validator-ready": "Sized for a staking validator. Needs more disk than Minimal.",
      "rpc": "Public RPC node — not a staking validator."
    },
    "diskShort": "Not enough free disk for this chain / network / profile",
    "diskShortDetail": "Need {{need}} · free {{free}} · short {{short}}",
    "memShort": "Not enough free RAM for this chain's memory cap",
    "memShortDetail": "Need {{need}} · free {{free}} · short {{short}}",
    "needCustomPath": "Enter an absolute data path",
    "previewId": "Node id",
    "previewCompose": "Compose project",
    "profileSeeAbout": "How the four profiles differ is on the About tab.",
    "back": "Back",
    "next": "Next",
    "install": "Install",
    "mainnetWarn": "Mainnet needs a lot of free disk (ETH often 800 GiB+). Testnet is recommended.",
    "mainnetAck": "Create the mainnet node. I understand it needs a lot of disk, and a staking validator can lose stake if it is offline or misconfigured.",
    "lowDiskAcked": "Free disk is below the recommended size. You confirmed create anyway; sync may stop if the disk fills.",
    "lowMemAcked": "Free RAM is below this chain's memory cap plus 1 GiB headroom. You confirmed create anyway; the node may OOM or stall.",
    "heavyWarn": "This chain is heavy (large disk and high IOPS). Mainnet Solana typically needs 2 TiB+.",
    "memory": "Memory limit",
    "cpus": "CPU limit",
    "dataPath": "Data path",
    "rpcPort": "RPC port",
    "limitNone": "No limit",
    "rpcDefault": "Default",
    "customPath": "Use a custom data path",
    "installConfirmTitle": "Install this node?",
    "installConfirmDesc": "{{chain}} · {{network}} · {{profile}}. About {{disk}} of disk. The image pull can take a long time.",
    "installC1": "Several gigabytes of images may be downloaded.",
    "installC2": "You can cancel the panel task; already-pulled images are not deleted automatically.",
    "installC3": "Mainnet uses a lot of disk. A staking validator can lose stake if it is offline or misconfigured. Type the node id to confirm.",
    "dockerAbout": "Docker Engine is required to install and start nodes.",
    "dockerAboutOk": "Docker Engine is installed.",
    "dockerAboutMissing": "Docker Engine is not installed. Open Docker to install it.",
    "rewriteCompose": "Rewrite compose",
    "rewriteComposeTitle": "Rewrite compose.yml from the current adapter?",
    "rewriteComposeDesc": "Overwrites the generated compose for {{id}} using the shipped flags for this chain.",
    "chainMeta": "{{disk}} min · {{clients}} clients"
  },
  "actions": {
    "detail": "Details",
    "start": "Start",
    "stop": "Stop",
    "restart": "Restart",
    "clear": "Clear",
    "upgrade": "Upgrade",
    "setVersion": "Change version",
    "clearConfirm": "Type instance id or CLEAR",
    "prune": "Prune",
    "switchNetwork": "Switch network",
    "removeUnit": "Also remove compose / instance record",
    "restoreAfter": "Restore snapshot after clear",
    "delete": "Delete",
    "deleteTitle": "Delete {{id}}",
    "deleteDesc": "This removes the node from the panel.",
    "deleteC1": "Docker Compose is stopped and removed",
    "deleteC2": "Chain data on disk is deleted",
    "deleteC3": "The instance record is removed",
    "pruneTitle": "Prune unused images",
    "pruneDesc": "Type the instance id to prune unused Compose images for this node.",
    "pruneC1": "Unused images labelled for this Compose project are deleted.",
    "clearTitle": "Clear {{id}}",
    "clearC1": "Chain data on disk is deleted.",
    "clearC2": "The instance stays in the panel, stopped and empty.",
    "switchTitle": "Switch network",
    "switchC1": "The node is stopped and chain data is wiped before the new network is written."
  },
  "policy": {
    "label": "Upgrade policy",
    "manual": "Manual",
    "notify": "Notify",
    "auto-safe": "Auto (safe)",
    "auto-all": "Auto (all)"
  },
  "logs": {
    "empty": "No logs yet",
    "follow": "Follow logs"
  },
  "compose": {
    "label": "Compose file",
    "save": "Save compose"
  },
  "snapshot": {
    "action": "Restore snapshot",
    "mithril": "Cardano uses Mithril for certified snapshot restore.",
    "eth": "Ethereum mainnet uses official checkpoint sync on the consensus client. EL continues snap sync.",
    "ethEl": "Hoodi/Sepolia can restore an ethPandaOps EL archive, then checkpoint-sync the CL.",
    "avax": "Avalanche uses state-sync in the compose profile.",
    "near": "Official free NEAR tarball snapshots were retired. Restore wipes data and uses official genesis plus epoch sync.",
    "none": "No snapshot source is configured for this chain."
  },
  "producer": {
    "title": "Block producer hot keys",
    "hint": "This is not an IP address. Upload the KES key, VRF key, and operational certificate from an offline machine. Keep cold keys off this host.",
    "warn": "The same node with a public P2P port will sign blocks. Official topology keeps the producer off the public internet. These three files are hot keys.",
    "kes": "KES",
    "vrf": "VRF",
    "opcert": "opcert",
    "missing": "Not attached",
    "present": "Attached {{fp}}",
    "presentShort": "On host",
    "queuedShort": "Ready",
    "queued": "Selected · {{name}}",
    "fileHint": "Typical name {{file}}",
    "dropOrBrowse": "Drop {{file}} here or browse",
    "dropping": "Drop to attach {{label}}",
    "browse": "Browse",
    "clearFile": "Remove",
    "choose": "Choose file",
    "apply": "Apply and restart as block producer",
    "detach": "Detach and run as relay",
    "applyTitle": "Attach hot keys to {{id}}?",
    "applyDesc": "KES, VRF, and opcert are written under the instance keys directory. Compose is rewritten. The container restarts as a block producer.",
    "applyC1": "Cold keys must stay offline. Do not upload cold.skey.",
    "applyC2": "The running node can sign blocks if these files are valid.",
    "applyC3": "Mainnet: an offline or misconfigured producer misses blocks.",
    "detachTitle": "Detach producer keys from {{id}}?",
    "detachDesc": "Hot keys are deleted from this host. Compose goes back to relay.",
    "detachC1": "The node will no longer produce blocks.",
    "mainnet": "Mainnet: I understand this host will hold hot keys and sign blocks."
  },
  "stake": {
    "title": "Prepare for staking (you keep the keys)",
    "offlineKeys": "Generate keys offline. The panel never stores them.",
    "deposit": "Complete deposit / registration on the official launchpad.",
    "withdrawal": "Set withdrawal credentials yourself.",
    "monitor": "Watch disk, peers, and upgrade badges on this page."
  },
  "playbook": {
    "overviewTitle": "How staking works on each chain",
    "overviewDesc": "This panel runs the node. Your wallet and keys stay with you. Official links only — never share a seed phrase here.",
    "colChain": "Chain",
    "colModel": "How you register",
    "colMin": "Typical minimum",
    "colWallet": "Your wallet",
    "colPanel": "What this panel does",
    "yskDoes": "This panel does",
    "youDo": "You do",
    "steps": "Steps",
    "never": "Do not",
    "official": "Official links",
    "seeAbout": "Full steps are on the About tab.",
    "nodeIdReady": "NodeID (from this node)",
    "nodeIdPending": "NodeID appears after the node is synced and answering RPC.",
    "blsReady": "BLS public key",
    "blsProof": "BLS proof of possession",
    "blsPending": "BLS credentials appear after the node answers RPC.",
    "copyAll": "Copy all",
    "copyNamed": "Copy {{label}}",
    "nearStakeKey": "Stake public key",
    "nearStakeKeyPending": "Appears after first start (neard init). RPC not ready does not mean the key is missing.",
    "nearAccountId": "Key file account_id",
    "nearAccountIdPending": "Often empty until you set it to {{pool}}{{suffix}} after the pool exists. The panel writes only this field — never secret_key.",
    "nearFactory": "Staking-pool factory",
    "nearPublicAddr": "Public P2P (peers)",
    "nearPublicAddrPending": "Appears after first start writes WAN:{{port}} into config.json.",
    "nearCreateCommand": "create_staking_pool command",
    "nearPointing": "The pool contract does not take this server’s IP. It stores this node’s stake public key. Peers use the Public P2P row above (host port {{port}}). RPC stays on localhost.",
    "nearAccountIdHint": "After the pool exists, set account_id here (do not edit the file by hand). The panel never writes secret_key.",
    "cosmosPubkey": "Consensus public key",
    "cosmosPubkeyPending": "Appears after gaiad init writes priv_validator_key.json. RPC not ready does not mean the key is missing.",
    "cosmosChainId": "chain-id",
    "cosmosP2p": "Public P2P (external_address)",
    "cosmosP2pPending": "Appears after first start writes tcp://WAN:{{port}} into config.toml.",
    "ethBeacon": "Beacon API (localhost)",
    "ethBeaconPending": "Beacon HTTP on this host. Point a validator client you run yourself at this URL — this compose has no VC.",
    "cosmosCreateCommand": "create-validator command",
    "cosmosCreateJson": "validator.json (gaiad v28)",
    "copyFailed": "Copy failed",
    "solIdentity": "Identity pubkey",
    "solIdentityPending": "Appears after RPC answers getIdentity. This process is --no-voting until you add a vote account yourself.",
    "adaP2pPort": "Relay P2P port",
    "adaP2pPending": "Advertise this host’s public IPv4 (or DNS) and this port in the pool registration certificate. topology.json localRoots is for your own block producer. This panel does not probe WAN.",
    "notPosTitle": "Not proof-of-stake",
    "notPosBody": "Bitcoin here is a full or pruned node. There is no staking wallet on this page.",
    "eth": {
      "model": "This compose runs execution + beacon only — not a validator client. Deposit 32 ETH on the official launchpad.",
      "min": "32 ETH + gas",
      "wallets": "MetaMask, Ledger, Trezor — only on the official launchpad",
      "panel": "Runs EL + beacon. RPC and beacon API on localhost. No validator client in compose.",
      "honesty": "This instance is execution + beacon only. There is no validator client in the compose file. Copying a keystore into the beacon data directory will not start attesting. The deposit contract does not take this server’s IP.",
      "yskDoes": [
        "Install and start the execution and beacon clients.",
        "Show disk, peers, and upgrade status.",
        "Does not run a validator client and does not load a signing keystore."
      ],
      "youDo": [
        "Create the keystore and withdrawal address yourself on the official launchpad or with staking-deposit-cli.",
        "Deposit 32 ETH on the launchpad for this network.",
        "Run a validator client yourself (not this compose) against this instance’s localhost beacon API."
      ],
      "steps": [
        "Wait until execution and beacon are synced.",
        "Open the official launchpad for this network (Hoodi or Mainnet on this page). Sepolia has no launchpad button here.",
        "Offline, generate the keystore (staking-deposit-cli). Set the withdrawal address to your own ETH wallet.",
        "Deposit 32 ETH on the launchpad (keep extra for gas).",
        "Run a validator client yourself against the beacon URL on this card (example: lighthouse vc --beacon-nodes). This compose has no VC — putting a keystore in the beacon datadir does not attest."
      ],
      "never": [
        "Never give your seed phrase or withdrawal key to anyone, including this panel.",
        "Never upload a signing keystore to a hosted cloud.",
        "Do not expect this page to attest after you copy a keystore into the beacon datadir."
      ]
    },
    "avax": {
      "model": "Register the running NodeID and BLS proof on the P-Chain from Core or Ledger.",
      "min": "2,000 AVAX + fee (1 AVAX on Fuji); at least 14 days",
      "wallets": "Core, Ledger",
      "panel": "Runs avalanchego and can show NodeID and BLS after RPC answers",
      "yskDoes": [
        "Run avalanchego and keep RPC on localhost.",
        "Show NodeID and BLS credentials once the node answers RPC."
      ],
      "youDo": [
        "Hold AVAX in Core or Ledger.",
        "Add the validator from Core using this node’s NodeID and BLS proof."
      ],
      "steps": [
        "Wait until this node is synced and the NodeID / BLS rows appear (RPC).",
        "Copy NodeID, BLS public key, and BLS proof of possession.",
        "In Core web (Staking → Validate), or with Ledger via Core, register on the P-Chain. The transaction does not take a server IP.",
        "Mainnet needs at least 2,000 AVAX, a 14-day minimum period, and a fee reserve. Fuji is 1 AVAX."
      ],
      "never": [
        "Do not send AVAX to this panel.",
        "Do not share your Core or Ledger recovery phrase."
      ]
    },
    "ada": {
      "model": "Operate a stake pool with offline cold / KES / VRF keys — not a browser wallet tap.",
      "min": "Pledge is your choice (see official docs)",
      "wallets": "Official stake-pool tooling (cold keys stay offline)",
      "panel": "Runs cardano-node as a relay first; hot keys can be attached on this page.",
      "honesty": "This instance starts as a relay. On-chain pool registration uses cold keys you keep offline. Peers and topology use this host’s public IPv4 and the P2P port shown here — the panel does not probe WAN.",
      "yskDoes": [
        "Run cardano-node and Mithril snapshot restore where offered.",
        "Attach KES, VRF, and opcert when you provide them. Cold keys are refused."
      ],
      "youDo": [
        "Generate pool keys offline.",
        "Register the pool with the official Cardano CLI. Put this host’s public IPv4 or DNS and the relay P2P port into the pool registration certificate.",
        "Attach KES, VRF, and opcert on this page. Do not upload cold keys."
      ],
      "steps": [
        "Read the official operate-a-stake-pool guide.",
        "Generate cold, KES, and VRF keys on an offline machine.",
        "Register the pool on-chain. Advertise the relay in that certificate (--pool-relay-ipv4 or DNS + the P2P port on this card). Public discovery is the certificate, not topology.json.",
        "On this instance page, attach KES, VRF, and the operational certificate. Cold keys are refused.",
        "topology.json localRoots is for your own block producer (advertise: false). This panel does not look up the WAN address."
      ],
      "never": [
        "Do not treat this as a MetaMask one-click stake.",
        "Do not store cold keys on the validator host.",
        "Do not expect editing topology.json alone to register the relay on-chain."
      ]
    },
    "near": {
      "model": "Create a staking-pool contract at the official factory. The contract stores this node’s public key — not the server IP.",
      "min": "See official validator docs (30 NEAR to create the pool, plus stake)",
      "wallets": "Official NEAR wallet / lockup",
      "panel": "Runs neard; form fills create_staking_pool; after the pool exists, writes account_id only.",
      "yskDoes": [
        "Run neard with RPC on localhost and P2P on 24567.",
        "After init, show the stake public key, public P2P address, and factory.",
        "Fill create_staking_pool from pool name + owner + public key. After the pool exists, write account_id only — never secret_key, never the transaction."
      ],
      "youDo": [
        "Start the node and wait for the public key on this page.",
        "Enter pool name and owner, then copy the command.",
        "Sign create_staking_pool from your own NEAR wallet or near-cli.",
        "Return here and set account_id. Stake from your wallet into that pool."
      ],
      "steps": [
        "Start the node and wait for neard init so the public key appears (RPC not ready is not the same as missing keys).",
        "Enter the pool short name and owner account. Copy the filled create_staking_pool command.",
        "From your wallet, call the factory (testnet pool.f863973.m0 / mainnet poolv1.near) with 30 NEAR for storage. The command uses --accountId; if your near CLI expects --account_id, follow that CLI’s --help.",
        "After the pool exists, use Set account_id on this page (confirm = instance id). Do not edit validator_key.json by hand.",
        "Restart if the node is already running. Wait until RPC answers and the node is synced before staking large amounts. Peers use Public P2P — the contract does not take an IP."
      ],
      "never": [
        "Do not paste a seed phrase into this panel.",
        "Do not put this server’s IP into the contract.",
        "Do not expect the panel to send the create_staking_pool transaction."
      ]
    },
    "cosmos": {
      "model": "create-validator from your operator wallet using this node’s consensus public key — not the server IP.",
      "min": "See official Cosmos Hub docs (self-delegation in uatom)",
      "wallets": "Keplr or another Cosmos wallet you control",
      "panel": "Runs gaiad v28; shows consensus pubkey; form fills validator.json + create-validator. Never writes priv_validator_key.json or broadcasts.",
      "honesty": "This gaiad is v28 (JSON file). Hub docs still show flags — those fail here. The transaction stores this node’s consensus public key, not the server IP. Peers use Public P2P. RPC stays on localhost. This panel does not broadcast or read priv_key.",
      "yskDoes": [
        "Run gaiad with RPC on localhost and P2P on 26656. minimum-gas-prices is 0.005uatom.",
        "After init, show the consensus public key, chain-id, and public P2P.",
        "Fill validator.json and the gaiad v28 command from amount, moniker, and --from plus the consensus pubkey. Never write priv_validator_key.json or broadcast the transaction."
      ],
      "youDo": [
        "Start the node and wait for the consensus public key on this page.",
        "Enter amount, moniker, and --from. Copy validator.json, then the gaiad command.",
        "Sign from Keplr or gaiad keys you control. Do not mix that mnemonic with the consensus key on this host."
      ],
      "steps": [
        "Start the node and wait for gaiad init so the consensus public key appears (RPC not ready is not the same as missing keys).",
        "Enter self-delegation (1atom = 1 ATOM, or uatom), moniker, and --from. Copy validator.json then the gaiad command. This node is gaiad v28: JSON file, not the Hub docs’ flag form. chain-id is cosmoshub-4 on mainnet, provider on testnet.",
        "The copied --gas-prices is 0.005uatom to match this node. Do not paste the Hub docs’ 0.0025uatom example or the flag-based create-validator.",
        "Save validator.json and broadcast from your operator wallet. The transaction does not take a server IP. Peers use tcp://WAN:{{port}}.",
        "Wait until RPC answers and the node is synced before bonding large amounts."
      ],
      "never": [
        "Do not mix the operator wallet mnemonic with the consensus key.",
        "Do not enter wallet mnemonics here.",
        "Do not put this server’s IP into create-validator.",
        "Do not paste the Hub docs’ --amount/--pubkey flags — this gaiad is v28 (validator.json).",
        "Do not use 0.0025uatom gas on this node — the compose minimum is 0.005uatom."
      ]
    },
    "sol": {
      "model": "This compose runs Agave with --no-voting. Vote account and withdrawer are created with official Solana tools — not this panel.",
      "min": "See official operations docs (hardware and disk are heavy)",
      "wallets": "Official Solana CLI / wallet you control",
      "panel": "Runs Agave as a catch-up node (--no-voting). Can show identity pubkey after RPC answers.",
      "honesty": "This process is --no-voting. It will not vote or earn stake until you create a vote account with official Agave CLI and change how the process is started. This panel does not remove --no-voting.",
      "yskDoes": [
        "Run the Agave client and warn about disk.",
        "Show the identity pubkey once RPC answers getIdentity.",
        "Does not create a vote account and does not start voting."
      ],
      "youDo": [
        "Create vote and authorized-withdrawer keys with official Solana tools on a machine you control.",
        "Create the vote account with the official CLI, using this identity pubkey.",
        "Only then run a voting validator — this compose stays --no-voting."
      ],
      "steps": [
        "Confirm this host has enough disk and IOPS (mainnet is typically 2 TiB+).",
        "Wait until RPC answers, then copy the identity pubkey shown here.",
        "Create vote and authorized-withdrawer keys with official Solana tools on a machine you control, then solana create-vote-account.",
        "This compose keeps --no-voting. Creating a vote account does not make this process vote."
      ],
      "never": [
        "Do not expect a browser wallet button in this panel.",
        "Do not paste identity or vote keypairs into this panel.",
        "Do not expect this page to start voting after you create a vote account."
      ]
    },
    "dot": {
      "model": "This compose is a full node (no --validator). Session keys and setKeys are official Polkadot.js steps — not this panel.",
      "min": "See the official wiki",
      "wallets": "Polkadot.js",
      "panel": "Runs polkadot as a full node. RPC on localhost. No --validator flag.",
      "honesty": "This process is not started with --validator. The panel does not call author_rotateKeys (that would change the keystore). Becoming a validator needs the official node flag and a rotateKeys call you make against localhost RPC.",
      "yskDoes": [
        "Run polkadot and expose RPC on localhost.",
        "Does not pass --validator and does not rotate session keys."
      ],
      "youDo": [
        "Follow the official set-up-a-validator guide.",
        "If you add --validator yourself, call rotateKeys on localhost RPC and bind the result in Polkadot.js from your stash."
      ],
      "steps": [
        "Sync this full node.",
        "Read the official validate guide. This compose is not a validator process.",
        "Do not paste the stash mnemonic here. If you later run with --validator, rotate keys yourself on http://127.0.0.1 (RPC port on this instance).",
        "In Polkadot.js, set those session keys on your stash / controller, then follow official bonding steps."
      ],
      "never": [
        "Do not paste the stash mnemonic into this panel.",
        "Do not expect this page to generate session keys or to have started --validator."
      ]
    },
    "sui": {
      "model": "This compose is a Sui fullnode (fullnode.yaml), not a validator node.",
      "min": "See official Sui docs",
      "wallets": "Official Sui operator wallet",
      "panel": "Runs sui-node as a fullnode. RPC on localhost.",
      "honesty": "This process cannot sign as a Sui validator. Validator setup uses a different config and keys. Official validator docs are linked; this panel does not switch the node to validator mode.",
      "yskDoes": [
        "Run the shipped sui-node image as a fullnode."
      ],
      "youDo": [
        "Use this instance as a fullnode.",
        "To become a validator, follow official Sui validator docs on a validator config — not this compose."
      ],
      "steps": [
        "Sync this fullnode.",
        "Treat it as a fullnode: it re-executes checkpoints but does not sign consensus.",
        "Open the official validator operator guide only if you are building a separate validator process."
      ],
      "never": [
        "Do not send SUI to this panel.",
        "Do not expect this fullnode process to register as a validator."
      ]
    },
    "aptos": {
      "model": "This compose is an Aptos public fullnode (role full_node), not a validator.",
      "min": "See official Aptos docs",
      "wallets": "Official Aptos operator wallet",
      "panel": "Runs aptos-node as a public fullnode. RPC on localhost.",
      "honesty": "Public fullnodes do not participate in consensus. A validator needs a different role, keys, and usually a validator fullnode. This panel does not switch the node to validator mode.",
      "yskDoes": [
        "Run the shipped Aptos image as a public fullnode."
      ],
      "youDo": [
        "Use this instance as a public fullnode.",
        "To run a validator, follow official Aptos validator-node docs — not this compose."
      ],
      "steps": [
        "Sync this public fullnode.",
        "Treat it as a PFN: it serves ledger data, it does not vote.",
        "Open official validator docs only if you are building a separate validator + VFN pair."
      ],
      "never": [
        "Do not enter operator keys in this panel.",
        "Do not expect this fullnode process to register as a validator."
      ]
    },
    "btc": {
      "model": "Not proof-of-stake. This is a Bitcoin full or pruned node.",
      "min": "—",
      "wallets": "Not applicable",
      "panel": "Runs bitcoind",
      "yskDoes": [
        "Run a Bitcoin full or pruned node."
      ],
      "youDo": [
        "Use any Bitcoin wallet separately. Mining and Lightning are out of scope."
      ],
      "steps": [
        "Treat this instance as a Bitcoin node only.",
        "There is no staking deposit and no validator keystore."
      ],
      "never": [
        "Do not look for a staking wallet on this page."
      ]
    },
    "nearPoolSlug": "Pool name",
    "nearPoolSlugHint": "Short name only. The factory adds {{suffix}}.",
    "nearOwner": "Owner account",
    "nearOwnerHint": "NEAR account that signs create_staking_pool in your wallet. Not the node key.",
    "nearPreview": "Command preview",
    "nearWriteAccount": "Set account_id",
    "nearWriteTitle": "Set validator_key.json account_id for {{id}}?",
    "nearWriteDesc": "Writes only account_id on the existing key file. Does not send create_staking_pool. Does not touch secret_key.",
    "nearWriteC1": "account_id becomes {{pool}}{{suffix}}",
    "nearWriteC2": "The panel never signs the factory transaction",
    "nearRestart": "Restart the node after writing",
    "nearNeedKey": "Wait until the stake public key appears (neard init), then fill this form.",
    "nearNeedSlug": "Enter a pool name to set account_id.",
    "nearNeedOwner": "Enter the owner account to fill the command. Set account_id only needs the pool name.",
    "cosmosPointing": "This gaiad is v28: copy validator.json, then create-validator validator.json. Hub docs still show flags — those fail here. The transaction uses this node’s consensus public key, not the server IP. Peers use Public P2P (host port {{port}}). Gas is 0.005uatom — not the Hub docs’ 0.0025uatom example.",
    "avaxPointing": "P-Chain registration uses this NodeID and BLS proof, not the server IP. RPC stays on localhost. Register in Core (Staking → Validate).",
    "ethVcCommand": "Validator client example (not in this compose)",
    "ethVcHint": "Run a validator client yourself against this beacon URL. Importing a keystore into the beacon data directory does not attest.",
    "cosmosAmount": "Self-delegation",
    "cosmosAmountHint": "uatom, or 1atom for 1 ATOM. A bare 1 is 1 uatom — not 1 ATOM.",
    "cosmosAmountParsed": "{{amount}} = {{atom}}",
    "cosmosMoniker": "Moniker",
    "cosmosFromKey": "--from key name",
    "cosmosFromHint": "Local gaiad key name, or sign with Keplr. Not the consensus key on this host.",
    "cosmosNeedPubkey": "Wait until the consensus public key appears (gaiad init), then fill this form.",
    "cosmosNeedFields": "Enter amount, moniker, and --from to fill the command."
  },
  "alerts": {
    "diskTitle": "Validator disk critical",
    "diskBody": "Free space on the validator data volume is critically low.",
    "upgradeTitle": "Validator upgrade available",
    "upgradeBody": "One or more node clients have a newer pinned version.",
    "syncTitle": "Validator node needs attention",
    "syncBody": "A node has been syncing for more than 6 hours or reported an error.",
    "rollbackTitle": "Validator upgrade rolled back",
    "rollbackBody": "Upgrade of {{id}} failed the health check and was rolled back."
  },
  "upgrade": {
    "changelog": "Changelog"
  },
  "readiness": {
    "dockerTitle": "Docker for validator nodes",
    "dockerOk": "{{count}} validator instance(s); Docker is installed",
    "dockerMissing": "Validator instances exist but the docker binary was not found"
  },
  "detail": {
    "status": "Status",
    "sync": "Sync",
    "peers": "Peers",
    "traffic": "Traffic",
    "version": "Version",
    "access": "Access",
    "upgrade": "Updates",
    "upgradeHint": "How this node tracks client versions.",
    "setVersion": "Change version",
    "setVersionHint": "Pick an official Docker tag for a client on this node. Compose is rewritten, then pulled and restarted.",
    "setVersionConfirmTitle": "Change {{id}} to {{tag}}?",
    "setVersionConfirmDesc": "Rewrites compose, pulls {{ref}}, and restarts the node.",
    "setVersionC1": "The running container is replaced with the selected tag.",
    "setVersionC2": "Type the instance id to confirm.",
    "setVersionMainnet": "Mainnet: a bad version can take the node offline. I understand.",
    "releaseNotes": "Release notes",
    "network": "Network",
    "networkHint": "Switching network stops the node and clears chain data. Confirm under Clear data first.",
    "maintain": "Maintenance",
    "danger": "Clear data",
    "dangerHint": "Type the instance id or CLEAR. This deletes chain data on disk.",
    "compose": "Compose",
    "logs": "Logs"
  },
  "state": {
    "unknown": "Unknown",
    "stopped": "Stopped",
    "created": "Created (never started)",
    "missing": "No container",
    "starting": "Starting",
    "rpc_wait": "Running — RPC not ready",
    "running": "Running",
    "syncing": "Syncing",
    "error": "Error"
  }
}
