Gift Tag QR Code

"To" and "From" fit on any tag — the part you actually want to say never does. Put it in the code: a private message that appears when they scan, or a link to the video where you explain why this gift, why now. The classic frame recolors to match your wrapping paper, the caption line says "For you", and the artwork is decode-verified in your browser before you print a sheet of them.

Message details

How it opens

A frame leaves the code untouched, so it can carry a lighter error-correction level — usually one or two sizes smaller, which matters on a gift tag. It still has to pass the same decode check before you can download it. Not available with heart modules or a photo weave, which spend that margin on the decoration.

Colors only touch the frame art — the code itself stays black on its white panel.

Fill in the form — your keepsake appears and is verified as you type.

Codes render on light backgrounds for reliable scanning.

What the code contains
 

Delivery unlocks only after this exact render is decoded back to your content — the decode-verify promise.

Keep this keepsake

Saves the verified artwork to this browser only — no account exists on this site. Find it later under My keepsakes.

A worked example, rendered by the real engine

For you

Built at build time by the engine behind the tool above — classic frame in a wrapping-red, message inside the code. Scan it from the screen and it reads:

This one took months to find. I hope it makes you laugh as hard as Lisbon did. - M

Version 8 at 49×49 modules, error correction H. No internet involved — the words live in the modules.

What the gift tag preset encodes

Every occasion on this site is one entry in a single registry: a starting style, a payload type, and the placeholders the form opens with. The gift tag preset starts on the Classic frame style with a hidden message as its payload, a frame colour of #b91c1c, and the caption placeholder “For you”. The sample message in the form is fictional, as is every example on this page. The generator above and the worked example beside it were produced by the same engine from the same registry entry, so at the preset's starting settings the two cannot describe different things.

A message payload is handed to the encoder unchanged, and the verifier later compares the decoded bytes against the UTF-8 bytes of your exact content, so accents and punctuation round-trip. The worked example encodes 82 characters (82 bytes) and the encoder chose version 8: a 49×49-module symbol at error correction H, roughly 30% recovery. That version number is the single figure to watch while you type. Each version step adds 4 modules to every side — derived here from two symbols the engine encoded for this page, not typed — and at any fixed print size the modules get smaller as the version climbs.

How the message opens is the choice that matters most on a tag, because a code containing bare text carries no scheme and a phone has nothing to act on. Apple's Camera and Google's ML Kit recognise links, phone numbers, email addresses, contact cards, calendar events and Wi-Fi joins — and no plain-text type. Faced with bare text, an iPhone offers to copy or search it and Google Lens runs a web search; Samsung phones and dedicated scanner apps do display it, but a keepsake cannot depend on which phone opens it. The form therefore offers a reveal link by default: a normal URL to a page on this site, with the message carried in the URL's fragment after the #. Per RFC 3986 a fragment is stripped before a request is made, so the words never reach a server, a CDN or a log; they are decoded on the reader's device. An offline note writes the words into the code itself and needs no connection ever, accepting the display caveat above. On a framed keepsake, leaving the caption empty prints the message under the code in either mode; a caption you type replaces it. The worked example above was rendered with the caption “For you”, so those are the only words under its code and the message lives in the modules alone — leave the caption field empty in the generator and the message takes its place. Every message keepsake can also be downloaded as a self-contained HTML file that decodes the fragment format with no network and no website at all. The message keepsakes guide walks the format through character by character.

The classic frame, by construction

A framed code is the engine's safest style because the code is never modified: the rendered symbol, quiet zone included, is nested verbatim on an opaque panel drawn above the frame art, so decoration cannot touch a module. The geometry is fixed by the engine and was measured for this page at build time. The artwork is 760 units wide and 880 tall; the panel is a 460-unit square placed 240 units from the top; and the code inside it spans 57% of the artwork's width. Everything outside the panel — the double border, the corner marks, the caption — is decoration the code does not depend on.

The frame templates are heart, floral, ring, classic, confetti, all recolourable vector art. The preset's wrapping-red is only the starting value of the frame-colour control; recolouring changes the strokes and the caption, never the modules, which stay black on the white panel at a measured 21:1 contrast. Heart-shaped modules can be switched on inside the frame — the misreadings below cover the contrast gate that then applies.

The anatomy rule still governs what sits on the panel. Classifying every cell of the worked example with the engine's own classifier gives 147 finder cells, 150 alignment cells in 6 alignment patterns centred on rows and columns 6, 24, 42, 60 timing cells and 2044 data cells; 1214 of the 2401 cells are dark. Finder and alignment patterns are always rendered as classic, crisp squares, because restyling alignment patterns broke decoding outright in testing; timing tracks may be styled; the 4-module quiet zone is always drawn and never covered by frame art. A framed code restyles none of them, which is why this is the style the gift tag preset starts on. The framed codes guide covers the panel and the templates in detail, and the methodology page holds every rule with the measurement behind it.

From download to a tag on the bow

  1. Write short, then read the version. The readout under the preview reports the version the encoder chose. The engine's comfortable ceiling for the objects these codes go on is 65 modules across, quiet zone included; the worked example sits at 57, and the sizing section below shows how quickly a longer message or a reveal link approaches that line.
  2. Match the paper with the frame colour only. The colour control recolours the frame art; the code stays black on its white panel, so no colour you pick for the frame can change whether the tag scans.
  3. Export, and read the size readout for what it is. Each PNG preset carries a readout computed at 300 DPI: a 512 px square prints at 43.3 mm; a 1024 px square prints at 86.7 mm; a 2048 px square prints at 173.4 mm. That readout describes how large a raster comes out; it is not a verdict on whether the code is large enough — the engine's minimum, below, is. The SVG scales without a pixel limit.
  4. Scan a test print with a real phone. On-screen verification proves the artwork decodes at screen resolution and cannot see your printer, your paper or the phone that will do the scanning. Print at least 2 × 2 cm of code for arm's-length scanning, keep the quiet zone uncropped, and scan one finished tag before the batch.

Printing and scanning a keepsake is the full guide to module sizes, quiet zones and test prints; this section applies its numbers to a tag.

The engine's working minimum for one module in print is 0.5 mm, so the smallest reliable print of a symbol is its total module count times that figure. For the worked example that is 57 modules × 0.5 mm = 28.5 mm wide, quiet zone included — the engine's own readout says “print at least 28.5 mm (1.12 in) wide”. The methodology's floor of 2 × 2 cm applies as well; whichever is larger governs, and for this example that is 28.5 mm.

On a framed tag the code is only part of the artwork. Because the code spans 57% of the artwork's width, the whole classic-framed artwork for the worked example must print at least 51 mm wide — rounded up to a whole millimetre — for the code inside it to meet that floor. The frame does not count toward the code's size, however large it is printed. Shorter messages shrink this: the fictional sample in the next section needs only 49 modules as an offline note, a 24.5 mm code — still above the 2 × 2 cm floor, so the engine’s figure governs, at 24.5 mm.

The engine also flags a code as oversized once it exceeds 65 total modules, the point at which a printed keepsake stops fitting the objects these codes go on. The worked example, at 57, is not flagged. The same words sent as a reveal link encode to version 13, 77 total modules — flagged oversized, with a minimum print of 38.5 mm. On a tag the first lever is the message length. The engine's frame rule adds a second, opt-in one: because a framed code is never modified, the frame accepts a level-Q symbol when heart modules are off — the generator's “Smaller code (less error correction)” control — and the worked example re-encoded at level Q is version 7, 53 total modules, a 26.5 mm minimum print: 1 version smaller than the level-H symbol above. Hearts and photo codes spend that margin on their decoration and stay at H — the engine refuses a level-Q model for heart modules, checked at build time — and a level-Q render still has to pass the same decode verification before it can be downloaded.

The same words as a reveal link and as an offline note

Take an original, fictional message — “Open the small box first. It explains the big one. - J” — 54 characters of the 300 a reveal link accepts. The reveal encoder turns it into a fragment of 89 characters: the flag A (the payload is uncompressed UTF-8 bytes), 87 characters of unpadded uppercase base32, then the checksum character Y computed over the payload. The complete link, 118 characters, reads:

https://KEEPSAKECODES.NET/M/#AJ5YGK3RAORUGKIDTNVQWY3BAMJXXQIDGNFZHG5BOEBEXIIDFPBYGYYLJNZZSA5DIMUQGE2LHEBXW4ZJOEAWSASQY

Base32 rather than base64 because some scanners change the case of what they read, and base32 survives that; its alphabet is also a subset of the QR alphanumeric character set, which encodes at 5.5 bits per character instead of 8. The checksum turns an altered link into a clear message instead of gibberish. The generator above hands the encoder no compressor, so every link it produces carries flag A, exactly as this build-time example does; the format reserves B for raw-deflate compressed payloads, and the reveal page decodes either. Given a compressor, the encoder computes both encodings and keeps the shorter base32 payload. Measured at build time for this message, raw-deflate turns 54 bytes into 53, and the compressed payload, 85 base32 characters against 87, would win and the flag would become B.

Encoded by this engine at level H, the offline note for this message is version 6 (41×41 modules) and the reveal link is version 10 (57×57). The link pays for the URL and the base32 expansion; the note pays with the display caveat. Their minimum prints differ accordingly: 24.5 mm against 32.5 mm, quiet zone included. Neither choice changes the frame, the verification, or the caption rule: on a framed tag with the caption left empty, the words are printed under the code in either mode.

What verification proves on a tag, and what it cannot

After each render your browser rasterises the finished artwork — frame, panel, caption and code — and runs a real decoder, jsQR, on the pixels at 800, 1200, 1600 px. A render can fail at exactly one raster size through sampling resonance and decode cleanly at the others, so the badge is earned when at least 2 of the 3 rasters decode to an exact byte match against your content. A match shows “Verified scannable”; anything else shows a warning and keeps the downloads locked, so an unverified render cannot leave the page as a finished tag. The engine's test suite runs the same loop at several raster sizes, rotated, and after lossy JPEG recompression, which is what pins the measured decode limits this page quotes — the heart coverage and the anatomy rule.

What the badge proves is narrow and exact: this artwork, at screen resolution, decoded back to these bytes. It cannot see your printer, your paper, or the phone that will do the scanning, and it does not know how large you will print. That is why the sizing figures above and a test print with a real phone are part of the method rather than an afterthought. The decode verification guide explains the raster rule; the printing and scanning guide covers the test print.

Common misreadings on a tag

Cropping or punching into the quiet zone. The 4-module clear margin around the code is part of the symbol, and on this frame it is inside the panel, not outside it. Trimming the artwork to the panel's edge, or punching a hole through the panel, removes part of what a scanner locates. The band of frame art above the panel is 240 units of pure decoration; a hole there removes nothing the code needs.

Expecting bare text to display. An offline note is bare text, and the dispatch facts above apply: an iPhone offers to copy or search it and Google Lens runs a web search, while Samsung phones and dedicated scanner apps display it. This is the reason the reveal link is the default, and the reason a framed tag with its caption left empty prints the message under the code in either mode — a caption you type replaces it.

Low-contrast heart colours. Switching on heart-shaped modules inside the frame redraws each dark module outside the finder and alignment patterns as a heart spanning 0.97 of its cell, and the engine then requires at least 4.5:1 WCAG contrast between the heart colour and the panel, rejecting weaker pairs rather than warning. Measured at build time against the white panel:

  • the preset’s heart colour (#881337) measures 9.57:1 and is accepted.
  • the preset’s frame red, if used as a heart colour (#b91c1c) measures 6.47:1 and is accepted.
  • a fictional pastel pink chosen to match the paper (#f9a8d4) measures 1.81:1 and is rejected.

The pastel fails the gate and the preset's heart colour passes it — as its frame red would, were it used as a heart colour — asserted at build time, so this sentence cannot drift from the measurement. The gate is never run on the frame colour itself: it has no contrast rule because it touches no module, and that is where a paper-matched colour belongs.

Reading the PNG readout as a guarantee. The 300 DPI readout describes the raster; the engine's minimum print size prescribes. They answer different questions, and only the second says whether a tag-sized print will scan. See all guides for the rest of the engine's rules.

Gift tag code FAQ

Message in the code or a link — which does the gift tag preset use?

The preset starts on a hidden message: the words themselves are the payload, encoded as a reveal link by default or as an offline note if you choose. A link is the other option in the form — a page, an album or a video you host — and it is a normal URL inside the code, encoded directly with no shortener or redirect, so it keeps working as long as the destination does. Whichever you choose, the version readout under the preview tells you what the choice costs in modules.

Where can a hole go without touching the code?

Only the panel carries the code and its quiet zone. On the classic frame the panel is a 460-unit square starting 240 units from the top of an artwork 880 units tall, and the code inside it spans 57% of the artwork's width; everything outside the panel is decoration the code does not depend on. A hole through the panel removes modules or quiet zone; a hole through the frame art removes decoration only.

How small can a gift tag code go?

The engine's working minimum is 0.5 mm per module, so the worked example — 57 modules across with its quiet zone — must print at least 28.5 mm wide, and the whole framed artwork at least 51 mm wide — rounded up to a whole millimetre — for the code inside it to reach that. The methodology also asks for at least 2 × 2 cm of code for arm's-length scanning; the larger figure governs. Fewer characters mean a lower version and a smaller minimum.

Why might a phone show a search prompt instead of the note?

Because an offline note is bare text, which carries no scheme. Apple's Camera and Google's ML Kit recognise links, phone numbers, email addresses, contact cards, calendar events and Wi-Fi joins — and no plain-text type — so an iPhone offers to copy or search the text and Google Lens runs a web search. Samsung phones and dedicated scanner apps do display it. The reveal link exists for exactly this: it is a normal URL, and the message rides in the fragment that is never sent to a server.

Can I print one code for every present?

Yes. The download is yours to print any number of times, and a different message for each present means generating each tag separately, since the message is the payload. Every render is verified on its own — the badge belongs to one artwork and one set of bytes — and nothing you type leaves your browser, and nothing is stored unless you choose Save to this device.

Does the frame colour affect whether the tag scans?

No. Colours only touch the frame art; the code stays black on the white panel, a measured 21:1 contrast, and the frame is drawn below the opaque panel so it cannot reach a module. The contrast rule — at least 4.5:1 — applies to heart modules if you switch them on inside the frame, where the engine rejects weaker pairs rather than warning.

What does "Verified scannable" prove for a printed tag?

That this exact artwork, rasterised in your browser at 800, 1200, 1600 px, decoded back to your exact content on at least 2 of those rasters. It proves the decoration did not break the code at screen resolution. It cannot see your printer, your paper or the scanning phone, so print one tag, keep the quiet zone uncropped, and scan it with a real phone before the batch.

Can the message itself be printed under the code?

The engine refuses a caption longer than 200 characters outright — checked at build time with a caption one character over the limit. Within the limit the caption wraps to at most 4 lines, and anything beyond those lines is dropped with the last line ending in an ellipsis, so a clipped caption never reads as the whole message. Measured on this page's classic frame: the 54-character sample message sets on 2 lines in full; a 200-character caption at the limit, built by repeating it, sets on 4 lines and ends in an ellipsis. On a framed keepsake, leaving the caption empty prints the message under the code in either message mode, so the tag still reads by eye whatever phone opens it; a caption you type replaces it, as “For you” does on this page's worked example.

Tagging a valentine? The valentine code makes the message itself out of hearts. Wrapping a reveal? The baby reveal code choreographs the scan-together moment — and a treasure hunt can make them earn the box first.