QR Code Generator
Encode URLs, Wi-Fi credentials or any text into a QR code. Everything happens on your device, so what you type never reaches a server.
| Enter something above, then press Generate. |
Most QR generators upload whatever you type
A QR code is just a bitmap of your data. That makes it easy to generate in a browser and — for the website — even easier to generate on a server. The majority of online QR generators are a form that POSTs your text to a backend, which renders an image and sends it back.
That is fine when you are encoding a public URL. It is not fine when you are encoding the Wi-Fi password you are about to print and stick on the wall, a TOTP seed, a recovery phrase, or a signed token. Those strings pass through someone else's process, and unless that operator has gone out of their way not to log requests — and said so in a privacy policy you read — they now have a copy.
Everything on this page happens in your browser. The encoder below runs as JavaScript on your device, including the Reed–Solomon error correction and the mask evaluation. Open your network tab and watch: generating a code makes zero requests.
Error correction is not decoration, it is the whole trick
A QR code stores your data twice over. First the data itself, then a set of error correction codewords computed with Reed–Solomon arithmetic over GF(256). The scanner reads the damaged pattern, uses the redundancy to locate and repair the broken parts, and recovers the original bytes.
| Level | Recoverable damage | Cost | Use it for |
|---|---|---|---|
| L | about 7% | lowest — smallest code | Clean screen display |
| M | about 15% | moderate | General purpose, the safe default |
| Q | about 25% | higher | Print, outdoor signage |
| H | about 30% | highest — largest code | Anything with a logo pasted in the middle |
The trade is real and it runs the wrong way from what people expect: raising error correction reduces how much data fits, so the same text produces a physically denser code. Denser means smaller modules, which means a worse print or a lower-resolution camera can undo the benefit you just paid for. The percentages above are of total codewords, not of image area, and they are approximate because damage to structural patterns — the finder squares, the timing lines — is far more damaging than damage to data modules.
Covering the middle with a logo is not free. A logo occludes data modules, and error correction can only reconstruct what it has redundancy for. As a working rule, keep any overlay under about 20% of the area and use level H. Test the result with a real phone camera at the size you intend to print it, not by looking at it on a monitor.
Three ways the same text becomes a different pattern
Given identical input, four settings change the picture completely, which is why two generators can produce codes that look unrelated and still both scan:
- Version (1–40) — the grid size,
4 × version + 17modules per side. Chosen automatically as the smallest that fits. - Error correction level — how much of the grid is data versus redundancy.
- Mask pattern (0–7) — the encoder tries all eight, scores each for readability, and picks the best. This exists to break up large solid blocks and accidental finder-like shapes that confuse a scanner.
- Encoding mode — all digits pack roughly three per ten bits; upper-case alphanumerics are somewhere between; everything else falls back to one byte per character.
That last point is the one people trip over. A 500-digit string and a 500-character paragraph are very different amounts of data to a QR code, even though they are the same length to you. URL shorteners exist partly because of this.
How much actually fits
| Mode | Characters | Version 40, level L |
|---|---|---|
Numeric 0-9 | 3 per 10 bits | 7,089 |
Alphanumeric 0-9 A-Z space $%*+-./: | 2 per 11 bits | 4,296 |
| Byte (UTF-8) | 1 per byte | 2,953 |
Note the byte figure is bytes, not characters. A single emoji costs four bytes, so a string of 800 emoji will not fit in any QR code even though 800 characters sounds comfortably inside the limit.
Frequently asked questions
Do QR codes expire?
No. A code is a static pattern; nothing about it expires or can be revoked. If you need a code you can invalidate, encode a short redirect URL you control and repoint that later. The direct URL you put in today is still readable in twenty years.
Why does my code get denser when I make the text one character longer?
You crossed a version boundary. Capacity grows in discrete steps, so one extra character can push you into the next version, which adds four modules per side and re-runs mask selection across the whole grid.
Can I put a logo or colour in the middle?
Yes, within limits. Use error correction level H and keep the overlay small. Colour is fine as long as contrast stays high — a scanner thresholds to black and white, so pale text on a mid-tone background may not survive. Avoid inverting (light modules on a dark field); most scanners handle it, some do not.
Is it safe to encode a password or a 2FA seed?
Safe to encode, but understand what you are making: a permanently readable plain-text copy. Anyone with a phone can read it, and it will be captured in any photo of the document it is printed on. Generate it locally, as this page does, and treat the printed artefact like the credential itself.
Why does the quiet zone matter?
The blank margin lets the scanner find the edge of the symbol. Without it the finder patterns can be confused with surrounding artwork. The specification requires four modules; shrinking it is the single most common cause of codes that scan on one device and not another.
Privacy. Encoding, error correction and rendering all run in your browser. No request is made, so your text never reaches a server.