QR Code Generator

Global tools

A QR code is a container. A link, a Wi-Fi password, a phone number or a whole contact card goes in, and a phone camera pulls it back out — which is also where most generators get vague. The code scans, and then nothing happens, or the wrong thing happens, because the string inside it was put together wrong: a semicolon in a Wi-Fi password, a comma in a surname, a space where none was allowed.

A QR code is only a container. This decides what goes into it, and the fields below change to match.

Exactly what gets encoded: capitals, accents, emoji and line breaks included. Nothing is shortened or tracked for you.

How much of a damaged code can still be read. H survives a logo in the middle; M is the usual choice for a screen.

Leave it automatic unless the design needs a fixed shape. A pinned version that is too small is refused with the version that would have fit.

The size of the downloads and of the picture above. A module is one black or white square of the code.

White margin on every side. The standard asks for at least 4; a smaller one saves space and costs scan reliability.

Results update as you type. Nothing leaves your device.

Version 2 QR code - plain text

25 x 25 modules

264 x 264 px at 8 px per module, with a 4-module quiet zone. 19 bytes went in as 8-bit byte (UTF-8), and error correction level M can recover about 15% of the code.

Version
2 of 40
Modules
25 x 25
Mask used
6 of 8
Correction
M - about 15%

Your QR code

Version 2 QR code, 25 by 25 modules, error correction level M holding plain text

264 x 264 pixels, 8 pixels per module. Point a phone camera at the screen before you print anything: if the screen scans, the print will.

Black on white at full contrast is what a scanner reads. Do not invert it, do not lay it over a busy photo, and if you drop a logo into the middle raise the error correction to H - the middle is where a logo covers the most of the code.

A scanner shows the text, and offers to open it when it looks like a link. Anything a phone can display or copy will do - a URL, a coupon code, a booking reference, a note for the next person.

How this code was built

  1. Your text went in as 8-bit byte (UTF-8) mode, which packs one byte per eight bits. That is the fallback for anything QR has no tighter alphabet for - lower case letters, punctuation, accents, emoji - and it is why a short-looking link can still need a big symbol. 19 characters, 19 bytes of them.
  2. Version 2 is the smallest that holds those 19 bytes at level M: 25 x 25 modules. One version smaller and the data would not fit.
  3. Error correction level M spends part of the symbol on repair data: a scanner can still read this code with up to about 15% of it covered, torn or faded. H means more repair data and a bigger symbol for the same text; L means the smallest symbol and the least tolerance.
  4. The standard defines eight mask patterns, and they exist to break up the large runs of one color that make a scanner's job hard. The encoder tried all eight, scored each against the same four penalty rules the standard lists, and kept pattern 6.
  5. The 15 format bits - the level and the mask, wrapped in a BCH error correction code - were then read back out of the finished symbol, from both of the two places they are written: they say level M and mask 6, which is what is actually drawn, and they agree with each other.
  6. 334 of the 625 modules are dark, 53% of the symbol. A scanner compares dark modules with light ones, so the contrast between them is what carries the message.
  7. The white margin around the symbol is 4 modules on every side. The standard asks for at least 4, and a code that runs right up to its edge is one a scanner cannot find the start of.

Exactly what is encoded

LineWhat it says
1https://danfio.com/

This is the whole payload, with no shortening service, no tracking parameters and no metadata about where the code was made. The code is exactly as private as the places you print it.

Bytes that fit, by version and error correction level

VersionModulesLMQH
Version 121 x 211714117
Version 225 x 2532262014
Version 329 x 2953423224
Version 433 x 3378624634
Version 537 x 37106846044
Version 641 x 411341067458
Version 745 x 451541228664
Version 849 x 4919215210884
Version 953 x 5323018013098
Version 1057 x 57271213151119
Version 2097 x 97858666482382
Version 30137 x 13717321370982742
Version 40177 x 1772953233116631273

Byte-mode capacity, which is the worst case: lower case letters, punctuation and any non-Latin script all cost a byte each. Digits pack three to ten bits and upper-case alphanumerics two to eleven bits, so the same information can need a smaller version in those modes.

Test with two phones before you print 500 stickers - one from each phone family. A code that scans on the screen you made it on is the easy half; paper, lighting and camera quality are the other half.

This page assembles the payload for the six things people really encode — text or a link, a Wi-Fi network, an email, a text message, a phone number and a vCard contact — draws the symbol in the tab, and hands over an SVG for print and a PNG for everything else. Nothing is uploaded. Nothing is shortened. There is no account, no redirect and no expiry, because the code contains your data rather than a pointer to somebody else’s server.

About this qr code generator

Usually a QR code is treated as a link, and people are surprised when a phone reads the square and nothing opens: the code is only a container, and the bytes inside it decide whether a camera offers a Wi-Fi network, a contact card or a plain sentence. This page builds six kinds of payload correctly and prints the exact string it encoded.

Each builder is a small fixed rule with its own checks, so a semicolon in a Wi-Fi password is escaped, a comma in a surname is escaped in the vCard, and a long address folds at 75 octets. The symbol is drawn browser-local, so no link, password or contact is uploaded anywhere.

The code itself cannot join a network, send a message or save a contact; it fills a form and waits for a person to act. Test a finished code with a real phone before printing it on a wall, a label or a menu, especially when the payload is a password.

How this qr code generator works

A QR code is a container, not a link

The square a camera reads is just bytes. What makes a phone offer to join a network rather than display a sentence is the shape of those bytes: WIFI:T:WPA;S:the network;P:the password;; for a network, mailto: for an email, tel: for a number, SMSTO: for a text message, and a version 3.0 vCard for a contact. Every one of those formats has its own escaping rules, and every one of them has a failure mode that looks exactly like success — the code scans, nothing opens, and the fault is invisible.

So every builder here is checked on its own before release. A Wi-Fi password containing a semicolon comes out escaped, because the payload is a semicolon-separated list; a comma in a surname is escaped in the vCard, where it would otherwise start a new name component; a long address that a phone would truncate is folded at 75 octets with continuations marked, the way the vCard specification asks. The results panel prints the exact payload that went into the code, so it can be checked character by character instead of trusted.

The kind of code also decides what a scanner can do with it, and nothing more. A QR code cannot join a network, send a message or save a contact by itself: it fills in a form and waits for a person to press the button. That is worth knowing before putting a Wi-Fi code on a wall, because the password is inside it.

Version, mode, and why a short link became a big square

A QR code comes in forty sizes, called versions. Version 1 is 21 by 21 modules, version 40 is 177 by 177, and each step adds four modules a side. Automatically, the smallest version that holds the data is the one drawn, because fewer modules means a smaller code that is easier to scan — and the results say which version was used and what the size one step below it would have needed.

How much fits depends on the mode. Digits are cheapest, three at a time in ten bits; the forty-five upper-case characters QR has an alphabet for take eleven bits for two; everything else — lower case, punctuation, accents, emoji, Chinese — goes in as UTF-8 bytes, one byte per eight bits. That is why a thirty-character lower-case link can need a bigger symbol than eighty digits, and why this page names the mode it used.

Error correction is the other half of the size. Level L devotes about 7% of the symbol to repair data, M about 15%, Q about 25% and H about 30%, so the same text needs a larger version at H than at L. Capacities are worth having to hand: version 1 at level M holds 14 bytes of lower-case text, version 10 at M holds 213, and version 40 holds 2,331 at M or 2,953 at L. The table under the code lists them all.

Error correction, contrast, and the honest limits of a logo

The repair data is what lets a scanner read a code that has been rained on, printed badly or partly covered. It is also the reason a logo in the middle can work at all: level H survives about 30% of the symbol being unreadable, so a mark over the center is a calculated risk rather than a trick. Cover more than that, or use M underneath a logo, and the code simply stops scanning while still looking perfectly fine to a person.

What no amount of error correction fixes is contrast. A scanner is looking for the boundary between dark and light modules, so an inverted code (white on black), a colored code, or a code laid over a photograph is a common reason a phone refuses a symbol that is otherwise perfect. Black on white, flat, with the standard four modules of white margin on every side, is what the standard assumes — which is why there is no color picker on this page.

Size on paper is the other practical limit. A rule of thumb that has served for years: the code should be roughly a tenth of the distance it will be scanned from, so a code read at 30 cm wants to be about 3 cm across, and a code on a poster read from a meter or two wants to be much larger than its minimum. Modules below about half a millimeter blur into one another on a domestic printer, which is one reason the settings here are in pixels per module rather than in centimeters.

What this page checks, and what it deliberately leaves out

The encoding itself is the one part of this site that is not written from the specification. A barcode is a table of bar widths and a checksum, which is why the barcode generator here can own its own copy of it and prove the table right; a QR code is Reed-Solomon arithmetic over a finite field, eight mask patterns scored against four penalty rules, and a block layout that changes with every version and every level. So this page uses a well-established QR encoder that follows the published standard and runs entirely in your browser, and then checks its work rather than trusting it.

The check is visible in the results. The fifteen format bits that carry the error correction level and the mask pattern are read back out of the finished symbol, from both of the two places they are written, and they have to agree with each other; from version 7 the symbol additionally states its own version number, protected by its own error-correction remainder, and that is read back the same way. The numbers printed below the code are therefore facts about the picture, not a repetition of the settings.

We go further and decode the output with an independent decoder built from the same standard: every mode, every level, a symbol rendered into pixels, the PNG deflated and read back, and every row of the capacity table confirmed by encoding a payload of exactly the stated length and one byte more. That last check found a genuine error in this page’s own table while it was being written — version 30 at level Q holds 982 bytes, not the 964 that had been typed in.

Not included, and worth saying plainly: dynamic or editable codes that redirect (which is what "change the link later" really means, and it puts your code on somebody else’s server), scan analytics, logos and colors, Micro QR, GS1 Digital Link and FNC1 parameters for retail supply chains, structured-append symbols for very long payloads, and Kanji mode — Japanese text is encoded here as UTF-8 bytes, which every phone reads and which costs slightly more room than a dedicated Kanji encoder would use.

Worked examples

Each example below was run through the calculator on this page when the site was built, so the numbers match what you see when you enter the same inputs.

A link on a menu, a flyer or a shop window

What the code should do: Text or a link · Text or link: https://danfio.com/tools/qr-code-generator/

Version 4 QR code - plain text

33 x 33 modules

328 x 328 px at 8 px per module, with a 4-module quiet zone. 43 bytes went in as 8-bit byte (UTF-8), and error correction level M can recover about 15% of the code.

Version: 4 of 40 · Modules: 33 x 33 · Mask used: 4 of 8 · Correction: M - about 15%

The whole link is in the code, character for character. Because lower-case letters have to travel as bytes, this 43-byte link needs version 4 — the same information written as digits would be a good deal smaller.

Guest Wi-Fi for the counter

What the code should do: Wi-Fi network (join when scanned) · Network name (SSID): Danfio Guest · Wi-Fi password: •••••••• · Security: WPA / WPA2 / WPA3 (almost every modern network) · Hidden network: No - it broadcasts its name

Version 3 QR code - a Wi-Fi join code

29 x 29 modules

296 x 296 px at 8 px per module, with a 4-module quiet zone. 41 bytes went in as 8-bit byte (UTF-8), and error correction level M can recover about 15% of the code.

Version: 3 of 40 · Modules: 29 x 29 · Mask used: 2 of 8 · Correction: M - about 15%

The payload is WIFI:T:WPA;S:Danfio Guest;P:latté-2026;; — the accented character goes in as UTF-8 bytes. The password is inside the code, so anybody who can photograph it can join the network.

A contact card on a conference badge

What the code should do: Contact card (vCard) · Name: Lovelace, Ada · Company: Danfio · Job title: Editor · Phone: +1 555 010 1234 · Email: ada@danfio.com · Website: https://danfio.com/

Version 10 QR code - a contact card

57 x 57 modules

520 x 520 px at 8 px per module, with a 4-module quiet zone. 188 bytes went in as 8-bit byte (UTF-8), and error correction level M can recover about 15% of the code.

Version: 10 of 40 · Modules: 57 x 57 · Mask used: 0 of 8 · Correction: M - about 15%

The comma splits the name into the family and given components the vCard format wants, and the phone number loses its brackets and dashes on the way in — tel: dialers are happier without them.

A number guests can dial, and a message they can send

What the code should do: Phone number · Phone number: +44 20 7946 0958

Version 2 QR code - a phone number

25 x 25 modules

264 x 264 px at 8 px per module, with a 4-module quiet zone. 17 bytes went in as 8-bit byte (UTF-8), and error correction level M can recover about 15% of the code.

Version: 2 of 40 · Modules: 25 x 25 · Mask used: 6 of 8 · Correction: M - about 15%

A phone number as digits is the cheapest thing a QR code can hold, which is why this is a small symbol. Switching the kind to a text message would add SMSTO: and the message text, and take the version up if the message is long.

Frequently asked questions

Do the codes expire?

No. A static QR code is just the data, drawn as squares, so it keeps working for as long as the thing it points at does — a code printed in 2015 still scans. What expires is the web page it links to, which is a different problem. Codes that never expire are exactly why this page does not shorten links: a shortening service is a middleman that can go out of business, change its terms or start charging.

Is it free, and is there a watermark?

Free, with no watermark, no account, no sign-up and no download limit. The SVG and PNG you download hold the code and nothing else — no credit line, no border, no colored frame. There is nothing to attribute and nothing on this page that asks for an email address.

Do you store the codes, or know when they are scanned?

No, and it is worth being precise about why. The code is built inside your browser from what you type; there is no endpoint on this site that could receive it and no database behind the page. That is also the trade-off: nothing here can count scans or say where they happened, because the code never talks to a server. Counting scans needs a code that points at a redirect service, which is a different product with a different set of promises — and it stops working when that service does.

Which error correction level should I choose?

M is the usual answer: it repairs about 15% of the symbol and costs far less room than H. Use Q or H when the code will be printed small, put somewhere that gets dirty or damaged (equipment labels, a menu on a table), scanned in poor light, or covered by a logo. Use L only when every millimeter counts and the code will be read from a clean screen at close range.

How big should I print it?

The long-standing rule of thumb is that a code should be about a tenth of the distance it is scanned from: read at 30 cm, make it about 3 cm across; read from a meter, make it about 10 cm. Modules below roughly half a millimeter blur together on a domestic printer, so scale the code up rather than shrinking its modules — the SVG is resolution independent and prints sharp at any size. Keep the white margin, too: it is part of the code rather than decoration.

Why does my Wi-Fi code not join the network?

Four usual causes, in order of frequency: the network name is case-sensitive and a phone treats "Cafe" and "cafe" as two different networks; the password contains a character that was not escaped when the payload was built (this page escapes them, a code made elsewhere may not); the network is WPA3-only or WEP-only and the phone predates that standard; or the network uses a captive portal, which no Wi-Fi code can log into — those need a normal page that opens. Always point the phone at the code on the screen first: if the screen does not join, the print will not either.

Can I put my logo in the middle of the code?

This page does not draw logos, and it is worth knowing what a logo costs before adding one anywhere: it covers modules the scanner needs, so the error correction has to be raised to H (about 30% recoverable) and the mark should stay under roughly a quarter of the symbol area. Test with several phones, at the size and distance the code will really be used at, before printing more than a handful.

Can I change where the code points after it is printed?

Not with a static code — the destination is inside the squares, so changing it means a new code. The usual workaround is a dynamic code: the printed square points at a short URL on somebody else’s service, which redirects to your real destination and counts the scans. That buys editability and analytics, and costs a dependency, an expiry risk and on most services a monthly bill. If you control the destination URL, a static code is the more durable choice.

Who is responsible for the content the code points to?

You are. The code carries exactly the data you type - this page does not shorten, track, review or approve it, and it is only the encoder, not the author of what you paste in. The site makes no claim that a destination is legal, safe or suitable for any audience, so read the payload table under the code character by character before you print it somewhere public.

Assumptions and sources

  • Symbols follow ISO/IEC 18004 (QR Code Model 2): versions from 21 x 21 to 177 x 177 modules, four error-correction levels and a quiet zone of four modules.
  • The Wi-Fi password is kept out of the page address, so a copied link cannot carry it; very long payloads, logo embedding and colored or inverted symbols are not offered.
  • The payload is assembled and the symbol drawn in your browser; nothing is uploaded.

Last reviewed 2026-09-16. Runs locally on your device; keep backups; no financial advice applies. Read the full disclaimer.

Where a figure on this page comes from an official agency — HUD, IRS, FICO or a state body — the site keeps a dated snapshot of the source page in its sources library, and a scheduled job re-checks that snapshot, so the number can be traced back to the document it came from.