Error correction, chosen for print

A QR code carries more data than its message needs. The surplus is error correction: redundancy so a partially obscured or imperfectly printed symbol still scans. The methodology page states the studio's position in one sentence — keepsake codes default to a higher error-correction level than screen-only codes need, because keepsakes are printed, framed behind glass, photographed at an angle, and read in candlelight. This guide shows the rule behind that sentence as the engine enforces it, what decoration spends, and what the print-size readout does and does not say. Every figure below was computed when this page was built, by the same engine that runs in the Studio, on fictional inputs.

Four levels, and what the engine does with a request

The encoder offers error-correction levels L, M, Q and H, in rising order of redundancy. H is the highest the encoder offers, and the only figure this site attaches to it is the one in the engine's own header: the ~30% recovery of EC-H. The lower levels recover less and produce smaller — or at most equal-sized — symbols for the same content.

Two encoder details matter for reading the numbers here. First, the level actually encoded is never lower than the level requested, but it may be higher: when raising the level does not increase the symbol's version, the reference encoder raises it for free. The fictional short link below, requested at level L, encodes at level M as a version-2 symbol. Second, a symbol's version is its size class. A version-4 symbol is 33 modules on a side; a version-11 symbol is 61. Every version step adds 4 modules to each side, and the quiet zone — 4 blank modules on every edge, required by the standard — is always rendered on top of that and cannot be switched off.

The rule: level H for every artistic style

The artistic engine's first production rule reads: error correction is H for every artistic style, without exception, because decoration spends decode margin and only the ~30% recovery of EC-H leaves enough. It is enforced, not advised. Each artistic entry point inspects the model it is handed and refuses a non-H one. Rendering heart modules from the fictional long link encoded at level M produces this rejection, quoted from the engine:

Artistic styles require error correction level H — re-encode with ecLevel "H".

The shared QR core underneath can encode at L, M, Q or H and defaults to M when nothing is asked of it, but every artistic style — frames, heart modules and photo-woven codes — passes through the artistic engine's guard first, and, as the studio page states, every studio style encodes at error-correction level H. The features page lists the module styles and frames on offer.

What decoration spends

Each artistic style takes something from the symbol, and each has a measured rule that bounds what it takes.

  • Heart modules. Every dark module outside the finder and alignment patterns — timing modules included — is drawn as a heart spanning 0.97 of its cell, so a scanner's sampling grid still reads the cell as decisively dark. The corner finder patterns and the alignment patterns stay classic squares — restyling alignment patterns breaks decoding outright. The fictional short link's version-4 symbol carries 1 alignment pattern; the long link's version-11 symbol carries 6 alignment patterns.
  • Photo weaving. Each data cell is split into a ring that shows the photo in three tones and a pure module-coloured centre at 0.5 of the cell side, which the scanner treats as authoritative. Denser symbols shrink that centre, so the engine caps photo-woven codes at version 4 — about 34 plain characters, fewer with emoji or accents. Asking it to weave a photo into the fictional long link's version-11 symbol returns:

    Photo-woven codes need short content — use a short link or pick another style. This content needs a version-11 code; photo weaving is decode-proven only up to version 4 (about 34 characters, fewer with emoji or accents).

  • Module colour. Pale modules cost margin just as decoration does. The shared engine warns when the foreground-to-background contrast ratio falls below 4.5:1 and when a code is inverted; the artistic engine goes further and rejects. Using the classic frame's secondary tone (#9ca3af) as a module colour on white measures 2.54:1. The plain renderer's warning reads: Low contrast (2.54:1). Scanners may fail below 4.5:1 — darken the foreground or lighten the background. Heart modules in that colour are refused outright: Artistic styles require at least 4.5:1 contrast (got 2.54:1) — decoration already spends decode margin. The default heart foreground, by contrast, measures 9.57:1 on white.
  • Frame art. Frames spend nothing. The rendered code sits on an opaque panel drawn above the frame art, so a recoloured frame cannot touch a module by construction. That is why the three palette inputs are free to change while the rules above are not — the composition guide covers the palettes.
Heart modules on the fictional short link — a version-4 symbol at level H, 41 modules across including the quiet zone

Denser symbols for longer destinations

The methodology's honest trade-off — more redundancy means a denser symbol, so very long destinations plus high correction can produce codes that need to be printed larger — is arithmetic the encoder performs on every payload. Redundancy and content compete for the same modules. When they no longer fit, the encoder steps up a version, and the symbol gains 4 modules on each side. The table encodes four fictional payloads at every level; each cell shows version and side in modules, before the quiet zone.

Fictional payload Characters Level LLevel MLevel QLevel H
Short link 25 v2 · 25 × 25 (encoded M)v2 · 25 × 25v3 · 29 × 29v4 · 33 × 33
Medium link 45 v3 · 29 × 29v4 · 33 × 33 (encoded Q)v4 · 33 × 33v6 · 41 × 41
Long link with query string 137 v7 · 45 × 45v8 · 49 × 49v10 · 57 × 57v11 · 61 × 61
Plain-text message 82 v5 · 37 × 37 (encoded M)v5 · 37 × 37v7 · 45 × 45v8 · 49 × 49

Read across a row and the symbol never shrinks as the level rises; read down the level-H column and it grows with the payload. The short link at H is 33 modules on a side, 41 with the quiet zone; the long link at H is 61, or 69 with the quiet zone. A cell marked "encoded" shows the encoder's free upgrade to a higher level at the same version. Because the Studio's artistic styles require H, the right-hand column is the one that describes a keepsake, and the only lever left to a composer is the length of the destination.

Reading the print-size readout

When a PNG is exported, the engine reports its print size at 300 DPI. The arithmetic is pixels divided by 300 for inches, and inches converted to millimetres. For the pixel presets the engine defines, the readouts are:

  • 512 px — 1.71 in × 1.71 in (43.3 mm × 43.3 mm) at 300 DPI
  • 1024 px — 3.41 in × 3.41 in (86.7 mm × 86.7 mm) at 300 DPI
  • 2048 px — 6.83 in × 6.83 in (173.4 mm × 173.4 mm) at 300 DPI

The readout describes the whole image, quiet zone included, and says nothing about the modules inside it. At the 1024 px preset, which prints at 86.7 mm across, each module of the fictional short link's version-4 symbol is about 2.11 mm wide, while each module of the long link's version-11 symbol is about 1.26 mm. Same pixel size, same print size, smaller marks for the scanner to resolve — which is exactly what "may need to be printed larger" means in practice. The SVG export scales to any print size, but its module count is the same.

What the readout is not: a scan guarantee at that size. The studio does not model print-shop colour fidelity — in the methodology's words, printers, papers, and inks vary. Test a proof print before a large run.

Where the rule stops

Level H protects the symbol itself. It does nothing about the three things the methodology lists as not modelled.

  • Destination longevity. The studio verifies the format of what you encode, not the future of the service it points to — for the longest-lived keepsakes, point codes at destinations you control.
  • Colour fidelity in print. Contrast is measured on the hex values you chose; what a printer puts on paper is outside the engine; whether a print reproduces it is the proof print's question.
  • Scan counting. Error correction changes nothing about this: static codes cannot report scans, and the studio adds no tracking to your destinations.

Nor is level H the verification step. Every artistic render is rasterised in your browser at 3 sizes (800, 1200, 1600 px) and decoded back; the "Verified scannable" badge is earned only when at least 2 of those rasters decode to an exact byte match with your content. The verification guide walks through its verdicts.

Common misreadings

  • "H means roughly a third of the picture can be covered." The ~30% figure is a codeword-recovery ceiling, not a fraction of the symbol's area; the shared core's note on its logo cap is explicit: a centred knockout produces burst erasures that consume the margin much faster.
  • "A longer link only makes a bigger file." It makes a denser symbol — more and smaller modules at any given print size — as the table shows. File size is a separate matter.
  • "The frame's colours affect scanning." They cannot reach the code. Module colour can, and the engine measures and rejects it when it falls below 4.5:1.

Questions about error correction

Why is every artistic keepsake code encoded at level H?

Because decoration spends decode margin. Hearts and a woven photo both take something away from what a scanner sees, and the engine's rule is that only the ~30% recovery of EC-H leaves enough. The rule is applied to every artistic entry point — including the framed composite, whose guard refuses a non-H model even though frame art cannot reach a module.

Can I choose a lower level to get a smaller code?

No — every studio style encodes at level H, as the studio page states; for artistic styles the engine additionally refuses a non-H model. The encoder never lowers error correction below what was requested; it may raise it when that does not change the symbol's version. Shortening the destination is what makes a symbol smaller.

What does a "version-11" symbol mean?

The version is the symbol's size class: a version-11 code is 61 modules on a side, and every version step adds 4 modules to each side. The quiet zone of 4 modules on every edge is always rendered on top of that and cannot be disabled.

Does the print-size readout mean the code will scan at that size?

No. The readout is arithmetic: pixels divided by 300 gives inches, and millimetres follow. It says how large a PNG prints at 300 DPI, not whether a print at that size scans; only a proof print answers that — verification is a verdict on pixels your browser produced, as the methodology states.

Why do photo-woven codes need such short content?

Each data cell keeps a pure module-coloured centre at 0.5 of the cell side, and denser symbols shrink that centre. The engine therefore rejects any payload that would encode above version 4 — about 34 plain characters, fewer with emoji or accents.

Do the frame colours affect error correction?

No. Frame art is drawn below an opaque panel that carries the code untouched, so recolouring a frame cannot reach a module. Module colour is different: the engine requires at least 4.5:1 contrast between modules and background for an artistic style and rejects anything paler.

Part of the Studio guides. Every figure on this page was produced at build time by the engine that runs in the editor; composition and verification happen in your browser. The methodology page documents the rules this guide describes and what the studio deliberately does not model.