QR DECK

local-first · no account · plain text

Keep the payload,
not the sticker.

Every QR code on your hardware — Matter pairing codes, Zigbee labels, guest Wi-Fi cards, warranty links — is a few hundred bytes printed on something that fades, peels or goes out with the packaging. QR Deck files the bytes, the metadata and the print settings, so a ruined label is a reprint instead of a factory reset.

  • Runs in the browser. Nothing is uploaded and nothing is phoned home.
  • Export writes one plain-text file you keep. Restore reads it back.
  • No sign-up and no subscription.
entry
042
payload archived
VERSION 2
25 × 25 MODULES
ECC Q — 25%
MASK 3
MT:Y.K9042C00KA0648G0022 bytes

kind
Matter pairing code
device
Aqara FP2 presence sensor
room
Utility closet · shelf 2
filed
2026-02-11
label
● faded — reprint queued

A sticker is a single point of failure.

Thermal labels fade

The pairing code on a two-year-old sensor is grey on grey. The device works fine; the code is unreadable.

The box goes out with the recycling

For a lot of smart-home gear the only printed copy of the code was on the packaging you binned on day one.

Labels end up face-to-wall

Mounted, painted over, drilled through. Once the sticker is behind the plasterboard, a factory reset is the only way back.

the loop

Three steps, then never again.

01

Capture

Scan it with the camera or paste the raw string. QR Deck decodes it and records the encoding, the version, the mask and the error-correction level exactly as printed.

02

File

Name it. Say which device, which room, which shelf. Tag it, note the condition of the physical label, and attach a photo of the original while it is still readable.

03

Recreate

Reprint at any size, any ECC level, on any label sheet. QR Deck re-decodes what it just generated and compares it byte-for-byte with the stored payload before anything reaches the printer.

the record

Raw data first.

An entry is not a photograph of a QR code. It is the string, plus everything you would need to print that string again in ten years without the original in front of you.

Payload
the exact bytes, verbatim, with the encoding mode
Symbol
version, mask and ECC level as originally printed
Provenance
device, serial, room, shelf, a photo of the label
Condition
good, faded or lost — the reprint queue reads this
Print recipe
module size in mm, quiet zone, label sheet preset
dex.json
{
  "format": "qr-dex",
  "schema": 1,
  "written": "2026-02-11T09:14:00.000Z",
  "issued": 42,
  "entries": [
    {
      "id": "042",
      "name": "Aqara FP2 presence sensor",
      "payload": "MT:Y.K9042C00KA0648G00",
      "kind": "matter-pairing",
      "ecc": "Q",
      "mask": 3,
      "print": {
        "moduleMm": 0.8,
        "quietZone": 4,
        "sheet": "avery-l7651"
      },
      "original": {
        "path": "originals/042.jpg",
        "bytes": 214883,
        "width": 1600,
        "height": 1200,
        "taken": "2024-05-03"
      },
      "collections": [
        "Home Assistant",
        "Matter & Thread"
      ],
      "tags": [
        "home-assistant",
        "matter",
        "presence"
      ],
      "condition": "faded",
      "filed": "2026-02-11",
      "verified": "2026-02-11",
      "device": {
        "name": "Aqara FP2",
        "serial": "AQ-FP2-8F2A91C4"
      },
      "location": {
        "room": "Utility closet",
        "detail": "shelf 2, behind the boiler"
      }
    }
  ]
}

One JSON file holds every entry, shown here with one of them. Readable in a text editor, and readable without QR Deck — which is the point of keeping the payload rather than a picture of it.

recreate

Print it again, at any size, at any ECC.

Error correction is a decision you make at print time, not something you inherit from a faded label. Put a Q or H code in the plant room where it will get damp; leave L on the card in the drawer.

Every generated symbol is decoded again and checked against the stored payload before it prints. If the two do not match, nothing goes to the printer.

re-decoded · match20 bytes in,
20 bytes out.
reprint sheet — entry 042avery l7651 · 65 per sheet
20 mm
0.5 mm modules
32 mm
0.8 mm modules
48 mm
1.2 mm modules
ecc level
LMQH
caption under symbolFP2 · utility closet · #042

export

Plain text, wherever you already keep things.

One dex, one file, with the photographs beside it. Push it, sync it, grep it, diff it. There is no lock-in to break out of, because there is nothing holding the data in.

  • Git repositoryexport into a working copy, commit with your own tools — Chrome, Edge
  • Drive / Dropboxhand it to whatever already syncs — Chrome, Edge
  • Local folderstraight to disk, no round trip — Chrome, Edge
  • Download the filedex.json, or a zip with the originals — any browser
  • Print sheetone entry, the reprint queue, or all of it — your browser's print dialog
git@[YOUR HOST]:you/qr-deck.git · main
qr-deck/
├── dex.json            # every entry: 148 of them, 6 collections
└── originals/
    └── 042.jpg         # photo of the label, 2024-05-03

Last export 3 days ago · 4 saves since.

What it is

  • A filing cabinet for short strings you cannot afford to lose.
  • A generator that verifies its own output before it prints.
  • A plain-text archive that stays readable if the app disappears.
  • Free, offline, and entirely yours.

What it is not

  • Not a secrets vault. A Wi-Fi QR carries the passphrase in clear text — keep your dex file where you keep passwords.
  • Not a cloud service. There is no server to sync through, only files you move.
  • Not a scanner app for one-off links. It is for the codes you keep.