v0.4.0 — logosup rebrand + everything since v0.2.2
Headline: the project moves to its own org (logosnode) and the CLI's primary command is now logosup. Both old commands (logos-node, logosnode) keep working forever as aliases. Existing operators run logos-node update once and the CLI auto-migrates the git remote and rebuilds the symlinks — zero manual steps.
This release also bundles ~13 versions of incremental work that landed between v0.2.2 (Apr 14, 2026) and now, none of which were tagged as standalone releases.
Install (new operators)
curl -sL https://raw.githubusercontent.com/logosnode/logosup/main/install.sh | bash
logosup installExisting operators
logos-node update # works exactly the same as before — and self-migratesAfter that single command:
- Git remote auto-rewrites from
shayanb/logos-node→logosnode/logosup(GitHub redirects either form, but the rewrite cleans up warnings) - Symlinks are healed:
logosupbecomes the primary command,logos-nodeandlogosnodekeep working - Config gets a one-time patch that disables runaway disk-based tracing logs (see "Disk fixes" below)
Headline features
logos-node wallet — new subcommand for transfers, balance, tx lookup
Thin HTTP client over the node's existing /wallet/* and /cryptarchia/* endpoints. All cryptography happens inside the node; no new dependencies.
logosup wallet balance # all known_keys + total
logosup wallet balance <key> # single key + per-note breakdown
logosup wallet transfer <to_pk> <amount> # auto-pick funding key, confirm, submit
logosup wallet send <to> <n> --from <key> --change <key> --yes
logosup wallet tx <tx_hash> # transaction lookupThis is the base-layer wallet built into the node. The Logos Execution Zone (LEZ) layer-2 wallet is tracked separately as a future feature.
keys backup / keys restore actually preserves keys across resets and node upgrades
Previous implementation only saved the wallet.known_keys block — public mappings without the corresponding KMS signing material. A restore-after-reset gave you an unsignable wallet.
Backup is now a small keys-only YAML containing every key-bearing path (wallet.known_keys, full kms.backend.keys with !Zk / !Ed25519 secrets, libp2p node_key, blend signing key ids, funding-pk references). Restore splices those paths into the existing config without touching anything else — cross-version safe. Operators can back up on one node version and restore onto another. Soft dep on python3 + PyYAML (pre-installed on most distros).
Honest tx-lookup messaging
After deep research traced both the wallet API hash (MantleTx::hash() = Poseidon2 over Fr from BLAKE) and the public testnet explorer's id (SHA-256 of canonical JSON, derived in logos-blockchain-block-explorer-template), and confirmed /cryptarchia/transaction/<id> was added in upstream PR #2550 (merged 3 days after v0.1.2 was cut, so the operator's v0.1.2 node returns 404 because the route literally doesn't exist), the post-transfer + wallet tx 404 messages are now precise instead of hand-waving "in-progress upstream." When the operator's node upgrades to v0.1.3+, wallet tx <hash> starts working without any CLI change.
Disk-fill fixes (two distinct causes, both seen in production)
Container log rotation (v0.2.2)
Generated docker-compose.yml now caps Docker's json-file logs:
logos-node:max-size: 50m,max-file: 5(250 MB ceiling)logos-exporter/logos-otel/logos-prometheus/logos-grafana:20m × 3(60 MB each)
Without these, an operator's pi filled with a single 60 GB json log over a few weeks.
Reset now regenerates the node compose (v0.3.2)
Previous behavior only regenerated the monitoring compose. Operators whose docker-compose.yml was generated before v0.2.2 (no logging caps) stayed on the old schema indefinitely, even after multiple resets.
Tracing module disk logs disabled (v0.3.2)
By default the upstream node tracing module writes the SAME log lines to BOTH stdout (Docker captures, capped) AND to per-hour files in the data dir, which were NOT capped. At DEBUG level this hits ~10 GB/hour. One operator's pi went from clean to full (102 GB consumed) in 17 hours.
Added patch_user_config_for_log_files in lib/docker.sh that rewrites tracing.logger.file: { directory, prefix } → file: null after init. Stdout via logos-node logs is sufficient for diagnostics. Idempotent.
Post-update auto-fix
When lib/docker.sh changes in an update, the on-disk docker-compose.yml is regenerated and the operator is offered a one-click container recreate to apply the new caps. Same hook for monitoring compose.
UX polish (cumulative across the release window)
- HTTP error messaging —
wallet balance/statusshow the actual API response inline (e.g.,error (HTTP 408): timeout) instead of a silent "unavailable". For HTTP 000 (connection refused / timeout / no response), prints(no response — connection refused, timed out, or node API not reachable)instead of an empty message. confirmfail-closed when no /dev/tty — previously fell through to the default answer when/dev/ttywasn't available (non-interactive SSH, automation pipes), silently submitting destructive operations likewallet transfer. Now pre-flight tests/dev/ttyopenability via fd 3; if missing, log a warn and return 1 (cancel).- Full 64-char addresses in
wallet balance,wallet transfersummary,statuswallet section — copy-paste from terminal works. keyssubcommand:import/exportaliases — keys silently fell into the*default (which printed keys) when the operator typedkeys import. Nowimport/exportwork as aliases forrestore/backup, and unknown subcommands print help and return 1.keys_io.pyhandles all YAML tag forms — scalar (!Zk hex), mapping (!Otlp { endpoint, host_identifier }), and sequence — so backup/restore round-trips the entire config includingtracing.metrics: !Otlpetc.- Subshell unbound-var fix in wallet helpers — early version of
wallet balanceused$(wallet_get_balance ...)which ran the helper in a subshell, soWALLET_HTTP_CODE(set as a global) didn't propagate back. Underset -uthis crashed every wallet command. Helpers now set globals; callers invoke bare and read globals. - Drift detection in
updateflow — settings.env entries that masknetwork.yml(e.g. stale bootstrap peer IDs from an older install) trigger a one-time interactive cleanup prompt. - Update flow re-exec passthrough —
cli_changed_filesis now passed through the re-exec via env var so post-update hooks (compose regen, monitoring rebuild) actually fire on a normallogos-node update. Previous behavior silently disabled all the hooks because the re-exec dropped state.
Monitoring / dashboards
- Deep Dive dashboard rewritten to align with metrics actually exported by the OTel collector on a v0.1.2 testnet node. Removed panels backed by un-emitted metrics (consensus apply latency, proposals, blend, KMS sign requests, SDP, orphans). Added:
consensus_connections, network dial failures, KMS public key requests, block download latency. New "Wall-clock vs Chain Time" section computing sync lag (time_current_slot − consensus_current_slot). - Pi cgroup memory hint — System & Containers dashboard panels for Memory now point operators at the
cgroup_enable=memory cgroup_memory=1cmdline flag when memory shows 0 B (Pi kernel default omits this). - Prometheus exporter wallet-key parsing fix — exporter was matching all 64-hex strings in
user_config.yaml(including KMS key IDs and node_key), producing 6 wallet legend entries when the operator only has 2 keys. Now navigateswallet.known_keyscorrectly. Also stops zeroing the gauge on transient API failures (was painting fake "balance dropped to zero" lines).
Upstream issues filed during this work
For transparency on the operator-side investigations:
- logos-blockchain#2622 — wallet service crash loop on initial backfill (
LIBUpdate vs LIBrace). Hit reliably on a long-running testnet; documented the cascade and operator-side symptoms. - logos-blockchain#2663 — wallet service silently never starts after enough crash-loop iterations (overwatch supervisor exhausts restart budget).
- logos-blockchain#2661 — clarification ask about which
consensus_*/blend_*/kms_*/sdp_*metrics are wired vs. declared-but-uncalled. - logos-blockchain-block-explorer-template#15 — docs ask: clarify in the README that the explorer's transaction id is SHA-256 of canonical JSON (independent from the node's
TxHash).
Files NOT renamed (intentionally)
~/.logos-node/data dir — refers to the upstream node, not our tool. Renaming would break every existing install.logos-nodeDocker container,logos-netDocker network — refer to the actual node.- Internal env vars (
LOGOS_NODE_VERSION,LOGOS_NODE_DIR,LOGOS_NODE_LIB,LOGOS_CLI_REPO, ...) — no flag day on operators'~/.logos-node/settings.env. - File names inside
lib/—cmd_*.shfilenames stay as is.
What's coming next
- Once upstream lands a fix for the wallet backfill race, base-layer wallet usage on long-running testnets becomes reliable.
- Once upstream cuts v0.1.3,
wallet tx <hash>starts working against the operator's own node. - Logos Execution Zone (LEZ) wallet integration is tracked at logosnode/logosup#9 — separate layer-2, separate binary, separate concern.
Full Changelog: v0.2.2...v0.4.0