QR Code Tools

About QR Code Tools

Two pages that between them cover both directions: turning text into a square, and getting the text back out of one.

A QR code is not a link to anything. It is a printed container, and the characters you encoded sit inside the pattern itself. That single fact decides almost everything about how these two tools are built. Because the payload is self-contained, a generator does not need a server, an account or a database — it needs a grid, some error-correction arithmetic and a canvas. The generator here uses a small encoder library kept in this site's vendor/ folder; the reader uses jsQR the same way. Both run inside the tab you already have open.

What the generator handles

All forty QR versions, from a 21 by 21 grid up to 177 by 177, with the smallest one that fits your text chosen for you — a shorter payload means fewer modules, and fewer modules means each square is physically larger and easier for a phone to lock onto. Text is encoded in byte mode as UTF-8, so accented characters and emoji work, though each one costs two to four bytes rather than one. All four error-correction levels are selectable (L, M, Q, H, recovering roughly 7%, 15%, 25% and 30% of a damaged code), along with a quiet zone of four, two or zero modules and an output edge of 256, 512 or 1024 pixels. You get a PNG for screens and an SVG for print.

When your text exceeds what a version 40 symbol can hold at the level you picked, the page says so with the actual numbers — bytes used, bytes available, and whether a lower error-correction level would have fitted it.

What the reader recognises

The reader takes any still image your browser can decode: a screenshot, a photograph of a poster, an export from a document. It scans at a sensible working resolution, retries at double size if the first pass finds nothing, and tries the inverted image too, so white-on-black codes read as easily as the usual sort.

QR payloads carry no type field, so what a code is for is a matter of conventional prefixes. The reader names the ones in common use: http:// and https:// web links, WIFI: network joins, mailto: addresses, tel: numbers, SMSTO: messages and BEGIN:VCARD contact cards. A bare www. host is flagged on its own, because without a scheme a browser cannot simply be handed it. Everything else is reported honestly as plain text. For web links the host is shown separately, above the button that opens it, so you can read where a sticker is actually sending you before you go there.

What is deliberately missing

There is no camera scanner. Your phone's own camera app reads a code off a table or a poster from the lock screen and does it better than a web page can, and adding one here would mean asking every visitor for a camera permission to serve a minority of them. The reader exists for the case the camera cannot help with: the code is already on your screen.

There is no batch generation and no CSV import. One code at a time keeps the page small and the arithmetic visible. If you need a thousand codes, that is a script, not a web form.

And there are no dynamic or editable codes, which is the one omission worth explaining. A dynamic code does not encode your destination at all — it encodes a short URL on the provider's own domain, and the real address lives in a row of their database. That is what makes it editable, and it is also what makes it a service rather than a file: it needs a server answering requests forever, it logs every scan, and the day the account lapses or the company folds, every code printed with it stops resolving. Encoding the destination directly is the opposite trade — you cannot change it later, but nothing can take it away either.

Colour and centre logos are out too. The generator draws black on white because contrast is the thing scanners actually measure. Download the SVG and recolour it in a vector editor if you need branding.

Who runs it

One developer, on a static site with no back end. There is no sign-up, no quota and no watermark, and no plan to add any, because none of the three would have anything to attach to.

If a code will not decode or one you generated gets rejected by a scanner, tell me about it.