Turn a link or any text into a QR code, encoded and drawn in this browser tab
The tool loads here. It needs JavaScript, because the work happens on your device.
Your files and your privacy
Nothing you type is uploaded: the payload is encoded and the image drawn on your own
device, and the PNG and SVG downloads are produced there. With no shortener and no
redirect domain, nobody — including us — can count who scans your code. Nothing is kept
between visits, not even your last-used colours.
What this tool does
Encode a web address or any text as a QR code, with control over the error-correction
level, quiet zone, colours and output size. The code holds exactly the value shown under
the preview — no shortener, no redirect.
It encodes your text as a QR matrix in byte mode and draws it at a module size measured in
whole pixels, so every cell is identical. The panel reports the module count, the image
size, the payload length in UTF-8 bytes and the contrast ratio between your two colours,
and warns you before you print something that will not scan. A missing scheme on a web
address is added for you, and the addition is stated rather than made quietly.
How to use it
Choose Link for a web address or Text for anything else; the exact string to be encoded
is shown under the preview.
Pick an error-correction level: M for most uses, Q for anything handled, folded or
printed small.
Check the contrast figure and keep the quiet zone at four modules or more, which is the
specification’s minimum.
Export SVG for print or PNG for screens, then scan the result with a real phone at the
real size before printing a run.
Example use cases
Putting a menu, a booking page or a review link on a printed table card.
Adding a scannable address to a slide, a poster or a conference badge.
Printing a sheet of identical codes to cut up, using the printable sheet at the foot of
the panel.
Supported input and output
Accepts
Any text, encoded as UTF-8 bytes, including accented and non-Latin scripts
Up to 2,953 bytes at level L, 2,331 at M, 1,663 at Q and 1,273 at H
Produces
PNG, at an output size between 128 and 2048 pixels
SVG, vector, drawn as one path of merged module runs
The payload itself, copyable as plain text
What this tool will not do
It generates codes and does not read them: there is no scanner and no camera permission
is requested.
Capacity falls as error correction rises, from 2,953 bytes at L to 1,273 at H. A longer
payload is refused with a message, never truncated.
Codes are static, so a destination cannot be changed after printing. Point the code at
an address on a domain you control if that matters.
Contrast and quiet-zone warnings come from relative luminance and the module count. They
are guidance, not a promise about a particular camera.
Common mistakes
Trimming the quiet zone to fit a layout. The blank margin is part of the code, and a
cropped one fails in a way that looks random rather than broken.
Choosing brand colours that look distinct but sit close in lightness. Scanners reduce
the image to black and white, so a 2:1 pair that reads well on screen will not decode
off paper.
Inverting the code so light modules sit on a dark field. Many readers only look for dark
on light, so it works on one phone and silently fails on the next.
Assuming a higher error-correction level is always safer. It adds modules, so at a fixed
size each one is smaller and may fall below what a camera can resolve.
Technical notes
Encoding uses the qrcode-generator library in byte mode, with the smallest version that
fits chosen automatically. Text is converted to UTF-8 bytes first, because that library’s
ESM build treats byte mode as Latin-1: an accented character passed straight in emits the
wrong byte and yields a code that scans but decodes to mangled text. The SVG is one path
of merged module runs, so adjacent modules meet exactly, and the PNG floors the module
size to whole pixels.
Frequently asked questions
Is my link sent to a server?
No. The code is built in this tab, and it contains only the value shown in the payload
box. Open your browser’s network panel while you type and you will see no request
carrying it.
Which error-correction level should I choose?
M for most things, Q for anything handled or printed small, and H only when part of the
code will be covered. Higher is not automatically safer, because it adds modules.
Why does my code scan on one phone but not another?
Almost always contrast, quiet zone or module size. Check the contrast figure, keep four
modules of margin, and make the code physically bigger rather than raising the
correction level.