The open-source QR code label designer for developers. Design once, print everywhere.
If this project saves you time, please consider giving it a β β it helps others find it!
Try the designer live β no signup required:
| Framework | Live Demo | Source Code |
|---|---|---|
| React | βΆ Open Demo | Source |
| Angular | βΆ Open Demo | Source |
| Svelte 5 | βΆ Open Demo | Source |
| Vue 3 | βΆ Open Demo | Source |
QR Layout Tool is a complete solution for building applications that generate dynamic, printable QR code labels, stickers, and badges. Unlike basic QR generators that produce a single image, this tool gives you a full layout engine with a visual designer, data binding, and multi-format export.
It is split into two focused npm packages:
| Package | Purpose |
|---|---|
qrlayout-core |
Headless rendering engine β use in any JS/TS project |
qrlayout-ui |
Embeddable drag-and-drop visual designer |
- π¨οΈ Industrial-grade output: Direct ZPL export for Zebra thermal printers
- π¦ Mail-merge style batching: Generate thousands of unique labels from one template with
{{variable}}syntax - π Truly framework-agnostic: Works with React, Vue, Angular, Svelte, or plain HTML β no framework lock-in
- π Multi-format: High-fidelity PDF, PNG, and ZPL from the same layout definition
- β‘ Lightweight: Zero heavy dependencies in
qrlayout-core; renders on Canvas in the browser or Buffer in Node.js
Use the rendering engine directly β no UI needed.
npm install qrlayout-coreimport { StickerPrinter } from "qrlayout-core";
const printer = new StickerPrinter();
const layout = {
id: "badge",
name: "Employee Badge",
width: 100, height: 60, unit: "mm",
elements: [
{ id: "name", type: "text", x: 5, y: 5, w: 90, h: 12, content: "{{name}}", style: { fontSize: 16, fontWeight: "bold" } },
{ id: "qr", type: "qr", x: 35, y: 20, w: 30, h: 30, content: "{{id}}" }
]
};
// Batch generate 3 labels and export to ZPL for a thermal printer
const zplPages = printer.exportToZPL(layout, [
{ name: "Alice", id: "EMP-001" },
{ name: "Bob", id: "EMP-002" },
{ name: "Charlie", id: "EMP-003" },
]);Drop a full drag-and-drop designer into any web app.
npm install qrlayout-ui qrlayout-coreimport { QRLayoutDesigner } from "qrlayout-ui";
import "qrlayout-ui/style.css";
const designer = new QRLayoutDesigner({
element: document.getElementById("editor"),
onSave: (layout) => {
// Save layout JSON to your backend
console.log("Saved:", layout);
}
});npm install jspdfimport { exportToPDF } from "qrlayout-core/pdf";
const pdf = await exportToPDF(layout, [data1, data2]);
pdf.save("badges.pdf");The layout JSON output from qrlayout-ui is your single source of truth. Store it in your database, load it back anytime, and pass it with real records to qrlayout-core to generate labels.
User designs in qrlayout-ui
β
β onSave(layout JSON)
βΌ
Your database / backend β store the layout JSON like any other record
β
β fetch layout + your real data (employees, machines, assetsβ¦)
βΌ
qrlayout-core (StickerPrinter) β merges data into the template
β
βββ exportToPNG() β download as image
βββ exportToPDF() β printable PDF (batch)
βββ exportToZPL() β send to Zebra thermal printer
// 1. Save the layout from the designer
onSave: async (layout) => {
await fetch("/api/layouts", { method: "POST", body: JSON.stringify(layout) });
}
// 2. Later β fetch the saved layout and your real data, then print
const layout = await fetch("/api/layouts/employee-badge").then(r => r.json());
const records = await fetch("/api/employees").then(r => r.json());
const printer = new StickerPrinter();
const pdf = await printer.exportToPDF(layout, records);
pdf.save("badges.pdf");Note
About the live demo apps β Each framework demo (React, Angular, Svelte, Vue) comes with pre-built sample layouts and demo records so you can explore every feature without any setup.
All data is stored only in your browser's localStorage β nothing is sent to any server. Clearing browser storage resets the demo to its defaults. Your layouts and data never leave your browser.
| Industry | Example |
|---|---|
| π Manufacturing & Warehousing | ZPL shipping labels for Zebra printers |
| ποΈ Events & Conferences | Personalized attendee badge generation |
| π₯ Healthcare | Patient wristbands and asset tagging |
| π¦ Inventory & Retail | SKU labels with QR codes linking to product pages |
| π’ HR & Access Control | Employee ID cards and visitor passes |
| π§ MRO / Maintenance | Machine asset tags with scannable maintenance history links |
This monorepo is managed with npm workspaces:
qr-code-layout-generate-tool/
βββ packages/
β βββ core/ # qrlayout-core β headless rendering engine
β βββ ui/ # qrlayout-ui β visual drag-and-drop designer
βββ examples/
βββ react-demo/ # React + Vite reference app
βββ angular-demo/ # Angular 19 reference app
βββ svelte-demo/ # Svelte 5 reference app
βββ vue-demo/ # Vue 3 reference app
| Package | Version | Description | Docs |
|---|---|---|---|
qrlayout-core |
Headless rendering & logic engine | API Reference | |
qrlayout-ui |
Interactive visual designer | Integration Guide |
# Clone the repo
git clone https://github.com/shashi089/qr-code-layout-generate-tool.git
cd qr-code-layout-generate-tool
# Install all workspace dependencies
npm install
# Run the UI in dev mode (live preview)
npm run dev:ui
# Build all packages
npm run build:core
npm run build:uiContributions, bug reports, and feature requests are welcome!
- Fork the repository
- Create your feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -am 'Add my feature' - Push to the branch:
git push origin feature/my-feature - Open a Pull Request
Found a bug or have an idea? Open an Issue β
Shashidhar Naik
- GitHub: @shashi089
MIT Β© Shashidhar Naik
If this project helped you, please give it a β on GitHub!
It helps more developers discover the tool.
