A standalone NOID paper wallet generator built with the original address derivation from the Parano1c / Parano1d source tree.
Live generator: https://paper.noidscan.com/
Project information: https://android.noidscan.com/paper-wallet.html
- Start: generate a fresh 32-byte Master Key on your device using
crypto.getRandomValues. - Save and print: download a vector A4 landscape PDF or print the wallet. The paper includes the full receiving address, the full 64-character hexadecimal Master Key and two working QR codes.
- Clear and finish: confirm that a readable backup exists, remove the preview and end the generator session.
The public address uses index 0. The public QR contains the address as plain text. The private QR contains the Master Key as plain text, compatible with Master Key restore in the existing web wallet.
Key generation, address derivation, QR encoding and PDF creation run locally. The generator does not save keys to cookies, localStorage, sessionStorage, IndexedDB, Cache Storage, logs, URL parameters or a server. The key exists in page memory while you view the wallet and is included in a file only when you request a download or printout.
The generation worker terminates immediately after producing the wallet. Clear & finish drops application references, removes the key-bearing preview and revokes pending download object URLs. This does not guarantee forensic erasure of browser memory. It also does not remove downloaded PDFs, screenshots or printer records. Keep printed and digital copies private.
There are no remote fonts, analytics, CDN scripts or node API calls. After loading the page and waiting for the engine to report ready, generation and PDF creation work offline.
The tested browser engine is included. No Rust compilation, node or backend is needed to run the generator:
python3 serve.pyOpen the printed localhost URL. Use HTTPS for public hosting. Serve only website/paper/, with WASM served as application/wasm. The Python server is for local development.
The repository includes noid_web_wallet and all six of its local crate dependencies: noid_core, noid_fri, noid_fri_binius, noid_gkr, noid_poseidon2b and noid_tx. These crates are copied from the existing Parano1c workspace. Their source files are unchanged; SOURCE-SHA256SUMS records their hashes. The root workspace membership is reduced to the required crates. Cargo.lock retains their original pinned dependency graph.
Upstream project: https://github.com/ignotusnemo/parano1d
Parano1c project: https://github.com/Aquacongas/Parano1c
This is an independent community project. No node consensus or address derivation changes are introduced by this generator. The compiled engine includes existing wallet operations, but the generator calls only initialization and address derivation.
Install Rust using rust-toolchain.toml, then run:
rustup target add wasm32-unknown-unknown
cargo install wasm-bindgen-cli --version 0.2.122 --locked
CARGO_PROFILE_RELEASE_LTO=false cargo build --release --target wasm32-unknown-unknown -p noid_web_wallet
wasm-bindgen target/wasm32-unknown-unknown/release/noid_web_wallet.wasm \
--target web --no-typescript --out-dir website/paper/pkg --out-name noid_web_walletThe supplied WASM is the tested existing browser build. A Rust rebuild of this reduced workspace has not been run in the packaging environment. Cargo may normalize the reduced lockfile on the first build; review any dependency changes before publishing a rebuilt engine.
node tests/document.test.mjsThis checks the five original derivation fixtures, complete address and key inclusion, invalid input rejection and PDF structure.
For browser tests, install Playwright in a temporary or ignored Node environment, install Chromium and start the local server before running:
node tests/browser.cjsBrowser checks cover offline generation and download, restoring the displayed address from the generated key, mobile width, clearing, absence of key persistence and preservation of unrelated local storage. Tests use disposable wallets only.
On the dedicated live HTTPS origin, Clear & finish makes an empty POST to ./clear-site-data. A successful response with Clear-Site-Data: "cache", "storage" asks supporting browsers to clear that origin's cache and storage. Configure that endpoint on a dedicated paper-wallet origin, never on an origin containing a saved web wallet. No private key is sent with the request. Localhost intentionally does not clear origin-wide data.
This repository contains no production IP address, SSH details, nginx deployment files, TLS certificates, signing keystores, local backups, wallet exports or saved user keys.
Bundled Rust crates use Apache-2.0 as declared in their manifests. The Apache license is included. QR encoding uses Project Nayuki's MIT-licensed QR Code generator, vendored locally with its license notice: https://www.nayuki.io/page/qr-code-generator-library . The printable document uses a small local vector PDF writer, not a remote rendering service.