v0.8.5
Which download do I need?
Two of them, and you only ever need one.
| I want to… | Download |
|---|---|
| Run a node or validator (server, headless, no desktop) | helix-cli-… for your platform — unpack it and run helix start. No installer, no dependencies. |
| Use the wallet on my desktop (send, stake, explorer, run a node from the UI) | helix-gui-… for your platform. The wallet already contains the node — you do not need the CLI as well. |
Which wallet installer?
- Linux —
.AppImageruns anywhere without installing (make it executable and start it) ·.debfor Debian/Ubuntu ·.rpmfor Fedora/RHEL - macOS —
.dmg(Apple Silicon) - Windows —
.exeis the normal installer ·.msiis for managed/automated rollout
Running a validator?
Start the node first, confirm peer_count is above zero, and only then send the stake
transaction — see the founding-validator checklist in the
README. The wait itself is safe (a validator
serving its one-epoch activation delay is no longer charged with missed blocks), but a node
that isn't connected can't vote once it is activated.
Your node was being killed for running out of memory?
That was us, not your machine. The embedded database applied its library's default page cache
of 1 GiB, which we never overrode, so a node holding the chain settled at over 1.5 GB
resident — and a full sync on a small server ran out of room and aborted. This release caps it:
a complete sync of the live chain now peaks around 280 MB and stays there, with no loss of
sync speed. HELIX_DB_CACHE_MB raises it again on machines with memory to spare.
Your node cannot catch up, or reports "does not chain from the previous block"?
Its stored chain has diverged from the network's and cannot be repaired in place — it has to
re-sync from scratch. In the wallet: Node → Reset chain data (it renames the old data, it
does not delete it). Headless: stop the node and rename helix-data.redb aside. Your keys and
your stake are untouched by this; only the block history is re-fetched.
Validator operators: this release changes consensus
All operators must update together. A node no longer counts a silent validator out of its
own quorum — that was a local decision each node made for itself, so two nodes could disagree
about it, each finalize a different block at the same height, and split the chain. They did.
The consequence is deliberate and worth stating plainly: a validator set that has lost more
than a third of its voting power now halts until the missing validators return, instead of
producing blocks without them. That is what BFT means, and tolerating one absence takes four
validators, not two. A halt is visible and heals by itself; a fork silently duplicates the
history and every balance in it.
A stalled node now also names the validator it is waiting for, once per round, in its log.
What's in v0.8.5
the chain can no longer fork itself, and the node fits in memory
Update together with the other operators. This changes consensus.
A validator that had been silent for twenty rounds had its voting power zeroed
— in each node's private copy of the validator set. That lowered that node's
quorum threshold until it could finalize alone, which kept blocks flowing
through an outage. It also meant two nodes could each decide the other was
gone, each finalize a different block at the same height, and split the chain.
On 2026-07-22 they did, at height 66918.
The mechanism was unsound however it was tuned, not merely mistuned: if the
available voting power already meets the real quorum, excluding anyone changes
nothing, so the exclusion is only ever load-bearing when the node is about to
commit a block that less than two thirds of the staked power stands behind.
It is gone. A set that has lost more than a third of its power now halts until
the missing validators return — that is what BFT means, and tolerating one
absence takes four validators, not two. A halt is visible and recoverable; a
fork silently duplicates the history and every balance in it.
A stalled node now names the validator it is waiting for, once per round. It
used to log nothing at all while stalled.
The embedded database applied its library's default page cache of 1 GiB, which
we never overrode. A node holding the chain settled above 1.5 GB resident, and
a full sync on a small server ran out of memory and aborted — one operator's
node died with a failed 16 kB allocation.
Measured against the live chain, same binary, only the cache size differing: a
complete 71,000-block sync now peaks at 280 MB and stays there, against 469 MB
mid-sync and 1.53 GB at rest. Sync speed did not regress. HELIX_DB_CACHE_MB
raises it again where the memory is available.
- A node that lost its last peer never dialed the seeds again, so a single
dropped connection was permanent until someone restarted it by hand. The
peer-exchange tick now redials while nothing is connected. - A validator excluded for silence could never be let back in, because zeroing
its power ended the very round timeouts that would have cleared the strike. - Precommits already collected for a block now survive that block arriving
already finalized, instead of being discarded with the round. /blocks/height/:nnow carrieslast_commit, the block's finality proof. A
light client could not verify anything without it.- The explorer footer links the project's Chainquiry listing. The logo is
served by the node itself, like everything else on that page.
Full Changelog: v0.8.4...v0.8.5