A transaction signed inside NØNOS settled on Ethereum mainnet:
0xf0b9795ac22a4c4a99d07a340c445dc0eafd1070b215b94c1eb99acd72344740
10,000 NOX, transfer(address,uint256), EIP-1559 type 2, nonce 2, block 25703560, status success, 51,636 gas.
What makes it worth writing about is not that a transfer happened. It is where the signing happened. The wallet holds no signing library. It builds the RLP, the typed envelope and the keccak preimage itself, and signs with secp256k1 inside an ownership gated capsule that never releases the key. The only thing that crossed the network was the finished raw transaction.
You do not have to take our word for any of that. Pull the transaction from any Ethereum node and decode it. The calldata is 68 bytes, the selector is 0xa9059cbb, and the amount is 0x21e19e0c9bab2400000, which is ten thousand tokens at eighteen decimals. The receipt reports 0x1 and 0xc9b4 of gas. Every figure in the paragraph above is in those two objects.
What this does not prove
Nothing on chain identifies NØNOS as the origin. The calldata is a standard ERC-20 transfer with no marker in it, so the transaction proves a correct signature was produced, not where it was produced.
A signature bound to the capsule attestation root would prove origin, and it would cost no gas to include. It is not in this release. We would rather say that here than let the headline imply something it does not support.
The rest of 0.9.1
Wi-Fi works on real hardware
Wi-Fi works on real hardware. Two faults, both fixed. The station address is drawn rather than taken from the chip, so a machine does not announce one permanent identifier to every access point it passes. That draw needs the crypto capability, and neither the Wi-Fi nor the ethernet driver had been granted it, so it failed closed and the radio was never configured. Ethernet was broken the same way and is fixed with it. Separately, the efuse read could not tell a dead register window from a blank one, and the board description it returned selected a radio front-end the hardware does not have. An unreadable read is now refused rather than acted on.
Privacy routing through Nym. The browser routes through the mixnet with real Sphinx packets and real mix nodes, on physical hardware as well as under emulation. A boot log from this build shows gateway frames pushed, fragments acknowledged by the far end, and SOCKS5 answering through the exit. Browsing also works with it switched off, so the release does not depend on it.
Staking reads live chain state. A boot of this image showed APR 14.12 percent, rewards paid 8,224,428.52 and total staked 198,202,867.43, read through one batched eth_call over the in-kernel TLS 1.3 stack.
Unstaking no longer does the wrong thing. The Unstake tab used to sign a stake. The button painted one action and ran another. It now selects a position and calls unstakePosition(uint256), which is what the contract actually offers.
Typing an amount is possible. The digits 1 to 7 were being swallowed as view shortcuts before any field saw them, so typing 3000 on the Send screen jumped to another view and entered 000 there. Only 0, 8 and 9 ever reached a field. The same shadowing broke address entry, because b and d are both hex digits and shortcuts.
It refuses before it signs. An amount above the balance, or a balance that has not loaded, is now refused with the reason. The wallet previously signed and paid gas for transactions that could only revert.
Responsive grids render. repeat(auto-fill, minmax(...)), the form every card grid is written in, collapsed to one full width column because the repetition count was parsed as a number and the keyword is not one.
Verification grew. Browser engine proofs went from 49 to 58 and now compile the real engine with real font metrics rather than a subset. Wallet proofs went from 15 to 32, including the constant product properties a trader is owed: the pool cannot be drained, the invariant never falls, a larger trade never gets a better rate, and a figure that cannot be computed is refused rather than shown as zero.
Known limits
- The staking screen has not been driven end to end by a human. It compiles,
attests, boots and reads live chain state, but nobody has typed an amount and signed a stake through the interface.
- Transaction history holds one entry. The proof screen shows the most recent
transaction only.
- ZeroState Pass images are not fetched. The count and the boost are shown.
- The type scale and layout system reach the NOX and home screens. Send, Receive
and Proof still carry their own coordinates.
Artefact hashes
Built 2026-08-07 17:32. The kernel is signed Ed25519 and ML-DSA-65, and every capsule is signed and STARK attested. Any rebuild changes these.
EFI/nonos/kernel.bin 102,978,867 bytes
SHA-256 0c19df6ebed445c6447c94ac4b8a5cab19d92cd275e1f93e02b26cf9e632d0ff
BLAKE3 e2b088340d3b7fad5e33cbe9bdeb8041149b289ad81d7a8cc5fe1e79c40bb93f
EFI/Boot/BOOTX64.EFI 14,220,288 bytes
SHA-256 4102a892dabdc5aa61ae341113c1861f616f98a9fc2e3f786fdc0415e07ef721
BLAKE3 df153f2a8766a29a380739cb34bc6b14088508844ee54c25d4f4998fdda069f9
This is a source build, not a packaged image. The downloadable beta on the download page is still v0.9 with its own published checksums.
Building it yourself
Verified on macOS. The toolchain is pinned, and a different nightly will not reproduce the hashes.
git clone https://github.com/NON-OS/nonos-micro-kernel
cd nonos-micro-kernel
git checkout browser-engine
git submodule update --init --recursive
make nonos-mk-zerostate
make nonos-mk-esp
Roughly five minutes, most of it signing and STARK attesting the capsules. It ends with ESP ready at target/esp.
Do not edit the tree while it runs. The manifest signs source as it was read, and an edit mid build produces ManifestRejected at boot.
Check your build against the hashes above:
shasum -a 256 target/esp/EFI/nonos/kernel.bin target/esp/EFI/Boot/BOOTX64.EFI
b3sum target/esp/EFI/nonos/kernel.bin target/esp/EFI/Boot/BOOTX64.EFI
Booting it is covered in the run guides for QEMU and VirtualBox. This release boots 59 capsules with zero faults.
The code is five commits on browser-engine, pull request 437.