QR code generator
This is a QR code generator built for testing rather than for marketing. It makes ordinary QR codes — a URL, a Wi-Fi network, a contact card — and it also makes the awkward ones a scanner integration needs to survive: empty payloads, capacity boundaries, emoji, newlines, 2,953 bytes of filler, and strings shaped like SQL or script tags. Every code is generated in your browser, so nothing you type is sent anywhere.
The encoder is written from ISO/IEC 18004 — the QR specification itself — with real Reed–Solomon error correction over GF(256), all forty versions, the four error-correction levels and the eight mask patterns with their penalty scoring. It is not a wrapper around a library, which is why the page can report the version, mask and segmentation the encoder actually chose rather than the settings you asked for.
34 content templates across 11 groups cover what people actually encode: URLs and plain text, email, phone and SMS with the message already filled in, a Wi-Fi network a phone can join by scanning, vCard and MeCard contacts, a map location, a calendar event, UPI, SEPA and hosted payment links, JSON, XML and HTML for developers, and a raw mode for anything else. Each template escapes its own format properly — semicolons and commas in a Wi-Fi password, line folding at 75 octets in a vCard, percent-encoding in a geo link — because that escaping is where hand-built QR payloads usually break.
For test data specifically, there are scenarios for the cases worth asserting on: empty and single-character payloads, digits with leading zeros, both letter cases, special characters, spaces, newlines, Unicode and emoji, long text at a length you choose, and the three capacity fixtures — one byte under, exactly at, and one byte over what the current configuration holds. The over-capacity one is refused, which is the point of it: a negative test that passes when the encoder says no.
All four error-correction levels are offered and the difference is real rather than cosmetic: L recovers about 7% of a damaged symbol, M about 15%, Q about 25% and H about 30%. Higher recovery costs capacity, so the same text needs a bigger grid at H than at L. The page shows the version, the mask that scored best and how much of your bit budget is used, in bits rather than bytes — capacity is a byte count only in byte mode, and thirty digits cost 104 bits, not thirty bytes.
The design controls change the drawing, never the data: module shapes, separate styling for the three finder eyes and their centers, gradients, a logo in the middle and a frame around the outside. Each one costs scannability and the page says so — a logo covers modules that error correction then has to reconstruct, so it tells you when H is the level that will keep the code readable. A QR code that looks beautiful and does not scan is worse than a plain one.
Because the decoder is here too, the page can read its own output back: it rasterises the design you configured, decodes the pixels and compares the result with the payload byte for byte. That catches the case a matrix check cannot — a symbol whose data is fine but whose picture no reader can use. It is one decoder, though, not a verdict on any particular phone or hand scanner, and the page never claims otherwise.
Batches are on a separate page. Bulk generation takes a sequence, a CSV, a pasted list or a set of test-data scenarios and produces up to 1000 codes with a CSV and JSON manifest, a status for every fixture and an optional decode of each one. Rejected fixtures stay in the manifest with the encoder's own reason, because a boundary case that was refused is a result rather than a missing file.
The tool menu also builds a whole test suite in one download. Tick the categories you need and the archive arrives with a folder per category: valid codes, one symbol per version from 1 to 40, the same content at all four error-correction levels, one payload per encoding mode, each level filled to its version-40 capacity, deliberately corrupted symbols, and degraded images — blurred, noisy, downscaled, faded, rotated and obstructed. Every case carries the outcome a conforming reader should produce, because a fixture without an expected result is not a test.
The suite's manifest, as both CSV and JSON, records per file the content it was built to hold, its settings, what was done to it, whether it decodes, and how many codewords error correction had to repair. That repair count is the column you rarely get elsewhere: it turns pass and fail into a margin. The folder name is deliberately not the verdict — a case in the invalid folder that still decodes is labeled as decoding, because the useful fact is that the damage fell inside the recovery budget. Image cases are sampled at the modules' true positions, so they answer whether the data survives rather than whether a scanner could find the code in a photograph, which is a strictly easier question than a phone camera faces. Everything is seeded: the same content, level, categories and seed produce a byte-identical archive.