The only QR code that needs no internet at all
Every other QR type is a pointer. A URL code needs a working link; a WiFi code needs a router; a vCard code needs a contact app. A plain-text code needs nothing — the message is the code. Scan it in a mine shaft, a Faraday cage, or on a device that has never had a SIM card, and the words appear.
That makes it the right choice for a surprisingly wide set of jobs: equipment serial numbers, storage box contents, dosage instructions, emergency procedures, machine settings, and anything that must remain readable when the network does not exist.
Encoding modes, and why case matters here
This is the one payload type where uppercasing your text genuinely shrinks the code, and the effect is large enough to change what size you can print at.
The QR specification defines several encoding modes. Two matter for text:
| Mode | Character set | Bits per character | Capacity at version 40, level L |
|---|---|---|---|
| Numeric | 0–9 |
3.33 | 7,089 digits |
| Alphanumeric | 0–9, A–Z, space, $ % * + - . / : |
5.5 | 4,296 characters |
| Byte (UTF-8) | Everything else | 8 | 2,953 bytes |
Alphanumeric mode packs two characters into 11 bits. Byte mode uses 8 bits each. The saving is roughly 31% — but the alphanumeric set contains no lowercase letters, no comma, no apostrophe, no question mark. A single lowercase character anywhere in the string forces the whole segment into byte mode.
So CHECK OIL LEVEL BEFORE START encodes in alphanumeric mode and produces a noticeably coarser grid than Check oil level before start, which does not. On a label that will be read at distance in poor light, that difference is worth the shouty capitals.
Real capacity, and what happens when you exceed it
The 2,953-byte figure above is the theoretical maximum: version 40, error correction level L, pure byte mode. In practice you will never want to be near it. A version 40 code is a 177 × 177 grid — over 31,000 modules. Printed at 5 cm, each module is under 0.3 mm, which is below what most phone cameras resolve reliably at arm's length.
A workable ceiling for a code that ordinary people scan with ordinary phones is roughly 300 characters. Past that, you are trading real-world scannability for the ability to say the data fits.
| Text length | Version at level M | Sensible minimum print size |
|---|---|---|
| 25 characters | 2 | 1.5 cm |
| 100 characters | 5 | 2.5 cm |
| 300 characters | 10 | 4 cm |
| 1,000 characters | 21 | 8 cm+ |
If your message is longer than a couple of sentences, the honest answer is that it should be a URL to a page, not a text code.
Non-Latin scripts and the byte cost
Text QR codes are encoded as UTF-8 in byte mode. That means the character count and the byte count diverge sharply outside Latin script:
- Latin letters, digits and basic punctuation: 1 byte each
- Accented Latin, Greek, Cyrillic, Hebrew, Arabic: 2 bytes each
- Chinese, Japanese, Korean, Devanagari, Thai: 3 bytes each
- Most emoji: 4 bytes each
A 100-character message in Japanese consumes about 300 bytes — the same budget as a 300-character English one. Emoji are the worst offenders per glyph; a decorative 🎉 costs four times what an exclamation mark does.
There is a legacy Kanji mode in the specification that encodes Shift-JIS characters in 13 bits, but support across modern scanners is inconsistent enough that UTF-8 byte mode is the safer default.
Line breaks, and how scanners treat them
You can include newlines in the encoded text and most scanners preserve them, which makes multi-line labels work:
BOILER 3
Service: 2026-04-12
Next due: 2027-04-12
Pressure: 1.4 bar
Two caveats. First, some scanner apps collapse whitespace when displaying the result, so do not rely on layout to convey meaning — use labels like Next due: rather than column alignment. Second, a newline is a byte-mode character, so a multi-line message cannot use alphanumeric mode even if every letter is uppercase.
Where a text code beats a link
Asset and equipment labels. A serial number, install date and service interval encoded directly means a technician in a plant room with no signal still gets the data. A URL there is useless.
Storage and inventory. Box contents, batch numbers, expiry dates. Cheap to produce, readable forever, no system to maintain.
Safety and procedure cards. Shut-off sequences, emergency contacts, dosage instructions. These must not depend on a server being up.
Museum and exhibition labels where the venue has poor signal and you want the caption text available regardless.
Offline data handoff. Passing a licence key, a wallet address, a configuration string or a long identifier between two devices that share no network. Typing 40 characters accurately is slow and error-prone; scanning is neither.
WiFi-free venues generally — festivals, rural sites, underground spaces, aircraft.
Where it does not
Do not use a text code when the content will change, when you want to know how many people scanned it, when the message runs longer than a few sentences, or when you want any interactivity. All of those are URL jobs. The text code's strength is permanence and independence, and permanence is a liability the moment the facts change.
Printing durable text labels
Text codes often end up in harsher places than marketing codes — workshops, plant rooms, warehouses, outdoors.
- Print dark on light, always. Inverted codes fail on a meaningful minority of scanners.
- Keep the four-module quiet zone. It is part of the specification, not a design suggestion.
- Use error correction level Q or H for anything that will be scratched, greased or weathered. Level H recovers from about 30% damage, which is the difference between a label that survives a workshop and one that does not.
- Laminate or use polyester labels outdoors. Plain paper under UV fades to a grey-on-grey that no camera can resolve.
- Print the text underneath as well, in small type. If the code is ever destroyed, a human can still read the serial number. This costs nothing and has saved a great many people a great deal of time.
Frequently asked questions
How much text can one QR code hold?
The theoretical maximum is 2,953 bytes in UTF-8 byte mode, or 4,296 characters if the text is limited to digits, uppercase letters and a handful of symbols. The practical maximum for something people will actually scan with a phone is around 300 characters — beyond that the grid becomes too fine to read reliably at printable sizes.
Does uppercasing my text really make the code smaller?
Yes, for plain text. Uppercase letters, digits, space and the symbols $ % * + - . / : qualify for alphanumeric mode, which is about 31% more efficient than byte mode. One lowercase letter, comma or apostrophe anywhere in the string cancels the benefit for that segment.
Can I include emoji and non-English characters?
Yes — the text is encoded as UTF-8. Be aware of the byte cost: Cyrillic and Greek characters take 2 bytes, CJK characters 3, and most emoji 4. A short message in one of those scripts can consume the same capacity as a much longer English one.
Do line breaks survive scanning?
Usually. Most scanner apps preserve newlines, though some collapse whitespace when displaying results. Label your fields explicitly rather than relying on visual alignment to carry meaning.
Will a text code work without internet?
Completely. The message is stored in the image itself, so there is no lookup and nothing to fetch. This is the main reason to choose plain text over a URL for equipment labels, safety cards and inventory tags.
Can I edit the message after printing?
No. The text is baked into the pattern — changing it means generating and printing a new code. If the content is likely to change, encode a URL to a page you control instead.
Is my text sent to your servers?
No. The encoding happens in your browser with JavaScript. Whatever you type into the field stays on your device, which matters if you are encoding serial numbers, keys or anything else you would rather not transmit.