Skip to main content
OpenQRS
Tools
Current language: English
100% Private

Plain text QR code generator

100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.

Plain text settings

Up to 3,000 characters here. The real ceiling is one symbol: 2,953 bytes at level L, 2,331 at M, 1,273 at H.

Enter the text the code should display.

Design

Module shape
Presets
Corner frame
Add a centre logo
Choose an image, or drop one herePNG, JPEG, WebP or GIF, up to 1000 KB

The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.

More design options

The dark half of the code. Keep it well below the background in lightness.

Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.

Contrast 11.5:1 between the modules and the background.

Presets

PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.

Gradient

A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.

The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.

45°

Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.

Module shape

Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.

Corner frame

The ring of the three finder patterns.

Corner centre

The eye inside each finder pattern.

4 modules

The blank margin around the code, measured in modules. 4 is the specified minimum.

Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.

A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.

Live preview & export

Export

Export

Raster, for screens

Complete the form to enable the downloads.

Export size and encoded text
Payload
Nothing encoded yet
Symbol
Not built yet
Recovery
M

Waiting for input

Export size

Between 64 and 4096 pixels. Exporting at 1024 px.

Encoded text

Plain text is the one QR payload that asks nothing of the network: the words are inside the printed square. Scanners display them and stop there, with no link to follow and nothing to load.

When someone scans it

The reader displays the text as text. No app opens, no page loads, and no connection is needed.

The only payload that needs no network

Every other format on this site ends in something being fetched or dialled. Plain text does not. The characters are in the modules, so a code on a valve in a basement, a label in a cold store or a card in a museum case reads the same with no signal, no data plan and no working DNS.

It is also the payload with no attack surface. A reader that shows text cannot be talked into visiting a page, so a plain-text code cannot be swapped for a phishing destination without the swap being visible in the words themselves.

  • Maintenance instructions printed on the equipment they describe
  • Asset tags, serial numbers and shelf locations that survive a warehouse with no coverage
  • Wine or exhibit notes where a link would be one step too many

How much fits, and what it costs in print size

Fourteen bytes fit a version 1 symbol at recovery level M — 21 modules across, the smallest QR code there is. Three hundred characters need version 13, 69 modules across. The ceiling at level M is 2,331 bytes, which is version 40 at 177 modules across.

Those module counts are the whole story for printing. At one printed width, a 177-module symbol has modules roughly an eighth the width of a 21-module one, so it needs either a much larger print or a much closer camera. Anything going onto a label smaller than a postcard is better kept under about 300 characters.

The live counter beside the field tracks bytes rather than characters, because bytes are what the symbol actually holds.

  • 14 bytes: version 1, 21 modules across
  • 300 characters: version 13, 69 modules across
  • 2,331 bytes: version 40 at level M, 177 modules across and the end of the format

Line breaks, accents and older scanners

Line breaks are encoded as written and most readers show them as separate lines, which makes a short list or an address block practical. Leading and trailing whitespace is kept, because in a serial number it may be meaningful.

Byte mode is specified as ISO-8859-1, but in practice readers assume UTF-8 and current phone cameras decode it correctly. A fixed-mount industrial scanner from an earlier generation may still show an accented character as two wrong ones, so test on the device that will actually read it.

Non-ASCII characters cost more than one byte each: é is two bytes in UTF-8, a CJK character is three, and a pictograph is four. That is why the character count and the byte count diverge as soon as you leave plain ASCII.

Questions and answers

How much text can one QR code hold?

2,953 bytes at recovery level L, 2,331 at M, 1,663 at Q and 1,273 at H. In plain ASCII that is one byte per character; accented and CJK characters take two to four each.

Will my line breaks survive the scan?

They are encoded faithfully, and most readers render them as separate lines. A few compact readers collapse everything into one paragraph, so do not rely on line breaks to carry meaning that the words themselves do not.

Does it work with no signal?

Yes. This is the only payload here that needs nothing from the network at any point. The text is in the printed symbol.

Why was my text rejected when the counter was under 3,000?

Either it contains multi-byte characters, so the byte count is higher than the character count, or the recovery level is set above L. Level H holds 1,273 bytes against the 2,953 available at L.

How a static QR code works

Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.

Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.