Print-first badge builder with CSV/JSON import, Mustache templates, and precise mm layout.
- Print-first layout in mm with A4, Letter, or Custom page sizes
- CSV/JSON import with column normalization and schema validation
- Mustache templates with theme CSS
- Inline participant editing and badge preview
- PDF export and print support
- Local storage persistence
npm install
npm run devOpen the app, import CSV/JSON, choose template, and print or export PDF.
Supported headers (any subset). Unknown columns are ignored unless mapped in src/core/normalize.js.
Canonical fields:
- Required:
id(uuid or number),firstName,lastName - Recommended:
displayName,role,company,title,country,city,email,phone,qrValue,badgeType,note - Event/branding (global or per-person override):
eventName,eventDate,eventLocation,eventLogo,sponsorLogo
Example CSV:
id,firstName,lastName,displayName,role,company,title,email,qrValue
P-0001,Nikolay,Semenov,Nikolay Semenov,Speaker,Bpacks Lab,Materials Scientist,nikolay@example.com,https://example.com/checkin/P-0001Two supported shapes:
- Array of participants
- Object with
participantsand optionalmeta
Example (array):
[
{
"id": "P-0001",
"firstName": "Nikolay",
"lastName": "Semenov",
"displayName": "Nikolay Semenov",
"role": "Speaker",
"company": "Bpacks Lab",
"title": "Materials Scientist",
"email": "nikolay@example.com",
"qrValue": "https://example.com/checkin/P-0001"
}
]Example (with meta):
{
"meta": {
"eventName": "BadgeCon 2025",
"eventDate": "2025-04-18",
"eventLocation": "Berlin, Germany",
"eventLogo": "https://dummyimage.com/120x40/0b75f5/ffffff&text=BadgeCon",
"sponsorLogo": [
"https://dummyimage.com/80x30/f97316/ffffff&text=Acme",
"https://dummyimage.com/80x30/14b8a6/ffffff&text=Beta"
]
},
"participants": [
{
"id": "P-0001",
"firstName": "Nikolay",
"lastName": "Semenov",
"displayName": "Nikolay Semenov",
"role": "Speaker"
}
]
}Notes:
displayNameis optional; if missing it falls back tofirstName + lastName.sponsorLogocan be a string or an array of strings.- Any per-person
event*fields override the globalmetavalues.
Templates live in src/templates/<templateId>/ and are auto-discovered.
Each folder contains:
template.json(name, description, size)badge.mustachetheme.css
Use Mustache tags like {{fieldName}} and section helpers for optional fields:
{{#role}}<div class="chip">{{role}}</div>{{/role}}The field sponsorLogo accepts either a single string or an array of strings.
In the UI form, comma-separated URLs are split into an array.
{{#sponsorLogo}}
<img class="sponsor" src="{{.}}" alt="Sponsor logo" />
{{/sponsorLogo}}CodePen sandbox for quick experiments:
- Template packs gallery with thumbnails
- Per-template editor fields configuration
- Batch QR export and SVG QR option
- Layout presets per paper vendor
Issues and PRs are welcome. Keep changes focused and include a short description.
MIT. See LICENSE.