Read any dump
fromPages(), fromDump() and fromFile() take a UID with 80 or 144 bytes, or a full 180-byte dump. pretty(), describe(), toDict() and toRawDict() return text, a plain-language paragraph or JSON-ready objects.
Read, verify and write TigerTag NFC chips from JavaScript.
The SDK of the open TigerTag protocol for 3D-printing filament and resin: it turns a chip's bytes into material, colour, print settings and quantity, checks its ECDSA-P256 signature offline, and builds new tags byte for byte.
npm install tigertag
const { TigerTag } = require('tigertag');
const tag = TigerTag.fromPages(uid, payload); // from your NFC SDK
console.log(tag.pretty()); // human-readable summary
console.log(String(tag.verify())); // VALID / NOT SIGNED / INVALID
console.log(tag.toDict()); // JSON-ready object
Install the package, read a chip with your NFC library, write a new one. The bundled reference tables make the first run work with no network.
From the npm registry. pnpm, yarn and bun install the same package.
npm install tigertag
pnpm add tigertag
yarn add tigertag
bun add tigertagPass the 7-byte UID and the 144 bytes your NFC library reads. Here with nfc-pcsc and an ACR122U.
// Node.js — nfc-pcsc (ACR122U / PN532)
reader.on('card', async (card) => {
const uid = Buffer.from(card.uid, 'hex'); // 7 bytes
const payload = await reader.read(4, 144, 4); // pages 4–39, 144 bytes
const tag = TigerTag.fromPages(uid, payload);
console.log(tag.pretty());
console.log(String(tag.verify())); // VALID / NOT SIGNED
});Every change returns a new TigerTag; toBytes() gives the bytes to write back. erase() gives a blank chip.
// Immutable surgical update — returns a new TigerTag, original unchanged
const patched = tag.patch({ nozzleTempMin: 200, dryTemp: 55 });
// Erase a chip — write the returned 80 bytes to the NFC chip
const blankBytes = TigerTag.erase();One package for every side of a TigerTag chip: reading, checking, writing, and keeping its data up to date.
fromPages(), fromDump() and fromFile() take a UID with 80 or 144 bytes, or a full 180-byte dump. pretty(), describe(), toDict() and toRawDict() return text, a plain-language paragraph or JSON-ready objects.
verify() checks the ECDSA-P256 signature that binds the chip UID to its product data, with the public key bundled in the package. The result is valid, invalid, unsigned, no_key or no_uid.
create(), asInit(), patch() and erase() build chip bytes. A TigerTag is immutable: patch() returns a new one, and refuses to change idTigertag, idProduct, uid or the signature.
TigerTag.fromCatalog(productId) builds a complete TigerTag+ from the official product catalogue, downloaded on first use and cached in a per-user folder.
For TigerTag+ chips, rawApi(), diffApi() and patchFromApi() fetch the brand's current product data, list what differs from the chip and apply it.
The material, brand, aspect, type, diameter and unit tables ship in the package. A background check updates them at most once a day; offline: true or TIGERTAG_OFFLINE=1 means zero network calls.
The SDK reads and writes the three tag types of TigerTag protocol v2.2, on NTAG213, NTAG215 and NTAG216 chips.
Every field on the chip, readable fully offline.
A blank template, ready to be programmed. TigerTag.asInit() creates one.
Every field on the chip, plus a product ID that links to the cloud API for updates from the manufacturer. A signed chip can be verified with verify().
The package installs a tigertag command, and runs in the main process of an Electron app.
Parse a dump as text, JSON or raw fields, and update the reference tables on demand.
# Parse a dump file
tigertag dump.bin
# JSON output
tigertag dump.bin --json
# Update the reference tables now (into the data dir)
tigertag updateParse chips in the main process, with no subprocess to ship.
// main.js — replace parseTigerTag() subprocess dependency
const { TigerTag, TigerTagDB } = require('tigertag');
function parseTigerTag(payload, uid) {
const tag = TigerTag.fromPages(Buffer.from(uid), Buffer.from(payload));
const db = new TigerTagDB();
return {
dict: tag.toDict(db),
raw: tag.toRawDict(),
sig: tag.verify(db).toDict(),
};
}A local web page, served by the SDK itself, that builds and decodes TigerTag chips and shows every byte. No NFC hardware is needed.
npm run playground
# then open http://localhost:7432/tools/playground.html
# Enable live reader support (one-time install)
npm install ws nfc-pcsc
The SDK implements the open TigerTag specification, next to the other official tools.
The open specification the SDK implements: memory layout, tag types, signature scheme and reference database.
Repository: TigerTag-RFID-GuideThe Python port: parse, verify, write and diff. The playground page is the same file in both SDKs.
Repository: TigerTag-SDK-PythonOpen-source desktop inventory manager for Windows, macOS and Linux, working with TigerTag Pod and ACR122U readers.
Repository: TigerTag-Studio-ManagerThe official mobile app: read and write chips with the phone's built-in NFC.
Run npm install tigertag, or pnpm add tigertag, yarn add tigertag or bun add tigertag. It needs Node.js 18 or later and no other package for parsing and verification.
No. The reference tables and the signature public key ship in the package, so reading and verifying work offline. The network is only used for the daily table check, the product catalogue and the TigerTag+ cloud methods; offline: true or TIGERTAG_OFFLINE=1 turns it off.
TigerTag uses NTAG213, NTAG215 and NTAG216 chips (ISO 14443-3). The SDK takes the UID and the bytes your NFC library reads, so it is not tied to one reader; the README shows nfc-pcsc with an ACR122U.
verify() checks the chip's ECDSA-P256 signature over its UID and product identifiers, with the public key bundled in the package. It returns valid, invalid, unsigned (a Maker tag), no_key or no_uid, without a server call.
It builds the bytes: create(), patch(), asInit(), erase() and fromCatalog() give a TigerTag whose toBytes() is the payload your NFC library writes. The playground's Burn button writes it to the chips on connected readers.
Yes: TigerTag-SDK-Python is the Python port of the same API, and both SDKs serve the same playground page.
Apache-2.0, which carries an express patent grant. Implementing the TigerTag protocol itself requires no licence.
npm install tigertag, then TigerTag.fromPages(uid, payload).