Repository navigation
v3.0.0 π¦ Iguanodon β the single-file era
v3.0.0 π¦ Iguanodon β the single-file era
IttyBitz is now one self-contained HTML file. The entire application β encrypt and decrypt, files and text, key files, password generation, QR and SeedQR export, BIP-39 detection β lives in a single page with no framework, no build step for users, no service worker, and zero dependencies. Open it online at ittybitz.app, or save it to disk and run it offline anywhere, forever.
Iguanodon was among the very first dinosaurs ever described β a fitting name for the first release of a new lineage.
Your data is unaffected. The cryptography did not change. The container format and key derivation are byte-for-byte identical to every prior release. Everything you have ever encrypted with IttyBitz still decrypts, in this file, in the app, and in the recovery tool. This is proven in CI against real ciphertexts from every release back to v1.0.
Why
Every security scare this project has fought β dependency advisories, the npm-audit treadmill, and above all the offline PWA that kept breaking β came from the machinery around the cryptography, never the cryptography itself. A single hand-written file removes that machinery entirely:
- No dependency tree β no dependency vulnerabilities. There is nothing to
npm audit. - No service worker β nothing to rot. Offline is no longer "install the PWA and hope the cache is warm." Offline is: you have the file.
- Auditable by anyone. The whole app is ~127 KB of readable HTML, CSS and JavaScript you can read top to bottom β not a minified bundle. Verifiability is the entire point of a "trust nothing" tool.
- Longevity. Save it next to your encrypted data. It will still open in a browser in twenty years, with no website, no project, and no author required.
Offline is now "save the file"
The installable PWA and its service worker are gone. To use IttyBitz offline:
- Open ittybitz.app, then File β Save Page Asβ¦ (βS / Ctrl+S) β choose "Web Page, HTML Only", or
- Download
ittybitz.htmlfrom the release.
Then open that file anywhere β disconnected, air-gapped, from a USB stick. The file has zero external subresources (the QR codes render to <canvas>, the logo is inline SVG, fonts are system fonts), so "Save Page As" produces one working file, and a Content-Security-Policy in the page makes a network request structurally impossible.
Two files, two trust levels
ittybitz.htmlβ the full two-way app. Encrypt and decrypt.ittybitz-recovery.htmlβ the decrypt-only lifeboat. Deliberately half the code to audit, for the day you need to recover data and want the smallest possible thing to trust. SeeRecover/.
Verified in both directions
A single-file app is only trustworthy if it provably speaks the exact IttyBitz format. src/lib/crypto.ts and src/lib/bip39.ts are kept in the repository as the frozen reference implementation, and the crypto regression suite (npm run test:crypto) now gates ittybitz.html against them in both directions:
- it decrypts all 32 historical ciphertexts (v0 and v1, with and without key files);
- ciphertext it produces opens under the reference
crypto.ts, and ciphertextcrypto.tsproduces opens under it β with and without key files; - its BIP-39 validation and Standard SeedQR output match the spec vectors.
This is the guarantee a bundled copy of an app cannot give by inspection, and it runs on every push and pull request.
Architecture
site/index.html is assembled by npm run build (a plain concatenation β contributors only, never needed to use the app) from:
scripts/build/head.htmlβ the hand-written page (HTML + CSS)scripts/build/qrcode-lib.jsβkazuhikoarase/qrcode-generator(MIT), vendored verbatimscripts/build/crypto-core.jsβ the DOM-free encrypt/decrypt core- a BIP-39 core generated from
src/lib/bip39.ts, so the wordlist can never drift scripts/build/app.jsβ the UI wiring
Removed
The Next.js / React application and everything that supported it: src/app, src/components, src/hooks, React, Tailwind CSS, Radix UI, lucide-react, qrcode.react, next.config.js, the TypeScript/PostCSS config, package-lock.json, the CSP-hashing and service-worker build scripts, public/sw.js, public/manifest.json, and the PWA icons. All runtime and build dependencies are gone β package.json now declares none.
Hosting
Unchanged for you: GitHub Pages still serves the site and ittybitz.app still resolves to it. The deploy workflow no longer builds anything β it publishes the site/ directory verbatim. No DNS changes, no Pages settings changes.
Upgrading
Nothing to do. Existing .ibitz files and encrypted text decrypt exactly as before. If you keep a saved copy of the app or the recovery tool for offline use, download the fresh v3.0.0 files from the release and re-verify their checksums.
Verify your download
3cc61ebde7b787e6bb1f5f823db68e79a34da152728a3c483150e060832a06cc ittybitz.html
952da1fb5c9a4c89c7765e472042abbb4d127551c34b73af5e05e2cc1038b08d ittybitz-recovery.html
shasum -a 256 <file> (macOS/Linux) or certutil -hashfile <file> SHA256 (Windows). The files are byte-identical to what ittybitz.app serves.