the camera front door — no account, no upload

Scan it. Right here.

Point your camera at any barcode — a can from the kitchen, a pallet label, a door jamb — and this page reads it, checks it, and names it. On your device.

What this page does with your camera, exactly: frames are decoded in this page's memory, on this device, and discarded. Nothing is uploaded. Nothing is stored. Nothing is logged. The reading stops the moment two frames agree. Anything shown or shared afterwards is a re-rendered barcode built from the decoded characters — never your photo. A driver's license barcode answers with a refusal: parsed, verified, nothing kept, nothing shown.

With scripts off you still get the full specimens gallery below and every machine form — the decoder island is the only thing that needs script, and it loads from this origin only.

Camera

on-device; stops on the first agreed reading

A photo

decoded here in the page, then dropped — the file never leaves this tab

Type it

the round-trip ritual: type a number, watch it become a barcode, scan it back off the screen

Specimens to scan — rendered by the same engine that reads them.

Every barcode below was drawn by this site's own encoder at build time and decoded back through an independent decoder before it was allowed to ship: resolve(generate(x)) === x, gated in the build. Scan them off this screen or a printout; hold (long-press on touch) for the machine form of any one of them.

4006381333931

a product barcode (EAN-13) — the shelf form — thirteen digits, the last one a check

machine form — hold /Alt anywhere to flip (long-press on touch); ⌥⏎/Alt+ copies
# the API door (same registry, same envelope)
curl -s https://api.barcoding.dev/resolve -H 'content-type: application/json' -d '{"payload":"4006381333931"}'

{
  "scheme": "gs1.gtin",
  "carrier": "GTIN-13 (EAN-13)",
  "canonical": "04006381333931",
  "check": "mod10 pass",
  "computed": "computed from the digits · nothing was looked up",
  "handoff": "read here · resolved by id.org.ai",
  "address": "/01/04006381333931"
}

# the MCP door — one tool call, byte-identical envelope
{"method":"tools/call","params":{"name":"resolve","arguments":{"payload":"4006381333931"}}}

# the CLI door
barcoding resolve '4006381333931' --json
(01)09506000134352(17)260930(10)LOT42

a GS1 label strip (GS1-128) — product + expiry + batch in one strip

machine form — hold /Alt anywhere to flip (long-press on touch); ⌥⏎/Alt+ copies
# the API door (same registry, same envelope)
curl -s https://api.barcoding.dev/resolve -H 'content-type: application/json' -d '{"payload":"(01)09506000134352(17)260930(10)LOT42"}'

{
  "scheme": "gs1.element-string",
  "carrier": "element-string (bracket)",
  "canonical": "(01)09506000134352(10)LOT42(17)260930",
  "check": "mod10 pass",
  "computed": "computed from the digits · nothing was looked up",
  "handoff": "read here · resolved by id.org.ai",
  "ambiguity": [
    {
      "scheme": "udi.gs1",
      "carrier": "udi (GS1 issuing agency)",
      "canonical": "DI 09506000134352",
      "check": "mod10 pass",
      "note": "the same element string read at the FDA UDI grain: DI = AI (01), PI = the production identifiers",
      "di": "09506000134352",
      "pi": {
        "10": "LOT42",
        "17": "260930"
      }
    }
  ],
  "ais": [
    {
      "ai": "01",
      "value": "09506000134352",
      "label": "GTIN"
    },
    {
      "ai": "10",
      "value": "LOT42",
      "label": "batch/lot"
    },
    {
      "ai": "17",
      "value": "260930",
      "label": "expiration date",
      "iso": "2026-09-30"
    }
  ],
  "element_string": {
    "bracket": "(01)09506000134352(10)LOT42(17)260930",
    "raw_has_fnc1": true
  },
  "digital_link": {
    "canonical": "https://id.gs1.org/01/09506000134352/10/LOT42?17=260930",
    "compressed": "https://id.gs1.org/ARFKk4XBoCDClnJ8bC5_aE",
    "compression_note": "DL 1.1.4 structure; GS1 optimisation tables not applied this run — round-trip gated in CI, toolkit interop pending (P0-1 delta)"
  },
  "epc": {
    "status": "company-prefix length required",
    "hint": "an EPC URN splits the GTIN at the GS1 company prefix — a licensed allocation fact; pass gcpLength to derive (TDS 2.3 §7)"
  },
  "address": "/01/09506000134352"
}

# the MCP door — one tool call, byte-identical envelope
{"method":"tools/call","params":{"name":"resolve","arguments":{"payload":"(01)09506000134352(17)260930(10)LOT42"}}}

# the CLI door
barcoding resolve '(01)09506000134352(17)260930(10)LOT42' --json
(00)395060000000001235

a pallet label (SSCC on GS1-128) — one logistic unit, serialized by construction

machine form — hold /Alt anywhere to flip (long-press on touch); ⌥⏎/Alt+ copies
# the API door (same registry, same envelope)
curl -s https://api.barcoding.dev/resolve -H 'content-type: application/json' -d '{"payload":"395060000000001235"}'

{
  "scheme": "gs1.sscc",
  "carrier": "sscc-18 digits",
  "canonical": "395060000000001235",
  "check": "mod10 pass",
  "computed": "computed from the digits · nothing was looked up",
  "handoff": "read here · resolved by id.org.ai",
  "segments": {
    "extension": "3",
    "serial_reference_with_prefix": "9506000000000123",
    "check": "5"
  },
  "address": "/00/395060000000001235"
}

# the MCP door — one tool call, byte-identical envelope
{"method":"tools/call","params":{"name":"resolve","arguments":{"payload":"395060000000001235"}}}

# the CLI door
barcoding resolve '395060000000001235' --json
1HGCM82633A004352

a vehicle number (VIN on Code 39) — the door-jamb form

machine form — hold /Alt anywhere to flip (long-press on touch); ⌥⏎/Alt+ copies
# the API door (same registry, same envelope)
curl -s https://api.barcoding.dev/resolve -H 'content-type: application/json' -d '{"payload":"1HGCM82633A004352"}'

{
  "scheme": "vin",
  "carrier": "vin (17 characters)",
  "canonical": "1HGCM82633A004352",
  "check": "iso3779 mod11 pass (pos 9 = 3)",
  "computed": "computed from the digits · nothing was looked up",
  "handoff": "read here · resolved by id.org.ai — via auto.dev, the vertical authority",
  "segments": {
    "wmi": "1HG",
    "vds": "CM826",
    "check": "3",
    "vis": "3A004352"
  },
  "delegate": "decomposed by the vehicle authority",
  "address": "/vin/1HGCM82633A004352"
}

# the MCP door — one tool call, byte-identical envelope
{"method":"tools/call","params":{"name":"resolve","arguments":{"payload":"1HGCM82633A004352"}}}

# the CLI door
barcoding resolve '1HGCM82633A004352' --json
9780306406157

a book (ISBN as EAN-13) — books live inside the GTIN space

machine form — hold /Alt anywhere to flip (long-press on touch); ⌥⏎/Alt+ copies
# the API door (same registry, same envelope)
curl -s https://api.barcoding.dev/resolve -H 'content-type: application/json' -d '{"payload":"9780306406157"}'

{
  "scheme": "isbn",
  "carrier": "ISBN-13 (Bookland EAN-13)",
  "canonical": "9780306406157",
  "check": "mod10 pass",
  "computed": "computed from the digits · nothing was looked up",
  "handoff": "read here · resolved by id.org.ai",
  "ambiguity": [
    {
      "scheme": "gs1.gtin",
      "carrier": "GTIN-13 (EAN-13)",
      "canonical": "09780306406157",
      "check": "mod10 pass",
      "note": "the same 13 digits verify as a GTIN-13 — Bookland is a GS1 prefix range leased to ISBN"
    }
  ],
  "address": "/isbn/9780306406157"
}

# the MCP door — one tool call, byte-identical envelope
{"method":"tools/call","params":{"name":"resolve","arguments":{"payload":"9780306406157"}}}

# the CLI door
barcoding resolve '9780306406157' --json

What happens after a reading, honestly.

The card you get names the thing plainly, shows the check verdict computed from the characters alone, and shows the anatomy — the same blow-out the barcode registry pages teach.

What the record says is not wired on this page yet. No lookup happens here; when the enrichment rails open, that leg lands with per-attribute provenance — source, license class, fetch time — and not before. Resolution — the identifier answered with its live doors — is id.org.ai's; this page reads, checks and hands off.

The photo path and the camera path carry the same promise, in code: decode-and-discard. The hosted door's twin (POST /decode on api.barcoding.dev) is bound by the same contract — frames decoded in memory, and what a barcode said excluded from logs by type.