Skip to content

WolfStack v25.9.5

Choose a tag to compare

@github-actions github-actions released this 03 Aug 13:13
· 391 commits to master since this release

v25.9.5: the sidebar can no longer freeze on 'Loading…' when /api/nodes stalls

wolfstack-1 (2026-08-03) sat on a half-drawn dashboard — sidebar stuck on
'Loading…', licence banner fallen back to the free/PRICING default — for
a few minutes and only recovered when it happened to answer. Root cause:
fetchNodes() did a bare 'await fetch(/api/nodes)' with NO timeout. A
server that accepts the connection but never replies (the node's cluster
aggregation stalling while state settled) makes that await neither
resolve nor reject, so the try/catch cannot fire. The 5s stuck-load
watchdog then stacked another hung request every tick, none completing,
and the sidebar stayed frozen until the endpoint unwedged itself.

Not a session-expiry case, so the v25.8.3 'expired session -> login'
redirect correctly did not fire — the session was valid, the node was
just slow.

Fix:

  • A 12s AbortController timeout on the fetch, so a stalled endpoint
    ABORTS and the catch runs instead of hanging forever.
  • An _fetchNodesInFlight guard so the three pollers (initial load, the
    5s watchdog, the 15/60s poll) can never stack concurrent hung
    requests behind one stall — one in-flight fetch at a time.
  • Before the first successful paint, a failed/aborted fetch swaps the
    frozen 'Loading…' for a self-updating 'Reconnecting to node…' (or
    'Node is slow to respond — reconnecting…' on a timeout) so the UI
    reads as alive-and-retrying, not hung. buildServerTree() overwrites
    it the moment a fetch succeeds; a rendered tree is never stomped on
    a transient blip.

No JS test harness exists in this project (web assets are edited
directly, no build step), so this is verified by parse-check + review;
the reconnect path will be confirmed live on the next node stall.

Co-Authored-By: CodeWolf paul@wolf.uk.com
Co-Authored-By: Wolf Software Systems Ltd paul@wolf.uk.com


Verifying this release

Each binary is signed via cosign keyless OIDC (no key distribution — signing identity is the GitHub Actions workflow itself, anchored to the Sigstore Fulcio CA and the Rekor transparency log) and ships with a SLSA build provenance attestation.

Verify the cosign signature:

cosign verify-blob \
  --bundle wolfstack-x86_64.cosign.bundle \
  --certificate-identity-regexp 'https://github.com/wolfsoftwaresystemsltd/WolfStack/\.github/workflows/release\.yml@.*' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  wolfstack-x86_64

Verify the build provenance:

gh attestation verify wolfstack-x86_64 --repo wolfsoftwaresystemsltd/WolfStack

Verify the SHA-256 checksum:

sha256sum -c SHA256SUMS

Artifacts

  • wolfstack-x86_64 / wolfstack-aarch64 / wolfstack-armv7 — static musl binaries (Linux x86_64, ARM64 / Raspberry Pi 4+, and 32-bit ARM).
  • wolfstack-<arch>.cosign.bundle — cosign signature bundle (cert + signature + Rekor entry).
  • SHA256SUMS — checksums for both binaries.

For per-version history see CHANGELOG.md.