Turn a link, a Wi‑Fi network, a contact card or an email into a scannable code — then take it away as PNG or SVG.
Drop your logo here or
PNG, JPG, SVG or WebP · up to 2 MBFour moving parts, all client-side. Nothing you type is sent anywhere — the encoder runs in the tab.
A QR code stores plain text; the format of that text is what makes a phone offer to join a network or save a contact. Wi‑Fi is WIFI:T:WPA;S:name;P:pass;;, a contact is a vCard block, an email is a mailto: URL. Reserved characters get escaped.
Encoding is Reed–Solomon error correction plus mask selection — don't hand-roll it. This page loads qrcode-generator, calls addData() then make(), and reads back a grid via isDark(row, col).
The same grid becomes a canvas (one filled rectangle per dark module, snapped to whole pixels so edges stay crisp) and an SVG path. Canvas gives you the PNG; the SVG scales to any print size without blurring.
The canvas becomes a PNG blob via toBlob(), the SVG is just a string. On your own site you attach either to an <a download>; here the page asks the viewer's browser to save it.
Two things decide whether a code actually scans. Contrast — dark modules on a light background, never the reverse; tint the modules all you like, but keep them dark. And the quiet zone, the blank margin of at least four modules that tells a scanner where the code ends. Raise the error-correction level only when the code will be printed, curved, or partly covered: every level up makes the grid denser, which needs more physical size to stay readable. A centre logo works by sacrificing that redundancy — the modules underneath are simply gone, and the rest of the code rebuilds them — so a logo and level H go together, and a logo is the one change you should always re-scan before printing.