Bytes first.
Pixels second.
What the check means
This tool writes an ECI 26 (UTF-8) segment followed by a single byte segment. It does not optimize numeric/alphanumeric modes. It automatically selects a QR version, renders square black modules on white with a four-module quiet zone, then uses a separate decoder, jsQR, to read those pixels. Downloads are enabled only when the decoded byte array and ECI header exactly match the expected input. This is a software consistency check, not proof that every scanner, camera or print will work.
Some older scanners do not support ECI. Always scan-test the actual exported or printed code on your intended phones. We do not fetch, open, shorten, validate or certify destinations. A generated QR does not make a link safe. QR contents are public to anyone who scans them.
Input and output limits
Text is UTF-8, from 1 to 1,200 bytes, with a maximum of 4,000 UTF-16 code units before byte validation. Unpaired Unicode surrogates are refused instead of silently replaced. We do not trim spaces, add URL schemes, or normalize Unicode. HTML textarea line endings become LF, so pasted Windows CRLF may change. This tool is not for byte-for-byte arbitrary-file encoding. Control and invisible characters remain in the payload and JSON byte array; their visible text rendering may be misleading. JSON escapes some characters.
QR versions 1 to 40, error correction L/M/Q/H, fixed ECI 26 and byte mode only. Unsupported: Micro QR, structured append, Kanji-specific encoding, other ECI assignments, logos, custom colors/shapes, binary uploads, Wi-Fi/password builders, camera scanning and destination checks. Higher error correction adds redundancy but also density; it is not a promise that a percentage of any visual area may be removed.
PNG exports use the checked canvas. SVG exports reconstruct exactly the same boolean module matrix and quiet zone at the selected integer module scale. SVG contains only fixed shapes, no payload metadata, links, scripts, external references or fonts. The report contains the payload and exact UTF-8 bytes, so treat it with the same care as the QR. No minimum print size is promised. Keep the complete white border, avoid blurry resampling, and test actual output. The on-page scaled preview is not a scan-quality guarantee.
Privacy
Generation and read-back happen in this page with locally bundled code. The app makes no runtime external requests, visits no encoded URL, and uses no analytics, uploads, cookies or persistent payload storage. Downloads stay with your browser. Hosting access logs, extensions, OS clipboard/history and downloaded files are outside these app claims. Do not enter passwords, payment-card data or other secrets. A QR does not encrypt its contents.
Sources and licences
Encoder adapted from Kazuhiko Arase's qrcode-generator, revision 83b7e8fe3fddd3b0368dbafd6ce56995bd25e3c8, MIT. Changes to qrcode.mjs add only UTF-8 ECI 26 segment handling in final serialization and automatic version selection. A new wrapper validates Unicode/limits and preserves text bytes. Full MIT terms.
Pixel decoder: unmodified jsQR dist/jsQR.js, revision 8e6a036beafa7053dd44b1b76ac578d22b1b3311, Apache License 2.0. Full Apache terms, notices. New wrapper/UI/export code is under MIT terms in LICENSE. No remote fonts or runtime dependencies beyond these bundled libraries.
Guidance: DENSO WAVE quiet zone, error correction, ECI/mode terminology. QR Code is a registered trademark of DENSO WAVE INCORPORATED; no affiliation or endorsement.
Download source and licence texts ยท Chawso Credits. Revised November 13, 2026.