github selfcustody/krux v26.08.0
Version 26.08.0

4 hours ago

This release tightens what the PSBT screens will show and sign, adds a vertical layout option for Stackbit 1248 backups, and replaces the pure-Python UR stack with the new uUR C module, so QR decoding is faster and uses less RAM. The Maix Bit, discontinued back in 25.09.0, has now been fully removed from the source tree.

Changes

Security Fixes

  • Camera entropy: fix a heap buffer overflow in the Shannon entropy module. Only the Maix Bit could trigger it, a device discontinued in 25.09.0 with no known users; every other device feeds the module a frame that fits. The module copied the whole frame into a fixed 320x240 RGB565 (153,600 byte) scratch buffer, so the Maix Bit's larger CIF frames (352x288 RGB565, 202,752 bytes) wrote 49,152 bytes past the end. The scratch copy has been removed entirely, the read length is now capped and rounded to whole pixels, and the CIF path is gone along with the Maix Bit (thanks @musdom)
  • PSBT: stricter checks on the calculation of fee shown on screen (thanks @0xaudron)
  • PSBT: warn before signing when the wallet coordinator did not send enough data to confirm those amounts (thanks @0xaudron)

Removed Maix Bit Code

All Maix Bit support has been removed from the source tree, including its firmware build project. Support for the device was discontinued in 25.09.0, which at the time kept the build parameters available; those are now gone too. The OV5642 sensor handling, used only by that device, was removed along with it.

Stackbit 1248 Vertical Layout

Added vertical layout option for Stackbit 1248 backup display, allowing users to choose between Standard (horizontal) and Vertical (transposed) grid orientations.

Migrate UR encoding to uUR C module

Switch from the pure-Python urtypes and foundation-ur-py packages to the new uUR C module, allowing faster UR QR code decoding with a smaller RAM footprint. Tests and the simulator now build the same module for CPython instead of shimming the pure-Python packages, so host and device run identical UR code.

Other Bug Fixes and Improvements

  • Remove the unused os.urandom() from the MaixPy firmware. It was never called by Krux and played no part in generating keys or mnemonics, which draw entropy from the camera or dice. It was backed by a deterministic PRNG, so it has been removed to keep it from being mistaken for a secure source later
  • Fix display of negative amounts
  • Improve scan TinySeed and other binary visibility by drawing punches only
  • Added flash_success method to standardize green success flashes across confirmation screens
  • Update Embit to latest - fff7ffa
  • Replace custom quirc (library to decode QR codes from images) with k_quirc
  • Fix default theme contrast failures for Light, CypherPink, network
    indicators, and Amigo info panels
  • Simplify generated-mnemonic confirmation with Continue and grouped
    Wallet Options
  • Stored mnemonics: a corrupt seeds.json is now reported and kept intact
    instead of being overwritten when storing a new mnemonic
  • Reject Base58 addresses whose version byte matches no network, previously
    accepted as valid when verifying an address
  • Settings: malformed settings.json content is handled without errors, and
    reading a setting no longer writes back to storage
  • Hide the QR code title in line and region view modes, where it overlapped
    the part index

Krux Installer is going internet-less.

From v0.0.23, the installer no longer downloads anything while you flash. The firmware for every supported device is downloaded, checksum-verified, signature-verified and embedded on CI at build time. The installer you get already contains the binaries.
Why: fewer moving parts between you and your device. No runtime HTTP stack, no third-party PyPI packages pulled into the install path, no dependency on the network behaving correctly on the day you flash. Download and verification now use tools that come with your OS (curl, sha256sum/shasum, openssl) instead of extra libraries we'd have to trust.
And you can check our work: CI logs publish the hashes of every embedded .kfpkg, so if you build Krux firmware yourself you can compare your hash against ours. Ships alongside Krux firmware v26.08.0.

Special Thanks

Thank you to those who contributed to this release, including
@tadeubas, @jdlcdl, @qlrd, @joaozinhom, @kkdao, @bitcoisas, @Naman015, @SatsCzar, @0xaudron and @musdom

A Note From @odudex

Difficult times require strategic decisions. Security sensitive applications demand intensive maintenance at every layer, from toolchain to UI. Krux hardware has reached the natural end of its life cycle: K210 chips are no longer produced, and last year Canaan, their manufacturer, dropped the Kendryte line entirely, including the K210 successors.

I have been maintaining too many repositories, and I will have to prioritize the ones I consider more future proof and more relevant to the Bitcoin community in the long term. Krux was not created by me: Jeff started it and passed it on to me, and now it is my turn to pass the torch.

Krux may be carried on by another maintainer, if a proof-of-work backed Krux contributor accepts the role. In that case a smooth handover will be executed.

Otherwise the Krux project will be put in sunset mode and gracefully archived in a few months.

Meanwhile, as a community, let's walk through this process together, aiming for the best in DIY self custody.

Ideas Must Go On

Krux has a vibrant community of users and contributors, many of whom are building important innovations on top of it: @qlrd's testing and code quality tools, @joaozinhom's efficient, secure, fully self-contained flasher, @tadeubas' apps infrastructure, @notTanveer's Silent Payments implementation, @Naman015's UI studies. This work, and the ideas behind it, will not just survive: they will spread to other projects, carrying the Krux spirit and ethos with them. And we will do that together, as a community.

Don't miss a new krux release

NewReleases is sending notifications on new releases.