The smallest QR code: why a link can fit in 21×21
A QR code can't get smaller than 21×21 modules. Most link QR codes are 25×25 or bigger. Here's how we fit a working, editable link into the minimum.
QR codes come in 40 sizes
The QR standard (ISO/IEC 18004) defines versions 1 to 40. Version 1 is 21×21 modules and every version adds 4 modules per side, up to 177×177. An encoder picks the smallest version that fits your data at the error-correction level you chose. Less data means a smaller version.
Why smaller is better
A printed QR code is a fixed size: a sticker, a table tent, a corner of a flyer. At that size, fewer modules means each module is bigger. At the same width, a 21×21 code has modules 19% wider than a 25×25 code and 57% wider than a 33×33 one. Bigger modules scan from further away, in worse light and on older cameras. Or you can print the code smaller and it still works.
Trick 1: send people to a short link
A dynamic QR code doesn't hold your real link. It holds a short link on our domain, HTTPS://QEX.ME/AB3XK, and our server redirects each scan to wherever you point it today. That's what makes it editable, and it also keeps the data short, however long your real link is.
Trick 2: capital letters
QR codes have several ways to store text. Byte mode handles any character at 8 bits each. Alphanumeric mode only handles 45 characters (0–9, A–Z, space and $%*+-./:) but stores two of them in 11 bits, about 5.5 bits each. It has no lowercase letters.
A version 1 code at error correction M holds 14 characters in byte mode but 20 in alphanumeric mode. https://qex.me/ab3xk is 20 characters, so in lowercase it needs byte mode and version 2 (25×25). Written as HTTPS://QEX.ME/AB3XK it fits alphanumeric mode, and version 1.
Capitals are safe here because the URL standard (RFC 3986) makes the scheme and host case-insensitive, so browsers treat HTTPS:// like https://. The path is the only case-sensitive part. We only use A–Z and 0–9 in code IDs, and our redirect server uppercases the path before it looks one up.
The budget: 20 characters
| Part | Example | Characters |
|---|---|---|
| Scheme | HTTPS:// | 8 |
| Domain + slash | QEX.ME/ | 7 |
| Code ID (A–Z, 0–9) | AB3XK | 5 |
| Total | 20 / 20 |
That's why we picked a short domain. Five characters from A–Z and 0–9 give 36⁵, about 60 million codes, and every one still fits in 21×21.
What costs you the small size
A logo in the middle. A centre logo covers modules, so the code needs error correction H (about 30% recovery) instead of M (about 15%). At H the same link needs version 2, 25×25. Lowercase or a longer domain. Either pushes you past the 20-character budget. Tracking parameters in the QR itself. With a dynamic code, add them to the destination instead, and change them any time.