TigerQR Label

The QR label of the TigerTag ecosystemTigerQR

One sticker on a filament spool. One scan opens the right page, on any phone, with no app.

TigerQR+ is the label linked to a product of the TigerTag+ catalogue; TigerQR is the label that is not, the same logic as TigerTag and TigerTag+. This site is the public reference for what a label prints and what its qr.tigertag.io link means.

A Vertical TigerQR+ Spool Label, 30 by 40 mm A Classic TigerQR+ Spool Label, 40 by 30 mm A Slim TigerQR+ Spool Label, 40 by 12 mm A QR only TigerQR+ label, 25 by 30 mm
3 linksa spool with a chip, a spool without a chip, a catalogue product
9 formatsfrom 40 × 12 mm to 50 × 30 mm, Tiger Studio and tigersystem.io alike
29 × 29modules for every spool and product link: one byte segment, error correction M
203 / 300 dpievery QR module on a whole number of printer dots

Nine label formats

The common spool-label sizes and layouts. Every app draws the same SVG, so a label printed from Tiger Studio or from tigersystem.io looks and scans the same. Every example below decodes to its link.

The nine TigerQR label formats side by side, at their true proportions
The nine formats at their true proportions (Filament Label, TigerQR+).

Spool Label or Filament Label, TigerQR or TigerQR+

Two kinds of label, one set of formats. The pill in the corner says whether the label is linked to the catalogue.

A Spool Label holding a spool link and a Filament Label holding a product link
Spool Label: for a spool of your inventory, its QR is the spool link. Filament Label: for a catalogue product (a swatch, a shelf, a showroom), its QR is the product link and it opens the product for everyone.
The same Spool Label with the TigerQR pill and with the TigerQR+ pill
TigerQR+ when the label's reference is a catalogue product (a real id_product) or a TigerTag+ chip; every Filament Label is TigerQR+. TigerQR otherwise, so a TigerTag chip with no product gives TigerQR. The pill does not say whether the spool has a chip.

What a label carries

  • the brand; the series in white on a black bar (the material when there is no series);
  • the colour name and its hex code(s);
  • the TigerQR or TigerQR+ pill;
  • up to four value slots on Classic, Wide and Vertical: nozzle, bed and drying temperatures, then TD or diameter;
  • the QR code, and nothing in clear next to it.

Only what does not change: never the remaining weight, the note, the rack or the owner. QR only prints the pill centred at the top over the QR, and nothing else.

How a label is drawn

The rules that make a label scan on every phone camera and print sharp on a thermal printer.

One byte segment, ECC M

The whole link, lowercase, in one byte-mode segment with error correction level M (15 %): labels get scratched and folded. A lowercase scheme cannot use the alphanumeric mode, and splitting the link into segments saves nothing.

29 × 29 modules

Every spool and product link fits a version 3 code, 29 × 29 modules. The label's white margins are its quiet zone.

Lowercase, always

Tested 2026-11-07: the iPhone camera opens a link in either case, but the Samsung camera (Galaxy S24) shows an uppercase HTTPS:// link as plain text and opens only a lowercase one.

Whole printer dots per module

Each module covers a whole number of dots: the nearest one that fills the QR box, rounded up when that stays within 6 % of the box, down otherwise. A PNG is drawn at exactly the label's size in dots, never resampled.

Tenths of a millimetre

One SVG per label, sized in millimetres, laid out in tenths of a millimetre and scaled to printer dots at 203 or 300 dpi.

Texts keep clear

Texts never run over the QR or the pill: a long text shrinks first, then is narrowed. Tiger Studio and tigersystem.io draw the same SVG, byte for byte.

Printer dots per module

FormatIdSize203 dpi300 dpi
Classicclassic40 × 30 mm320 × 240 dots · 4 a module · QR 14.5 mm472 × 354 dots · 6 a module · QR 14.7 mm
Wideexpanded50 × 30 mm400 × 240 dots · 4 a module · QR 14.5 mm591 × 354 dots · 6 a module · QR 14.7 mm
Compactcompact40 × 25 mm320 × 200 dots · 4 a module · QR 14.5 mm472 × 295 dots · 6 a module · QR 14.7 mm
Slimslim40 × 12 mm320 × 96 dots · 3 a module · QR 10.9 mm472 × 142 dots · 4 a module · QR 9.8 mm
Slicer-friendlyslicer40 × 30 mm320 × 240 dots · 5 a module · QR 18.1 mm472 × 354 dots · 8 a module · QR 19.6 mm
Verticalvertical30 × 40 mm240 × 320 dots · 4 a module · QR 14.5 mm354 × 472 dots · 5 a module · QR 12.3 mm
Vertical boldverticalBold30 × 40 mm240 × 320 dots · 4 a module · QR 14.5 mm354 × 472 dots · 6 a module · QR 14.7 mm
Vertical compactverticalCompact25 × 40 mm200 × 320 dots · 5 a module · QR 18.1 mm295 × 472 dots · 8 a module · QR 19.6 mm
QR onlyqrOnly25 × 30 mm200 × 240 dots · 5 a module · QR 18.1 mm295 × 354 dots · 8 a module · QR 19.6 mm

Label size in dots, dots per module and the QR's printed side, for a 29 × 29 code.

Reading a link

The order a reader follows, as splitLangPrefix and parseQrPath in src/parse.ts do it.

  1. 1Drop a language prefix

    A shared link's leading /<lang>/, in any case.

  2. 2Normalise the path

    Percent-decode, drop leading and trailing /; an empty path is the root.

  3. 3Take the ending

    One .json or .ttag, any case; else a page.

  4. 4Product, older form

    p/ + 8 hex: the hex value (8 digits: the decimal reading is tried when the hex one is not in the catalogue).

  5. 5Product, printed form

    p/ + 1 to 10 digits: the decimal value; above 4294967295 is unknown.

  6. 6Spool

    10 or 17 digits, then 14 hex, then 13 hex starting with 4 (a leading 0 put back), then tigerdata_ / tigerdata- + digits.

  7. 7Anything else

    A label from a newer version: say "update the app" instead of failing.

What each shape names

PathNames
p/<8 hex>a product, older labels
p/<1 to 10 digits>a product, printed on 10 digits
p/0, p/00000000, p/ffffffff, p/4294967295"no product", never printed, 404
<14 hex>a spool with a chip, id: the UID uppercase
<13 hex starting with 4>a chip UID that lost its leading 0
<10 digits>, <17 digits>a spool without a chip, id: TigerData_<digits>
tigerdata_<digits>, tigerdata-<digits>the same, long form
anything elseunknown: "update the app" (404)

A chip UID has 14 characters and a TigerData id 10 or 17 digits, so an all-digit UID is never read as a TigerData id. A product link always starts with p/, so it never collides with a spool.

Build a link, read a link

Both tools run the reference code of src/, the code qr.tigertag.io runs, in your browser. The QR is drawn the way a label draws it: one byte segment, ECC M.

Link generator

Link reader


      

The public label API

Any catalogue product's label, from its id alone, drawn by tigersystem.io with the same renderer as Tiger Studio. No key, no sign-in.

GET https://tigersystem.io/api/public/v1/label/<id>.svg?template=<format>&dpi=<203|300>
GET https://tigersystem.io/api/public/v1/label/<id>.json
GET https://tigersystem.io/api/public/v1/label/<id>.html
  • .svg: the label, sized in millimetres; template is a format id (classic by default), dpi 203 or 300, unit=dots sizes it in printer dots (a PNG's source), lang picks the language of the slot words.
  • .json: what the label prints, its QR link, its catalogue page and the SVG URL of every format.
  • .html: a widget to frame on any site (theme=light|dark), documented on tigersystem.io/en/embed.
The label drawn by the public label API

For developers

The reference code is published as is from qr.tigertag.io, with no dependency. Implementing these links and labels needs no licence and no payment.

TypeScript: read and build

import { parseQrPath, splitLangPrefix } from "./src/parse";
import { productLink, spoolLink, qrLinkFrom } from "./src/links";

const { lang, path } = splitLangPrefix("/fr/p/2673739332");
parseQrPath(path);
// { kind: "product", idProduct: 2673739332,
//   hex: "9f5e0644", format: "page" }

productLink(10303748);
// "https://qr.tigertag.io/p/0010303748"
spoolLink("TigerData_6130922252");
// "https://qr.tigertag.io/6130922252"
qrLinkFrom("chip", "1D:33:DB:DA:0D:10:80");
// { kind: "chip", link: "https://qr.tigertag.io/1d33dbda0d1080" }

Test against the vectors

test-vectors/links.json lists every link shape with the exact answer: read (a path and what it names), lang (the language prefix), build (an id typed for a kind and the printed link), spoolLink, productLink and sharedLink.

git clone https://github.com/TigerTag-Project/TigerQR-Label
cd TigerQR-Label
node tools/check.mjs   # Node 22.13 or later

A reader in another language passes when it gives every expect of the read and lang sections.

Make a label now

The TigerQR Playground draws any catalogue product's TigerQR+ label in every format, as PNG at 203 or 300 dpi and as SVG.

Open the TigerQR Playground

Related