A QR code that is checked before it is printed

Six payloads, real millimetres at 300 dpi, four module shapes, three finder styles, a gradient and a centre logo — every combination is decoded back before the download appears.

🔒 100% client-side · zero server upload

Nothing leaves this page: no account, no upload, no image host. The centre image is read from your own disk into the canvas and never sent anywhere.

Malaysian rules & edge cases

Each payload has its own grammar, and every grammar reserves characters. A Wi-Fi password of p@ss;word assembled by hand as WIFI:T:WPA;S:Kedai;P:p@ss;word;; ends the password field at the semicolon: the phone joins with p@ss, the customer is told the password is wrong, and nobody can see why. This page backslash-escapes \, ;, ,, : and " in every Wi-Fi field, and prints the escaped payload under the code, so what will be encoded is visible before it is printed.

The other types are held to the same rule. A contact card is vCard 3.0 with CRLF line endings, written unfolded, its properties in the order the specification requires (VERSION straight after BEGIN, then N and FN). A call is tel:, an SMS is SMSTO:, and an email is a mailto: whose subject and body are percent-encoded, so an ampersand in a subject arrives as an ampersand instead of ending the parameter.

  • Contrast is measured on the paler stop. A gradient is two inks, and the pair is only as scannable as its lighter half: 21:1 at the top of a code says nothing about the pale end that dissolves into the paper halfway down. The 4.5:1 floor is applied to the lighter stop against the background, and below it the download stays off.
  • The quiet zone is part of the code. Four light modules on every side (ISO 18004). Without them a reader cannot find the edge of the symbol, so it is fixed at four and is not a control you can turn down.
  • A centre image is damage with a budget. It sits inside a white knockout pad two modules wide, its side is capped at 30% of the code's side, and error correction is forced to H while it is there — H recovers roughly a third of the codewords, which is what a 15 mm logo costs. Past 30% the image is refused, and the sentence names the percentage.
  • Whole pixels, honest millimetres. A module is an integer number of pixels at 300 dpi, so a 50 mm request prints at whatever that rounding produces; the page quotes the size the printer will really deliver, and the PNG carries a real pHYs chunk so Word or Canva places it at that size instead of at 96 dpi.
  • The download is the read-back. After drawing, the canvas is decoded at the size it was drawn at — nearest-neighbour, never a smoothly upscaled copy, because a smoothed edge turns the one-pixel gaps of dot modules into a grey grid and reports a good code as broken. If the decoder returns a different string, the buttons never appear.

Before and after

Before

tools.hoelee.com/qr-code-generator

After

https://tools.hoelee.com/qr-code-generator

How it works

  1. Pick the payload — text or URL, Wi-Fi, contact card, call, SMS or email — and fill that one panel. The string that will actually be encoded appears under the code as you type.
  2. Style it: module shape, corner shape, colours, an optional two-colour gradient, a print size in millimetres and a caption. The code redraws and re-verifies on every change.
  3. Download only when the read-back line is green. The PNG is 300 dpi with a real pHYs chunk; the SVG is the same geometry as a vector.

FAQ

Why is the download sometimes withheld?

Because the drawn code did not decode back to the payload. The usual culprits are a centre image that is too large, a gradient whose pale end is too close to the background, or a size so small that a module is a single pixel. The sentence under the code names which of them it was, and nothing is downloaded until the string matches.

Will a logo stop my QR code scanning?

It can, which is why the tool caps it. A centre image plus its white pad covers codewords, and error correction H can rebuild roughly 30% of them. At 20% of the code side a logo is safe with H; past 30% the arithmetic runs out, so the tool refuses the size rather than printing a card that fails at the table.

Does a gradient really break a QR code?

Only when one end of it is too light. A camera needs dark modules against light paper; a gradient from black to pale grey ends with modules that are nearly the colour of the paper, and the decoder loses them row by row. That is why the contrast check measures the lighter stop and not the average.

What size should I print?

About 5 cm for a table card, 3 cm for a small sticker, and never below 2.5 cm for a code that carries a URL — cheap phone cameras need roughly eight pixels per module under shop lighting. The page reports the size that survives rounding to whole pixels, which is what the printer will actually produce.

Is anything uploaded when I add an image?

No. The file is read from your disk into the canvas in the browser and written into the PNG and the SVG you download. There is no server, no account and no image host in this tool, and its own audit asserts that no request leaves the page.