Memorial QR Code

A small framed code on a memorial card, opening a page about a life. The memorial preset starts on the classic frame in charcoal, encodes a link, and carries a name and dates on its caption line. The link is written directly into the modules, with no redirect service and no subscription in the loop, and the artwork is decode-verified in your browser before you download it.

Link details

The link is encoded directly — no shortener, no tracking, and it never expires.

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

Rose Delgado · 1941–2026

Rendered at build time by the same engine as the tool above — classic frame in charcoal, the code untouched on its panel. It encodes:

https://example.com/remembering-rose

Version 5 at 37×37 modules, error correction H — the maximum, chosen so weathering has margin to spend.

This page documents the memorial preset: what it encodes, which measured rules of the engine apply to it, and what the verification badge does and does not prove. The mechanism behind putting words rather than a link into a code — reveal links, offline notes and the published fragment format — has its own guide, Message keepsakes and reveal links, and the rest of the engine's rules are collected under guides and on the methodology page.

What the memorial preset encodes

Every occasion on this site is an entry in the engine's occasion registry, and that registry is shared by consumers that must never disagree: the generator, which renders its form from the presets and reads the same data to switch occasions live; the occasion pages, which render their worked examples from it at build time, so that a failure fails the build; and the test suite, which decodes every occasion example and every style thumbnail, so a preset that stops scanning cannot ship. The memorial preset's entries are plain. Its style is the classic frame, its content type is a link, and its caption placeholder is a name and two dates — Rose Delgado · 1941–2026, a fictional person used throughout this page. The registry records why that caption was chosen: a memorial is the one keepsake most likely to outlive this site, the linked page and the phone that scans it, so the caption carries the name and dates deliberately, and whatever happens to the code the card still says who it is for.

A link payload passes through the engine's URL builder, which validates and never rewrites beyond trimming. It requires a protocol — https:// or http:// — and rejects anything else; put to it at build time, the worked example's own address with its scheme removed was refused with Include the protocol (e.g. https://) so scanners recognize the link.. The string that reaches the encoder is the string you typed, trimmed of surrounding whitespace and otherwise unchanged. The worked example encodes https://example.com/remembering-rose, a 36-character address. Handed to the encoder at error correction level H, it becomes a version 5 symbol of 37 × 37 modules; with the mandatory 4-module quiet zone on every side, the artwork the panel carries is 45 modules across. Those figures were produced when this page was built, by the encoder the tool above runs, and they change if the engine does.

The caption is set by the frame compositor, not the encoder. It accepts up to 200 characters — a caption over 200 characters is refused outright — and wraps what it accepts onto at most 4 lines, with the block anchored at its last line so that extra lines are added above it; past what 4 lines can hold, the final line ends in an ellipsis, so a clipped caption never reads as the whole text. The example's caption, Rose Delgado · 1941–2026, is 24 characters — a name and dates leave most of the budget unused — and in the built artwork it sets on a single line, with the first baseline 74 units below the panel's lower edge. Verification runs on the finished artwork, caption included, so a caption that wraps is checked together with the code it accompanies.

Why the classic frame's rules apply here

The classic frame belongs to the framed family — the safest style by construction, because the code itself is not modified at all. That family has its own guide, Framed codes, explained, which covers the clean panel, the frame templates and the recolourable art for every frame; this section is the classic frame's share of it. The generator renders the symbol as an ordinary black-on-white QR, then the frame compositor nests that SVG verbatim, byte-identical, inside a scaled group on an opaque white panel, and the panel is drawn above the frame art. The frame art is drawn beneath the panel and the code is never modified: the markup nested in the composite is the plain render, byte for byte, whatever the frame or caption says — a fact checked when this page was built, not assumed. Re-running the example through that compositor at build time gives the geometry: the composite is 760 × 880 units, the panel is a 460-unit square occupying 61% of the artwork's width, and the code with its quiet zone spans 57% of that width inside the panel.

Because the frame is art and the code is data, the two have different rules. The frame's palette — the charcoal #1f2937 this preset starts on, and any colour you replace it with — is parsed as a hex colour and nothing more. The engine does not gate frame colours for contrast, because the panel is opaque and drawn above the art: whatever the art does, it cannot reach a module or the quiet zone, both of which lie inside the panel. The code keeps its own colours: the inner render measures 21:1 between its black modules and the white panel, far above the 4.5:1 floor the module-redrawing styles, hearts and halftone, enforce. Finder and alignment patterns stay classic, crisp squares in every style here, including this one, because restyling alignment patterns broke decoding outright in testing.

Error correction is where the framed family's rule differs from the rest. The example is encoded at level H, the maximum — roughly 30% recovery — and that is where every preset on this site starts. The styles that redraw modules spend that margin on their decoration, so hearts and halftone are rejected below H outright. A frame spends none of it: the code is untouched on its panel, so the compositor also accepts a code encoded at Q — the smaller-code option the generator above offers — and refuses anything lower. Exercised on this example's link at build time: re-encoded at Q, the link became a version 4 symbol of 33 × 33 modules and the compositor accepted it; re-encoded at M it was refused with Framed keepsakes require error correction level Q or H — re-encode with ecLevel "H".; and the Q model handed to the heart-module style was refused with Artistic styles require error correction level H — re-encode with ecLevel "H"., so a lighter framed code can never become heart art. Whichever level a framed code carries, the finished artwork still has to pass decode verification before it can be downloaded.

Permanence as a property of the file

Every code made here encodes your content directly: the URL is inside the image itself. There is no shortener, no redirect through our servers and no subscription keeping the code alive; if this site vanished tomorrow, every link code it ever produced would keep opening its destination. (A reveal-link code is the one kind that points at this site; the message section below says what it depends on.) That permanence is a property of the file rather than a promise from us — you can confirm it by reading the worked example's payload above, which is the destination address itself and nothing else.

Two things follow from the same mechanism. The first is that the one thing this code cannot protect is the page it points to: the modules hold an address, and what answers at that address is yours to keep. The second is that a printed code cannot be re-pointed — changing the destination means a new code. Both are consequences of encoding the address directly, and so is the permanence. The SVG download is vector artwork, so a card redesigned decades from now can reprint the identical code from the same file; and if the link ever stops answering, the caption is still in the ink.

If the words go in the code: reveal link or offline note

The memorial preset starts on a link, but the generator can carry a message instead, and the methodology page is candid about what a message in a code can and cannot do. A QR code containing bare text carries no scheme, so a phone has nothing to act on. Apple's Camera and Google's ML Kit both 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 simply runs a web search, so the message is the one thing the reader never sees. Samsung phones and dedicated scanner apps do display it, but a keepsake cannot depend on which phone opens it.

So a message keepsake offers two modes, and the choice between them is a question of dependencies. A reveal link encodes a normal URL to a page on this site, with the message carried in the URL's fragment — the part after the #. Per RFC 3986 a fragment is stripped before a request is made, so it never reaches our servers, a CDN or any log; the message is decoded entirely on the reader's device. An offline note writes the words into the code itself, needs no connection and no website ever, and accepts the display caveat above. In both modes, on a framed keepsake with the caption left empty, the message is also printed under the code as its caption, so it can be read by eye; a caption you type takes its place. On this preset that is a real choice: the caption line is written for a name and dates, and a memorial that carries them in its caption does not print the message, which then lives in the code alone. How the caption line carries a message is set out in the guide. Every message keepsake can additionally be downloaded as a self-contained HTML file that decodes the format with no network and no website at all. The fragment format, the base32 reasoning and the standalone file are set out in full in Message keepsakes and reveal links.

Here is the format worked on this preset's own fictional placeholder, Forever in our hearts. Rose Delgado, 1941–2026. — 47 characters of a 300-character allowance. Encoded at build time, its fragment is 81 characters long: the flag A, meaning UTF-8 bytes — the encoder accepts an optional compressor and, given one, keeps whichever base32 payload is shorter, but the generator on this page does not pass one, so every reveal link it produces carries flag A, and the reveal page parses either flag — then 79 characters of unpadded uppercase base32, then the checksum character 2, which turns a link altered by a scanner into a friendly message instead of gibberish. The complete link is https://KEEPSAKECODES.NET/M/#AIZXXEZLWMVZCA2LOEBXXK4RANBSWC4TUOMXCAUTPONSSARDFNRTWCZDPFQQDCOJUGHRIBEZSGAZDMLQ2 — 110 characters, with the host and path in upper case on purpose, because hosts are case-insensitive and upper-case letters fit the QR alphanumeric set the fragment already uses. At level H it encodes as a version 10 symbol of 57 × 57 modules. The same words as an offline note encode as version 6, 41 × 41 — a coarser code, because the note carries only the words while the link carries the address around them. The preset's link example, for comparison, is version 5.

What verification proves, and what it cannot

After each render, your browser rasterises the finished artwork — frame, panel, caption and code — and runs a real QR decoder, jsQR, on the pixels, then compares the decoded bytes to your exact content. It does this at 3 raster sizes, 800, 1200, 1600 px, because a single fixed raster can false-negative through sampling resonance: a render can fail at exactly one size and decode cleanly at the others. The "Verified scannable" badge is earned when at least 2 of those rasters decode to an exact byte match, and the result reports which sizes passed. Anything else shows a clear warning and keeps the downloads locked, so an unverified render cannot leave the page as a finished keepsake. A render that decodes to different content than you entered is reported ahead of every other failure, because that is the one outcome never safe to print.

What the badge proves is narrow, and worth stating exactly: this artwork, at screen resolution, decodes to this payload. It cannot see your printer, your paper or the phone that will do the scanning. The engine's own test suite runs the identical render-rasterise-decode loop on every style — at several raster sizes, rotated, and after lossy JPEG recompression — which is why the rules above are pinned rather than hoped for. But a print is a physical object, and the last check belongs to you; the decode verification guide walks through the badge, the warning and the locked downloads in detail.

Printing and testing a memorial card

The methodology page's print guidance is short and applies here without change: print at least 2 × 2 cm for arm's-length scanning, keep the quiet zone uncropped, and scan a test print with a real phone before the moment that matters. The engine adds a computed floor for this particular symbol. Its working minimum module is 0.5 mm, so the example's 45-module artwork, quiet zone included, must be at least 22.5 mm (0.89 in) across. Because that symbol spans 57% of the framed artwork's width, the whole framed card has to be printed at least 4.0 cm wide for the code inside it to reach that floor. The engine also marks a symbol oversized once it passes 65 total modules — its comfortable-print ceiling for the cards and tags these codes go on, a fit heuristic rather than a decode limit. The example is 45 modules across, within that ceiling, and the reveal-link example above comes to 65, within it; the engine's verdict on each is the one printed here. A longer address means a denser symbol and a higher module count — the reveal-link example above, at 110 characters against the link example's 36, is that comparison already worked — and the module count is what sets both the print floor and the oversized verdict.

The PNG download's size readout is computed, not guessed. At 300 DPI the export presets print at:

  • 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

Those figures are written for a square raster. The generator rasterises the verified SVG so that its longer side measures the chosen pixel count, and this composite is 760 units wide by 880 tall, so on a memorial card a preset is the raster's height — the whole composition, frame art included — and not the width of the code panel. The printed width is narrower by the composite's own ratio, and the code with its quiet zone is 57% of that width. Worked per preset from those two figures, the way the generator sizes its canvas:

  • 512 px — a raster 442 px wide, 37.4 mm at 300 DPI, with the code and its quiet zone at 21.3 mm, which falls short of the 22.5 mm floor
  • 1024 px — a raster 884 px wide, 74.8 mm at 300 DPI, with the code and its quiet zone at 42.5 mm, which clears the 22.5 mm floor
  • 2048 px — a raster 1769 px wide, 149.8 mm at 300 DPI, with the code and its quiet zone at 85.1 mm, which clears the 22.5 mm floor

So the smallest export preset that puts this example's code at its floor is 1024 px: choose that preset or a larger one — or the SVG download, which is vector artwork and carries the same verified composite at any size — print one, and scan it. The printing and scanning guide covers the module floor and the export presets for every style.

Common misreadings

  • Trimming into the panel. The 4-module quiet zone is part of the symbol, and it is drawn inside the white panel. Cutting a card down to the frame border leaves the code intact; cutting into the panel crops the quiet zone, and a cropped quiet zone is a damaged code no matter how clean the modules look.
  • Expecting bare text to display. An offline note is bare text, and bare text carries no scheme: an iPhone offers to copy or search it and Google Lens runs a web search. That is why the reveal link exists, and why, on a framed keepsake with the caption left empty, the message is also printed under the code as its caption; a caption you type takes its place, so a memorial that carries the name and dates in its caption does not print the message. The message keepsakes guide explains both modes.
  • Treating the frame colour as the code colour. Recolouring the frame changes nothing on the panel; the code stays black on white at 21:1. The contrast gate exists for styles that recolour the modules themselves. Switch this preset to heart modules and the engine measures the pair before it draws anything. Each of these colours was put to the heart-module style on the example's model when this page was built, and the verdicts are the engine's own. The preset's heart colour, #881337, measures 9.57:1 on white and was accepted. The charcoal #1f2937 this frame starts on, tried as a heart colour, measures 14.68:1 and was accepted. A pale grey such as #9ca3af measures 2.54:1, below the 4.5:1 floor, and was rejected — not warned about. The engine answers: Artistic styles require at least 4.5:1 contrast (got 2.54:1) — decoration already spends decode margin. Inverted pairs, light modules on a dark ground, are rejected too.
  • Expecting the print to follow the page. The modules hold the address, not the page. The page behind the address may change freely; the address may not, and a changed address is a new code.
  • Omitting the protocol. The URL builder rejects an address without https:// or http://; its own refusal, read back when this page was built, is Include the protocol (e.g. https://) so scanners recognize the link.. It will not guess one for you, so the modules never carry something you did not type.
  • Reading the badge as a print guarantee. It is a screen-resolution proof that this artwork decodes to this payload. The printed card is a separate object, which is why the methodology asks for a test print scanned with a real phone.

Memorial code FAQ

Will the code still work in twenty years?

The code, yes: your link is encoded directly into the image, with no shortener and no redirect server between the scan and the destination, so there is nothing of ours in the loop to fail. What the code cannot protect is the page it points to — the modules hold an address, and what answers at that address is yours to keep. Keep the SVG download with the card files and the identical code can be reprinted from it at any time.

Can a code made here expire or be switched off?

No. There is no subscription keeping it alive and no service it depends on: the address you type is validated — it must start with https:// or http:// — and then handed to the encoder trimmed of surrounding whitespace and otherwise unchanged, so the printed modules are the destination itself. The flip side is that a printed code cannot be re-pointed; if the destination must change, that is a new code.

Can I put the words in the code instead of a link?

Yes — the generator accepts a message as well as a link, up to 300 characters for a reveal link. A reveal link opens a page on this site with the words carried in the URL fragment, which never reaches a server; it depends on this site, or on the self-contained HTML download, to display them. An offline note writes the words into the code itself and depends on nothing — but a bare-text code carries no scheme, so an iPhone offers to copy or search it and Google Lens simply runs a web search rather than showing it; Samsung phones and dedicated scanner apps do display it. In both modes, on a framed keepsake with the caption left empty, the message is also printed under the code as its caption, so it can be read by eye; a caption you type takes its place. On this preset the caption line is written for a name and dates, so a memorial that carries them in its caption does not print the message — the words are then in the code alone. The guide on message keepsakes and reveal links sets out the format, and how the frame's caption line carries the words, in full.

What does the caption hold, and how long can it be?

Anything up to 200 characters, wrapped onto at most 4 lines. The preset starts it on a name and dates; the registry's reason for that choice is quoted in the section on what the preset encodes. The caption is set by the frame compositor, not the encoder, so the code markup nested in the artwork is the same whatever the caption says; in the built example the name and dates set on a single line, with the first baseline 74 units below the panel's lower edge, and verification runs on the finished artwork, caption included.

Does changing the frame colour affect the code?

No. The frame is recolourable vector art drawn beneath an opaque white panel; the code sits on the panel unmodified, black on white at 21:1. The colour control reaches the art only. Contrast gating applies when a style recolours the modules themselves — the heart-module style — where the engine requires at least 4.5:1 and rejects weaker or inverted pairs rather than warning.

What does "Verified scannable" prove for a card that will be printed?

That this exact artwork decoded back to your exact content in your browser at a minimum of 2 of 3 raster sizes (800, 1200, 1600 px). It cannot see the printer, the paper or the scanning phone. Print at least 2 × 2 cm, keep the quiet zone uncropped, and scan a test print with a real phone before the moment that matters.

How large must the printed code be?

The methodology floor is 2 × 2 cm for arm's-length scanning. For the worked example the engine computes its own minimum: 45 modules at 0.5 mm each is 22.5 mm across, quiet zone included, and because the code spans 57% of the framed artwork's width, the whole card artwork needs to be at least 4.0 cm wide. A PNG export preset is the raster's longer side — on this composite its height — so the printed width is narrower by the artwork's own ratio; the smallest preset whose width puts this example's code at its floor is 1024 px. A longer link makes a denser symbol and raises that floor.

For a remembrance that lives entirely in the code, the message option above needs no website — and a photo keepsake code can carry their portrait within the code itself. Celebration-of-life boards often pair this with a photo-collection code so guests can contribute their own pictures and stories.