Polyatic QR Code Generator

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.

Link to encode
Image size512px
Error correction

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.

Colors

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.

Center logooptional

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.

Capacity used — how much of a QR code's capacity this content fills

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:

LevelRecoversMax bytes (v40)Good for
L~7%2,953Screens, clean digital use
M~15%2,331General use — the default
Q~25%1,663Print handled outdoors
H~30%1,273Logo 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 the P: field drops out entirely; tick "hidden" and an H:true flag 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,longitude URI 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=1https-example-com-menu-table-1.png, accents folded so Grüßegru-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.