QR Code Generator & Reader
Make QR codes for links, text, WiFi and contact cards, read a QR back out of an image, or batch-generate up to 100 codes from a list — live in your browser, downloadable as PNG, SVG or a ZIP of PNGs. Nothing is uploaded.
Use decimal degrees (e.g. 40.7128, -74.0060) — the values a maps app shows when you copy a pin's coordinates. Non-numeric entries are rejected rather than encoded into a broken code.
M recovers ~15% damage — the everyday default. Error correction adds redundancy so a scuffed or partly covered code still scans; higher levels make the code denser.
Locked to H while a logo is placed. The logo tile destroys the modules it covers outright, and only level H's ~30% recovery budget leaves room for that (the tile is capped at roughly 10% of the module area) plus real-world wear. Remove the logo to pick a lower level again.
Applies to the preview and to both downloads, quiet zone included. Scanners assume dark modules on a light background, so keep the modules clearly darker — a colored code can scan well, but no color combination is guaranteed on every reader; test with a real phone before printing.
PNG or JPEG up to 1 MB, drawn centered on a background-colored tile in the preview and in both downloads — the SVG embeds it as a data URI, so the two exports never differ. Like everything on this page, the logo file never leaves your browser. Placing a logo locks error correction to H: level H can rebuild ~30% of the code's data, and the tile is capped at roughly 10% of the module area so most of that budget stays free for real-world damage. A logo still destroys the modules under it, so always test-scan before you print.
Logo placed — error correction is locked to H. The tile covers under 10% of the modules, inside level H's ~30% recovery budget, but an overlay always destroys the modules beneath it and no logo code is certain to work on every reader: test-scan before you print.
Drop, choose or paste a QR image and its content appears here — decoded entirely on your device.
If a picture holds several QR codes, only the clearest one is read. Web links open in a new tab; WiFi, contact and phone payloads are labelled but never auto-opened — check them before acting on them.
Every non-empty line becomes one QR code, rendered live as you type. Blank or whitespace-only lines are skipped — and counted, so nothing disappears silently. The batch is capped at 100 lines; anything past the cap is reported, never quietly truncated.
Which single-QR options apply to a batch: the error-correction level, module/background colors and image size currently set on the Generate tab apply to every code here. The center logo does not — it is deliberately scoped out of batch mode, because every logo overlay destroys the modules it covers and needs its own test-scan, which a 100-file export cannot honestly promise. Each line is encoded exactly as typed, so paste ready-made payload strings (a full WIFI:T:WPA;S:name;P:pass;; string works fine as a line) — or switch to CSV + template above to build structured WiFi / vCard / SMS / location / email codes from a spreadsheet.
Files are named from the payload itself — a slugified prefix, so https://example.com/menu?table=1 becomes https-example-com-menu-table-1.png; duplicate names get -2, -3… appended. Like everything on this page, the codes and the ZIP are built entirely in your browser.
The first row is the header and is required — its column names are what you map below (the header row is never turned into a code). Commas, quotes and line breaks inside a "quoted field" are handled per RFC 4180. The batch is capped at 100 data rows; rows past the cap are reported, never silently dropped.
Paste a CSV above to map its columns.
Each PNG is named from this column's value, slugified (accents folded, non-alphanumerics collapsed to -, trimmed to 40 chars); identical names get -2, -3… appended — the same rule as the line batch. Leave it generic and codes are named qr.png, qr-2.png…
Escaping is shared with single mode: a vCard, WiFi or SMS built from a row is byte-for-byte identical to the one the Generate tab would build from the same values — commas, semicolons and quotes are escaped exactly once. The error-correction level, colors and image size from the Generate tab apply to every code; the center logo does not. A row that's missing a required value is reported with its row number and reason, and the good rows still generate.
Nothing to render yet — each non-empty line becomes one QR code.
Everything runs in your browser. Whether you generate a code or read one from an image, it is computed on your own device — WiFi passwords, contacts, links, any image you decode and any logo file you place are never uploaded, logged or sent anywhere. There are no network requests; the page keeps working offline.
How this QR code generator works
Everything happens locally: the page encodes your content with a vendored copy of the open-source qrcode-generator library (MIT, by Kazuhiko Arase), draws the result onto a canvas, and serialises the same module grid to SVG when you download. There is no server-side step, no account, and no watermark — the image you download is yours, and because the code is static (your content lives in the pattern itself, not behind a redirect service) it will keep working forever without anyone's servers.
Versions, modules and the capacity meter
A QR code is a grid of dark and light squares called modules. The grid comes in 40 standard sizes called versions: version 1 is 21×21 modules and each version adds four per side, up to 177×177 at version 40. More content — or a higher error-correction level — needs a bigger version. The meter under the image shows which version your content currently needs: a low version scans easily from a distance or at small print sizes, while a code near version 40 is so dense it demands a large, crisp print. If your content doesn't fit even in version 40, the tool tells you honestly instead of producing an unscannable code.
How many characters fit also depends on the encoding mode. Pure digits pack tightest (about 3.3 bits each), the restricted alphanumeric set of digits, capital letters and a few symbols is next, and arbitrary text falls back to byte mode at 8 bits per character. That is why a phone number encodes into a far smaller grid than the same number of letters in an email address.
Choosing an error-correction level
QR codes carry Reed–Solomon error-correction data, which is why a torn poster or a code with a logo in the middle can still scan. The four levels trade robustness against capacity. The table below pairs each level's recovery rate with its byte-mode capacity in the largest version 40 grid:
| Level | Recovers | Max bytes (v40) | Good for |
|---|---|---|---|
| L | ~7% | 2,953 | Screens, clean digital use |
| M | ~15% | 2,331 | General use — the default |
| Q | ~25% | 1,663 | Print handled outdoors |
| H | ~30% | 1,273 | Logo overlays, harsh conditions |
Worked example: what a level costs
Take a fixed budget first: the same version 40 grid holds 2,953 bytes at level L but only 1,273 at level H, so moving from L to H sacrifices about 57% of the capacity to buy roughly four times the damage tolerance. Now hold the content fixed instead. The URL https://polyatic.com/qr-code-generator/ is 40 bytes. In byte mode that fits a version 3 grid (29×29, capacity 42 bytes) at level M, but at level H the same 40 bytes overflow versions 3 and 4 and only fit at version 5 (37×37, capacity 44 bytes). Same URL, two extra versions, a noticeably denser code — the price of the extra redundancy. The practical takeaway: raise the level for codes that will be handled, printed small, or covered by a logo, and keep it low for a clean on-screen code where every module is crisp.
Structured payloads: WiFi, contacts, SMS, location and email
Beyond a plain link or text, the picker builds the small structured strings that phone cameras act on directly, and feeds each into the very same encoder — so the version meter and downloads work identically whatever type you pick:
- WiFi emits the de-facto standard
WIFI:T:WPA;S:name;P:password;;that iOS and Android cameras recognise, with the special characters\ ; , : "backslash-escaped so a password containing a semicolon or colon survives intact. Pick "open network" and theP:field drops out entirely; tick "hidden" and anH:trueflag is added for non-broadcast SSIDs. - vCard produces a standards-compliant vCard 3.0 with CRLF line endings — name, organisation, phone, email and website — that phones offer to save as a contact. Commas, semicolons and line breaks in a value are escaped per the spec, and any optional field you leave blank is omitted completely rather than left as an empty line.
- SMS builds
SMSTO:number:message, so a scan opens a new text to that number with your message pre-filled. - Location builds a
geo:latitude,longitudeURI in decimal degrees; enter something that isn't a number and the tool refuses rather than encoding a broken pin. - Email builds a
mailto:link with the subject and body percent-encoded, so spaces and ampersands don't break the pre-filled message.
Remember that a QR image is not encryption: anyone who scans it reads exactly what you encoded, so treat a WiFi-password or contact code like the printed information itself.
Colored QR codes: what scans and what doesn't
The color pickers recolor the dark modules and the background (quiet zone included) in the preview and in both the PNG and SVG downloads. Color is cosmetic to the format — a scanner converts the image to black-and-white internally — so what matters is only that the modules separate cleanly from the background. The tool measures that with the WCAG 2.1 relative-luminance contrast ratio: classic black on white scores the maximum 21:1, a dark navy like #1a2a6c on white still scores about 13:1 and scans fine, while a mid-blue like #7a8cff on white drops to about 3:1 — below the 4:1 floor this tool warns at, where phone cameras start to misfire, especially in poor light or at small print sizes.
Two honest rules. First, never invert: light modules on a dark background fail on many readers even at maximum contrast, because decoders assume dark-on-light polarity — the tool warns whenever the modules are lighter than the background. Second, a warning here is advice, not a guarantee either way: readers differ, so no color combination — not even black on white — can be promised to work on every scanner ever made. If a code will be printed, test the actual colors with a real phone first. When in doubt, keep the background white or near-white and pick your brand color for the modules, as dark as the brand allows.
Center logos: the honest budget math
A logo in the middle of a QR code works not because scanners ignore it, but because of error correction: at level H the Reed–Solomon data can rebuild up to ~30% of the code's codewords. The crucial honesty is that an overlay doesn't merely risk the modules it covers — it destroys them outright, spending recovery budget before the code ever meets the real world. So this tool does two things when you add a logo. First, it locks error correction to H (at L, M or Q the budget is 7–25%, too thin to give away). Second, it caps the logo tile at roughly 10% of the module area — about a third of H's budget — so the remaining ~20 points stay free for what actually happens to printed codes: scuffs, glare, curvature, and phone cameras at bad angles.
Worked example: https://polyatic.com at level H encodes as a version 3 code, a 29×29 grid of 841 modules. The tool's centered tile is 9×9 = 81 modules — exactly 9.6% of the area, never more than the cap. The logo itself sits inside that tile on a background-colored square with half a module of breathing room, and the same placement geometry is used for the canvas preview, the PNG and the SVG, so what you test is what you print. Two limits stated plainly: the ~10% area cap is a conservative proxy (covered area and destroyed codewords aren't identical because codewords are interleaved across the grid), and no overlay of any size is certain to scan on every reader ever made — test-scan the final artwork with a real phone before you print a run of them.
Reading a QR code from an image
The Decode tab does the reverse job: give it a screenshot or photo and it reads the payload back out. Drop, click, or paste (Ctrl/⌘+V) a PNG, JPG or WebP; the image is painted onto a canvas and decoded in your browser by a vendored copy of jsQR (Apache-2.0). Because the decoding is local, an image containing a WiFi password or a private link never leaves your device — the same privacy guarantee as the generator, applied to reading. The result is shown verbatim with a Copy button, and the tool classifies it: an https:// link becomes an openable link (in a new tab), while WIFI:, mailto:, tel: and vCard payloads are labelled but deliberately not auto-opened, so you can inspect a code before trusting it. Honest limits: it reads still images, not a live camera feed; very low-contrast, blurred, or heavily rotated codes may not resolve, in which case it asks for a sharper photo rather than guessing; and if one picture holds several codes it reads only the clearest one and tells you so.
Batch mode: a list in, a folder of PNGs out
The Batch tab exists for the jobs where one code is never enough: a menu QR per table, an asset tag per device, a per-page link for a print run. Paste up to 100 lines — the cap is stated up front and enforced with a plain message, not a silent cut — and each non-empty line is encoded through exactly the same engine as a single code, using the error-correction level, colors and image size set on the Generate tab. Blank lines are skipped and the skip count is shown, so the number of codes always reconciles with your list. Two single-QR features deliberately don't carry over, and the page says so: the center logo (an overlay eats recovery budget and warrants a per-code test-scan, which no bulk export can honestly claim) and the structured builders — in batch, a line is encoded verbatim, so paste finished payload strings like WIFI:T:WPA;S:name;P:pass;; if you need them.
Downloads work at both grains. Every card has its own PNG button, and Download all (.zip) packs the whole batch into one archive built in your browser by a vendored, pinned copy of the open-source JSZip library (MIT) — like everything here, the list and the ZIP never touch a server. Filenames are derived from the payloads themselves: a slugified prefix of up to 40 characters (https://example.com/menu?table=1 → https-example-com-menu-table-1.png, accents folded so Grüße → gru-e), with -2, -3… appended when two lines produce the same name. One honest limit: 100 codes at 1024px is a lot of pixel data, so the ZIP renders codes one at a time — on a slow machine the largest batches take a few seconds.
Common mistakes
Cramming a long URL in. Tracking parameters and long paths bloat the byte count and force a dense, hard-to-scan grid — shorten the link first. Dropping the quiet zone. The white border is not decoration; scanners rely on it to locate the code, so never crop right to the edge. Inverting the colours. Light modules on a dark background look stylish but break many readers; keep it dark-on-light. Slapping a big logo on a low level. A logo covers modules, so a centred logo needs level Q or H — cover an L or M code and it may stop scanning. Printing too small. A dense code shrunk onto a business card can fall below a phone camera's resolving power.
Honest limits & printing
This is a static-code generator: it does not make dynamic, editable, or scan-tracking codes, because those require a hosted redirect service — an intentional trade for privacy and permanence. It recolors modules and background and can center a logo over the code, but it doesn't apply gradients or verify that a code scans on your particular reader — the contrast warning and the logo coverage cap are computed from geometry and color math, not from a real scan — and non-ASCII text is encoded as UTF-8 bytes, which a few older scanners misread as Latin-1. For print, keep the quiet zone, print dark-on-light, and size for the job: a rough rule is that scan distance can be about ten times the printed width, so a 2 cm code reads comfortably from 20 cm while a poster scanned across a room needs a much larger print. When in doubt, download the SVG and scale it losslessly to whatever size the layout needs.
Want the theory behind the meter? Learn more in QR Codes Explained → — the finder patterns, the four encoding modes, versions, and how Reed–Solomon error correction lets a damaged or logo-covered code still scan.