Digital product passports from one JSON file

Digital product passports with QR codes, on GitHub Pages, no subscription.

Free, also for companies. Licence PolyForm Shield 1.0.0.

passports/battery.json

{
  "template": "battery",
  "gtin": "09520123456788",
  "productName": "Akku 500 Wh",
  "category": "lmt",
  "chemistry": "Li-Ion NMC 811",
  "ratedCapacityAh": 13.9,
  "voltage": "30 V / 36 V / 42 V",
  "items": [
    { "serial": "AK500-000123",
      "manufactureDate": "2026-09" }
  ]
}
Passport page of the sample battery with name, GTIN, serial number, QR code and the first required fields
The file on the left, the page behind the QR code on the right.

From datasheet to passport page

  1. Read the datasheet

    Upload the PDF. Claude fills in what it states and marks every suggestion.

    Editor with the AI import open: pasted datasheet text, API key, a note that nine fields were suggested
  2. Check the required fields

    Anything missing from Annex XIII shows up in a list, with its reference.

    Check list with three missing fields above the passport preview
  3. Publish

    Commit the JSON file. Each serial number gets a page with its own QR code.

    Passport page of a single serial number on a phone

What every passport page includes

QR code as GS1 Digital Link

Any phone camera reads it.

/01/09520123456788/21/AK500-000123/

Open the example

Every public field from Annex XIII

Each field with its legal reference.

Rated capacity
Annex XIII 1(g)
Extinguishing agent
Annex VI A no. 9
Declaration of conformity
Annex XIII 1(r)

Machine-readable

JSON and a schema.org Product in every page.

{ "@type": "Product",
  "gtin14": "09520123456788",
  "serialNumber": "AK500-000123" }

No running costs

Static files. Any web space will do.

Your key, your browser

The datasheet goes straight to Anthropic, never to Passwerk.

Deadlines in the Batteries Regulation

Regulation (EU) 2023/1542, as of 8 November 2026.

FromObligationReference
18 Aug 2025Separate collection symbol on every batteryArt. 13(4)
18 Aug 2026 or laterLabel with manufacturer, chemistry, weight and capacityArt. 13(1)
18 Feb 2027QR code on every batteryArt. 13(6)
18 Feb 2027Battery passport for LMT, industrial (above 2 kWh) and electric vehicle batteriesArt. 77(1)

Battery passport contents

Questions before the first passport

Is GitHub Pages enough to comply?

The regulation does not prescribe hosting. It does require the passport to stay available after your company stops trading (Art. 78(e)). A GitHub account alone does not guarantee that, so also publish the pages on your own domain under a hosting contract.

What about data that must not be public?

Detailed composition, dismantling information and test reports (Annex XIII points 2 to 4) are for authorised parties only. Passwerk publishes the public part and names a contact for the rest. It has no access control.

Do I need a GTIN?

No. Without a GTIN the passports live under /p/short-name/. The identifier must follow ISO/IEC 15459 (Art. 77(3)), which a GS1 GTIN does.

May my company use Passwerk?

Yes, free of charge and with your own changes. The PolyForm Shield licence only forbids offering Passwerk as a competing product. It is not an OSI open-source licence.

Is this legal advice?

No. Passwerk maps the fields of the legal text. Whether your passport is complete is part of your conformity assessment.

Four commands to your first passport page

Node 20 or newer, no dependencies. For GitHub Pages: fork, choose “GitHub Actions” under Settings, Pages, and put your JSON files in passports/.

# passports/ holds the data, _site/ the finished pages
git clone https://github.com/BrickyStudios/digitaler-produktpass
cd digitaler-produktpass
npm run build
  beispiel-ebike-akku.json → 01/09520123456788/ (+2 Seriennummern)
  example-tshirt.json → 01/09520987654320/ (+0 Seriennummern)
  fertig: _site/ für http://localhost:8080
npm run preview