{
  "channel": "https://toolkit.rpcnode.dev/install/TOOLKIT_VERSION",
  "feed": "https://toolkit.rpcnode.dev/install/VERSIONS.json",
  "releases": [
    {
      "version": "0.4.214",
      "date": "2026-08-20",
      "title": "Check ports: no lsof hang on a busy host",
      "notes": [
        "Second node on a host with a live fullnode (Solana): check-ports no longer runs lsof after empty ss. One timed ss -lntp snapshot. Panel timeout is not shown as Ports busy."
      ]
    },
    {
      "version": "0.4.213",
      "date": "2026-08-20",
      "title": "Check ports: no lsof hang on a busy host",
      "notes": [
        "Second node on a host with a live fullnode (Solana): check-ports no longer runs lsof after empty ss. One timed ss -lntp snapshot. Panel timeout is not shown as Ports busy."
      ]
    },
    {
      "version": "0.4.212",
      "date": "2026-08-19",
      "title": "Release 0.4.212",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.211",
      "date": "2026-08-19",
      "title": "Host & node: free space per disk",
      "notes": [
        "Each disk tab shows free / total (largest FS on that disk) plus used %. LVM OS disk maps via /sys slaves."
      ]
    },
    {
      "version": "0.4.210",
      "date": "2026-08-19",
      "title": "Release 0.4.210",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.209",
      "date": "2026-08-19",
      "title": "Host & node: per-disk IOPS tabs",
      "notes": [
        "metrics.json current.disks[] + history.disks[] — each whole physical disk has its own read/write IOPS, MB/s and %util.",
        "Host & node shows a tab per disk (All = sum IOPS / hottest %util). Solana ledger vs accounts no longer collapse into one number."
      ]
    },
    {
      "version": "0.4.208",
      "date": "2026-08-19",
      "title": "Release 0.4.208",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.207",
      "date": "2026-08-19",
      "title": "Host & node: disk IOPS / util",
      "notes": [
        "metrics.json now includes host disk_read_iops, disk_write_iops, disk_read_mb_s, disk_write_mb_s, disk_util_pct (hottest whole disk from /proc/diskstats — same signal as iostat).",
        "Host & node shows Read / Write IOPS, MB/s and %util. Node unit IOPS from cgroup io.stat when IOAccounting is on."
      ]
    },
    {
      "version": "0.4.206",
      "date": "2026-08-19",
      "title": "Remove: mask units so Restart=always cannot respawn",
      "notes": [
        "Panel remove now disable+mask+SIGTERM --kill-who=all before ACK. Restart=always / watchdog cannot bring leaf agents or the node back.",
        "TON: oneshot RemainAfterExit (ton-<env>.service) is not 'still running'. Truth is validator-engine / mytoncore. Stock validator.service is masked, not deleted."
      ]
    },
    {
      "version": "0.4.205",
      "date": "2026-08-19",
      "title": "Install: host disk insights (md / LVM / raw NVMe)",
      "notes": [
        "GET /api/v1/host/disks returns insights + unused disks: software RAID is a bottleneck, LVM / is the OS disk, raw NVMe is where node data should go.",
        "Install wizard shows that summary for every network. JBOD recommend prefers raw NVMe over md /data."
      ]
    },
    {
      "version": "0.4.204",
      "date": "2026-08-19",
      "title": "TON: catch-up stalled when oos does not drop",
      "networks": [
        "ton"
      ],
      "notes": [
        "seqno>0 + ~27h behind + 0.1% is not 'won't start' — validator is up.",
        "If local seqno rises but out_of_sync_sec grows: catch-up slower than tip (serializer / I/O). UI says that, not 0.1% lag closed."
      ]
    },
    {
      "version": "0.4.203",
      "date": "2026-08-19",
      "title": "Release 0.4.203",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.202",
      "date": "2026-08-19",
      "title": "Release 0.4.202",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.201",
      "date": "2026-08-19",
      "title": "Solana: reuse Agave binary, do not rebuild the workspace",
      "networks": [
        "solana"
      ],
      "notes": [
        "Install looks for agave-validator in /opt/solana/<env>/bin and /var/tmp/rpcnode-agave-src-*/{bin,target/release} and copies it if cargo already produced the file.",
        "Source build is cargo build --release --bin agave-validator only. cargo-install-all.sh is not used (it compiles the whole workspace: reqwest, rustls, …).",
        "Retry does not rm -rf an existing clone.",
        "Identity uses /opt/solana/<env>/bin/solana-keygen (was empty optPath → keygen not found after a successful cargo build)."
      ]
    },
    {
      "version": "0.4.200",
      "date": "2026-08-19",
      "title": "Release 0.4.200",
      "notes": [
        "Shipped via update-remote-agent.sh --publish."
      ]
    },
    {
      "version": "0.4.199",
      "date": "2026-08-19",
      "title": "Client download URLs in host audit log",
      "networks": [
        "solana"
      ],
      "notes": [
        "Install writes every catalog/artifact URL to /var/log/rpcnode.log (action download + provision): manifest, /clients/→/install/clients/ rewrite, GET ok/FAIL.",
        "Every hostLog line includes the agent version: [api-agent 0.4.199]. Solana Agave from CDN /install/clients/… (GitHub fallback). 0.4.198 on the host had no these lines.",
        "agent.sh banner + already-installed menu show installed vs CDN channel version immediately."
      ]
    },
    {
      "version": "0.4.197",
      "date": "2026-08-19",
      "title": "XRPL first-ledger recycle + TON dump apply",
      "networks": [
        "xrpl",
        "ton"
      ],
      "notes": [
        "XRPL 0.4.196 skipped NuDB wipe while peers/proposers>0, but PrepareDatadirHeal still stopped xrpld every collect tick (default 2s). Skip stop/wipe while .first-ledger-wait is younger than 12 min. Stop xrpld only when NuDB will actually rotate.",
        "TON: dump-end systemctl restart sets NRestarts=1 — that is not a crash loop (was forcing sticky 1G cache).",
        "TON getstats seqno is masterchainblock (-1,wc,SEQ), not masterchainblocknumber. Prefer getstats over MyTonCtrl so the panel does not freeze at seqno=0 / dump 99% during catch-up."
      ]
    },
    {
      "version": "0.4.196",
      "date": "2026-08-19",
      "title": "XRPL canonical UNL — first validated ledger",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "Stock validators-example.txt ships [validator_list_threshold] 0 → xrpld exits 255 (Invalid publisher key: 0).",
        "Install and heal write canonical UNL (vl.ripple.com + unl.xrplf.org). Agent does not wipe NuDB while peers/proposers>0 waiting for validated_ledger."
      ]
    },
    {
      "version": "0.4.191",
      "date": "2026-08-19",
      "title": "Client update steps in host audit log",
      "notes": [
        "Apply wrote only UI state «starting client update» — /var/log/rpcnode.log stayed empty.",
        "Each step now hostLog: accepted, catalog, RPC sleep, soft-stop, install, start, done/error. Same for Restart / Stop."
      ]
    },
    {
      "version": "0.4.190",
      "date": "2026-08-19",
      "title": "Soft-stop fullnode from the node page",
      "panel": "0.1.33",
      "notes": [
        "Stop next to Restart: same graceful stop (CLI / ExecStop / SIGTERM), unit stays down until Restart.",
        "Public Go RPC sleeps (503) while stopped. Chain data is not wiped."
      ]
    },
    {
      "version": "0.4.188",
      "date": "2026-08-19",
      "title": "Client update apply for all catalog networks",
      "networks": [
        "tron",
        "bsc",
        "bitcoin",
        "ethereum"
      ],
      "notes": [
        "Check already worked everywhere; Apply was hard-coded to TRON (and briefly BSC).",
        "Apply is now the same pipeline on every leaf: soft-stop (CLI/RPC then systemctl), download the catalog artifact (jar / bin / tarball), start the same units.",
        "Apt / docker_extract / empty artifact_url stay an honest error — there is nothing to replace."
      ]
    },
    {
      "version": "0.4.187",
      "date": "2026-08-18",
      "title": "TON getVersion + install CDN host",
      "panel": "0.1.32",
      "networks": [
        "ton"
      ],
      "notes": [
        "Admin/node version check was status=unsupported — toncenter HTTP API has no version method.",
        "Public Go RPC now answers version / getVersion / getNodeVersion with the same client_version as the panel (validator-engine --version).",
        "Bare POST / is rewritten to /api/v2/jsonRPC so the public base URL works as a TON JSON-RPC endpoint.",
        "Update no longer fetches rpcnode.dev/install (404). Channel is toolkit.rpcnode.dev; old env/unit URLs are rewritten."
      ]
    },
    {
      "version": "0.4.186",
      "date": "2026-08-18",
      "title": "TON dump apply — stop killing validator at 99%",
      "networks": [
        "ton"
      ],
      "notes": [
        "After a MyTonCtrl dump, seqno stayed 0 and the bar sat at 99% «applying state» for a day (testnet and mainnet).",
        "MyTonCtrl rewrites validator ExecStart; heal no longer SIGKILL-recycles while apply is running.",
        "After OOM or a restart, celldb cache is capped to 1G and MemoryMax=85%.",
        "Sync shows restart / apply OOM instead of a fake «applying» line."
      ]
    },
    {
      "version": "0.4.184",
      "date": "2026-08-18",
      "panel": "0.1.31",
      "title": "Cardano Mithril snapshot + XRPL history picker",
      "networks": [
        "cardano",
        "xrpl"
      ],
      "notes": [
        "Cardano Snapshot step downloads official Mithril latest (include-ancillary), mithril-client 2630.0.",
        "Honest snapshot % from N/7 files and MiB in the log.",
        "XRPL install picker: stock / 1 day / 2 weeks / full history (default weeks)."
      ]
    },
    {
      "version": "0.4.183",
      "date": "2026-08-18",
      "panel": "0.1.30",
      "title": "TRON mainnet snapshot flavors",
      "networks": [
        "tron"
      ],
      "notes": [
        "Install picker: standard / internal_tx / balance_history — matching official LevelDB mirrors and HOCON.",
        "Choice is persisted on the panel and on the host; re-add from awaiting_ports clears it."
      ]
    },
    {
      "version": "0.4.179",
      "date": "2026-08-17",
      "title": "XRPL provision compile",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "ensureXRPLDInstalled takes the environment so panel Docker builds again."
      ]
    },
    {
      "version": "0.4.178",
      "date": "2026-08-17",
      "title": "XRPL client pin 3.3.0",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "catalog.json pins xrpld 3.3.0. Empty version + unpinned apt was installing 3.2.0."
      ]
    },
    {
      "version": "0.4.177",
      "date": "2026-08-17",
      "title": "XRPL first ledger + hub peers",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "seq=0 with overlay flap and 0–2 peers now pins official hubs in ips_fixed.",
        "LoadManager stall recycles at medium node size."
      ]
    },
    {
      "version": "0.4.176",
      "date": "2026-08-17",
      "title": "XRPL dead server_stop is not a start fault",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "no response from server / ExecMainCode=1 during ExecStop on a dead xrpld is ignored; the unit is started."
      ]
    },
    {
      "version": "0.4.174",
      "date": "2026-08-17",
      "panel": "0.1.28",
      "title": "TON OOM after dump is not Synced",
      "networks": [
        "ton"
      ],
      "notes": [
        "seqno=0 after dump is apply/OOM, not tip — no 99.9% / 0.1% lag-closed bounce.",
        "Cap --celldb-cache-size from RAM; strip preload-all / in-memory / fast-state-serializer."
      ]
    },
    {
      "version": "0.4.163",
      "date": "2026-08-17",
      "panel": "0.1.25",
      "title": "Ethereum tip after sync",
      "networks": [
        "ethereum"
      ],
      "notes": [
        "Public tip shows blocks / headers after sync. eth_syncing=false has no highestBlock."
      ]
    },
    {
      "version": "0.4.155",
      "date": "2026-08-16",
      "title": "XRPL history peers",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "peers_max=100, official hubs, ips_fixed s2.ripple.com. Heal on start.",
        "No official snapshot — full history is still a long peer backfill."
      ]
    },
    {
      "version": "0.4.154",
      "date": "2026-08-16",
      "panel": "0.1.18",
      "title": "Synced means tip and history proof",
      "networks": [
        "xrpl",
        "stellar",
        "bitcoin",
        "doge",
        "ltc",
        "dash",
        "bch",
        "zcash"
      ],
      "notes": [
        "Live tip alone is not Synced. XRPL complete_ledgers, Stellar oldestLedger, Bitcoin-family not pruned.",
        "UI and panel require verification_pct ≥ 99.9."
      ]
    },
    {
      "version": "0.4.153",
      "date": "2026-08-16",
      "title": "XRPL false Synced",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "server_state=full on a short complete_ledgers window is live tip, not history.",
        "Synced only when complete_ledgers reaches genesis (32570) and the tip."
      ]
    },
    {
      "version": "0.4.152",
      "date": "2026-08-16",
      "panel": "0.1.17",
      "title": "XRPL Sync bar from complete_ledgers",
      "networks": [
        "xrpl"
      ],
      "notes": [
        "verification_pct from complete_ledgers high / tip. No official tarball (~39 TiB via peers)."
      ]
    },
    {
      "version": "0.4.149",
      "date": "2026-08-16",
      "panel": "0.1.16",
      "title": "Port holder + Kill",
      "notes": [
        "Check ports shows the program holding a catalog port. Kill (with confirm) goes through the tip agent."
      ]
    },
    {
      "version": "0.4.137",
      "date": "2026-08-16",
      "panel": "0.1.14",
      "title": "Check ports does not parse ufw",
      "notes": [
        "Reach is a panel dial to the Server public IP. The agent never runs ufw allow / deny."
      ]
    },
    {
      "version": "0.4.136",
      "date": "2026-08-16",
      "panel": "0.1.13",
      "title": "Outbound reach on public / agent / p2p",
      "notes": [
        "Check ports: panel dials the Server public IP while the tip holds a nonce listener. reach = reachable or filtered."
      ]
    },
    {
      "version": "0.4.117",
      "date": "2026-08-15",
      "title": "Host audit log",
      "notes": [
        "/var/log/rpcnode.log is discrete hostLog ops only (update, provision, start, snapshot, errors). Agent stdout stays per-unit."
      ]
    },
    {
      "version": "0.4.116",
      "date": "2026-08-15",
      "title": "TRON Java 8",
      "networks": [
        "tron"
      ],
      "notes": [
        "ensureJava8 checks java -version. Missing or wrong Java → apt openjdk-8-jre-headless, else Temurin 8.",
        "Unit ExecStart is pinned to Java 8 so a host default of 17 does not crash GreatVoyage."
      ]
    },
    {
      "version": "0.4.115",
      "date": "2026-08-13",
      "title": "Sepolia L1 RPC for Orbit / OP-stack",
      "networks": [
        "ethereum",
        "robinhood",
        "optimism",
        "base",
        "arb"
      ],
      "notes": [
        "Parent-chain default is publicnode ethereum-sepolia. Mainnet L1 stays on the host ethereum port.",
        "Override with RPCNODE_L1_RPC_URL."
      ]
    },
    {
      "version": "0.4.112",
      "date": "2026-08-13",
      "title": "Optimism sepolia + Bitcoin Core 28.1",
      "networks": [
        "optimism",
        "bitcoin"
      ],
      "notes": [
        "Optimism sepolia provision (was a mainnet-only stub). Bitcoin Core default 28.1 for testnet4."
      ]
    },
    {
      "version": "0.4.111",
      "date": "2026-08-13",
      "title": "Base sepolia JWT, BSC cache, Arb sepolia",
      "networks": [
        "base",
        "bsc",
        "arb"
      ],
      "notes": [
        "Write JWT before waiting on authrpc. Sepolia parent-chain uses sepolia L1.",
        "BSC --cache capped to ~25% RAM. Arb sepolia provision added."
      ]
    },
    {
      "version": "0.4.110",
      "date": "2026-08-13",
      "title": "Host OS deps on provision and start",
      "notes": [
        "The agent apt-installs what the network needs. TRON Java 8 is no longer a manual SSH step."
      ]
    }
  ]
}
