Design the label.
Print it in one line.
Draw roll labels, Formtec sheets and courier waybills in millimetres on 82label.app, then print them from your site with one Label82.print() call. With the print agent installed, there is no print dialog.
Design and print free, no sign-up · MIT
This opens the browser print dialog at the label size. With the print agent, labels go straight to the printer.
Rolls, sheets and waybills, drawn to the paper
Roll labels
For thermal label printers, any size: 40×30, 50×30, 100×150. One data row, one label.
52 Formtec A4 sheets
Address, shipping, barcode, index and round labels, checked against official templates. Resume from any slot.
Courier waybills
Presets fitted to CJ Logistics, Hanjin, Lotte, Korea Post, Logen and others (subscribers). Tracking numbers and sort codes as fields.
Bulk print from Excel
Pick a template, upload Excel or CSV and the columns match themselves. Copies per row, Formtec sheets from any slot, PDF export. Coupang barcode spreadsheets go in as they are.
How it goes into your site
One script tag, the npm package or the web component. Put the template JSON inline or load a saved one by id.
<script src="https://82label.app/cdn/v0.2.0/82label.min.js"></script>
<button id="print">Print labels</button>
<script>
const template = {
v: 1,
name: 'Product barcode 50×30',
paper: { kind: 'roll', dpi: 203 },
label: { width: 50, height: 30 },
elements: [
{ type: 'text', x: 2.5, y: 2, w: 45, h: 6, text: '{{name}}', size: 9, bold: true, fit: 'shrink' },
{ type: 'text', x: 2.5, y: 8, w: 45, h: 4, text: '{{price}}', size: 8 },
{ type: 'barcode', x: 2.5, y: 13, w: 45, h: 15, format: 'code128', value: '{{sku}}' },
],
};
document.getElementById('print').onclick = () =>
Label82.print(template, [
{ name: 'Wireless earbuds Pro', price: '₩39,000', sku: 'EP-2026-0412' },
{ name: 'Fast charging cable 1m', price: '₩9,900', sku: 'CB-1M-0007' },
]);
</script><script src="https://82label.app/cdn/v0.2.0/82label.min.js"></script>
<script>
// Templates saved on 82label.app load by id; edits on the site apply at once.
Label82.print('lbl_a1b2c3d4e5', [
{ name: 'Wireless earbuds Pro', price: '₩39,000', sku: 'EP-2026-0412' },
]);
</script><link rel="stylesheet" href="https://82label.app/cdn/v0.2.0/82label.css">
<script src="https://82label.app/cdn/v0.2.0/82label.min.js"></script>
<label-82
template="lbl_a1b2c3d4e5"
data='[{"name":"Wireless earbuds Pro","price":"₩39,000","sku":"EP-2026-0412"}]'
button="Print label">
</label-82>npm i @82label/core
import { print } from '@82label/core';
import template from './labels/product.json'; // template JSON from the designer
async function printLabels(orders) {
const rows = orders.map((o) => ({ name: o.productName, price: o.priceText, sku: o.sku }));
const result = await print(template, rows);
// result.via: 'agent' (print agent) or 'browser'
return result;
}import { useState } from 'react';
import { print } from '@82label/core';
import template from './labels/product.json';
export function PrintLabelButton({ items }) {
const [busy, setBusy] = useState(false);
const onClick = async () => {
setBusy(true);
try {
const rows = items.map((it) => ({ name: it.name, price: it.price, sku: it.sku }));
const r = await print(template, rows);
if (r.status === 'pending_permission') alert('Allow this site in the print agent.');
} finally {
setBusy(false);
}
};
return <button onClick={onClick} disabled={busy}>Print labels</button>;
}<script setup>
import { ref } from 'vue';
import { print } from '@82label/core';
import template from './labels/product.json';
const props = defineProps({ items: Array });
const busy = ref(false);
async function onPrint() {
busy.value = true;
try {
await print(template, props.items.map((it) => ({ name: it.name, price: it.price, sku: it.sku })));
} finally {
busy.value = false;
}
}
</script>
<template>
<button :disabled="busy" @click="onPrint">Print labels</button>
</template>What label printing needs
- Designermm rulers, a 1 mm grid, snapping and zoom. Place text, barcodes, QR codes, images, lines and boxes, and set positions as numbers. Works without signing in.
- {{fields}} and dataWrite changing values as {{name}} and pass an array: each row prints one label. Values go in as text only, so they are safe.
- Seven barcodes and QRCode128, EAN-13 and 8, UPC-A, Code39, ITF, ITF-14 and QR. EAN check digits are computed; bars snap to printer dots so they scan.
- mm-exact browser printing@page sized to the label, no margins, 100% scale. Formtec slots line up, and sheets start at any slot.
- Print without a dialogWith the Windows print agent running, the same print() goes straight to the label printer. Without it, the browser prints.
- Template as JSON or idInline the template JSON and nothing depends on 82label; save it and load by id, and edits on the site apply at once.
Pricing
Free when you host the template yourself. You pay only for keeping many templates on the 82label server.
Everything free until launch
Free
0
- Designer and JSON export
- Library (CDN, npm) and browser printing
- Roll and Formtec templates
- 3 templates saved on 82label
Subscription
₩5,000per template per month, VAT incl.
- Saved templates beyond 3
- Courier waybill templates
- Windows print agent (silent printing)
- Cancel any time, use until the period ends
Windows 10 and 11
No dialog. Click, and it prints
Install the 82label print agent and link it to your account (free for 30 days, then with a subscription): the same print() goes straight to the label printer. New sites need your OK, and updates install quietly after their signature checks out.
Free for 30 days · account link required
- InstallNo admin rights; runs in the tray
- LinkPaste the key from My templates › Print agent
- AllowAllow your site once, on its first print
Questions people ask
Is it really free?
The library (MIT), the designer, JSON export, browser printing and the roll and Formtec templates are free. Keeping more than 3 templates on the 82label server, courier waybill templates and the Windows print agent need a subscription (₩5,000 per template per month, VAT included). Everything is free until the official launch.
Which printers work?
Any printer with a Windows driver: thermal label printers (TSC, Zebra, Bixolon, Sewoo and others) and ordinary laser or inkjet printers for Formtec sheets all print the same picture at its size in millimetres. Printer languages such as ZPL are not used yet.
Can it print without the dialog?
Install the Windows print agent and link it to a subscribed account, and print() prints straight away with no dialog. Without the agent the same code opens the browser print dialog.
Labels are off on Formtec sheets.
Set the print dialog to 100% (actual size), turn off "fit to page" and set margins to none. If a printer still shifts by 1 or 2 mm, measure one test print on the calibration page; it applies to every print after that.
Can I print from Excel without code?
Yes. On bulk print, pick a template, upload Excel or CSV and match the columns. No sign-in needed, and the file is never uploaded.
The scanner does not read the barcode.
Make it at least 10 mm tall, keep clear space on both sides and set the template dpi to the printer's (usually 203). For long values widen the barcode, or use digits only so Code 128 can use its compact C set.
Can another site print on my printer without asking?
No. The agent checks which site sent the request, asks before a new site may print, and prints only for allowed sites. It accepts requests only from your own PC (127.0.0.1).
Can someone edit my template if they know its id?
No. An id only lets others read it; editing and deleting need the signed-in owner. Keep secrets out of templates and pass values as data at print time.
Does 82label issue courier tracking numbers?
No. Tracking numbers and pickups need a courier contract and their API. 82label prints the number and addresses you received in the right places on the waybill.
Does it work on Mac or Linux?
Browser printing works on any system. The print agent for silent printing is Windows 10 and 11 (64-bit) only for now.
Draw your first label now.
Design and print without signing up.
Open the designer