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.