All posts

The 26-character cliff: how one character decides scan distance

7 min readPrintingEngineering notes

2425²2525²2625²2729²2829²2929²MODULES PER SIDE vs URL CHARACTERSthe cliffONE CHARACTER · 14% SMALLER MODULES · FOREVER

This is the story of why our short domain is go.qr-m.in and not something prettier — and of a number we got wrong first, which is exactly why it's worth writing down. It's also the single highest-leverage fact in QR printing that almost nobody uses: URL length is not cosmetic. It sets the physical size of every module you will ever print.

Versions grow in steps, not slopes

A QR code's grid comes in fixed sizes called versions: 21×21, 25×25, 29×29, and so on. Data doesn't stretch a grid gradually — it fits in a version or it spills into the next one whole. At error correction level M, a URL of up to 26 characters fits version 2: 25×25 modules. The 27th character tips the whole code into version 3: 29×29. Same print size, 14% smaller modules, every module — and the module is the thing a camera sensor must resolve at distance.

https://go.qr-m.in/aB3xY9z26 chars25×25 — every module largerhttps://link.example/aB3xY9z28 chars — over the boundary29×29 — 14% smaller modules
The same artwork at the same physical size, one character apart. The 26-character URL keeps 25 large modules per side; 28 characters forces 29 smaller ones. The sensor feels the difference before you do.

The mistake that taught us the boundary

For months, an internal note claimed our older subdomain hit the good side of this boundary. It didn't — the measurement had been taken on the bare hostname, not the full URL a code actually encodes, and the domain had been paying for version 3 the whole time it was described as efficient. The correction produced the rule we now apply to everything: measure the encoded payload, never a part of it. https://go.qr-m.in/ plus a seven-character slug is 26 exactly — one character of margin, held on purpose, forever. It is also why the size calculator encodes your literal content instead of quoting tables.

What 14% buys in the world

Module size converts directly into scan distance and print tolerance. Larger modules scan from further away under the 10:1 rule, survive ink spread on cheap stock, and forgive the slight blur of a moving hand. On a 20 mm packaging code, the cliff is the difference between modules at 0.61 mm and 0.53 mm — right around the floor where print physics starts eating codes.

30 cm — in hand≥ 30 mm60 cm — tabletop≥ 60 mm1.5 m — poster≥ 150 mm3 m — banner≥ 300 mmSCAN DISTANCE ÷ 10 = MINIMUM PRINT WIDTH
Why module size is scan distance: the 10:1 rule fixes how much printed width a distance demands, and the version decides how many modules must share it.

How to use this on purpose

  • Count your full URL, with the scheme. https:// is eight characters of your budget before the domain starts.
  • Choose short domains like you choose print stock. A vanity domain two characters too long taxes every code printed on it, forever. (This is also a design constraint on branded domainsqr.yourbrand.com beats codes.yourbrandname.com by a whole version, sometimes two.)
  • Static codes feel this hardest. They encode the entire destination, so a long landing-page URL can cost two versions at once — one argument for a dynamic code's constant-length short URL on anything print-critical.
  • Error correction moves the thresholds. The 26/27 boundary above is level M; at level H (mandatory with a logo) the steps land earlier. The principle holds; the numbers shift — measure.

One character, measured honestly, is the cheapest print-quality upgrade in this entire field. The second cheapest is checking the result: run the finished artwork through the scannability checker and the margin the cliff left you becomes a number instead of a hope.