TypeScript-first DYMO LabelWriter driver — Node USB/TCP and browser WebUSB.
LabelWriter 550 / 5XL users: These models enforce an NFC label lock — only genuine DYMO labels will print. This is a hardware restriction that cannot be bypassed. See the hardware guide before buying media.
pnpm add @thermal-label/labelwriter-node # Node USB/TCP
pnpm add @thermal-label/labelwriter-web # Browser WebUSBFor ad-hoc printing from the terminal, install
thermal-label-cli — it
auto-detects every installed driver, no per-driver CLI needed.
import { discovery } from '@thermal-label/labelwriter-node';
import { MEDIA } from '@thermal-label/labelwriter-core';
const printer = await discovery.openPrinter();
try {
// image is RawImageData — { width, height, data } where data is RGBA bytes.
await printer.print(image, MEDIA.ADDRESS_STANDARD);
} finally {
await printer.close();
}import { requestPrinter } from '@thermal-label/labelwriter-web';
import { MEDIA } from '@thermal-label/labelwriter-core';
const printer = await requestPrinter(); // call from a user gesture
try {
await printer.print(image, MEDIA.ADDRESS_STANDARD);
} finally {
await printer.close();
}22 devices — 1 verified · 0 partial · 0 broken · 21 untested
| Model | Key | USB PID | Transports | Status |
|---|---|---|---|---|
| LabelWriter 4XL | LW_4XL |
0x001f | USB | ⏳ untested |
| LabelWriter 5XL | LW_5XL |
0x002a | USB, TCP | ⏳ untested |
| LabelWriter 300 | LW_300 |
0x0009 | USB, Serial | ⏳ untested |
| LabelWriter 310 | LW_310 |
0x0009 | USB, Serial | ⏳ untested |
| LabelWriter 330 | LW_330 |
0x0007 | USB, Serial | ⏳ untested |
| LabelWriter 330 Turbo | LW_330_TURBO |
0x0008 | USB, Serial | ✅ verified |
| LabelWriter 400 | LW_400 |
0x0019 | USB | ⏳ untested |
| LabelWriter 400 Turbo | LW_400_TURBO |
0x001a | USB | ⏳ untested |
| LabelWriter 450 | LW_450 |
0x0020 | USB | ⏳ untested |
| LabelWriter 450 Duo | LW_450_DUO |
0x0023 | USB | ⏳ untested |
| LabelWriter 450 Turbo | LW_450_TURBO |
0x0021 | USB | ⏳ untested |
| LabelWriter 450 Twin Turbo | LW_450_TWIN_TURBO |
0x0022 | USB | ⏳ untested |
| LabelWriter 550 | LW_550 |
0x0028 | USB | ⏳ untested |
| LabelWriter 550 Turbo | LW_550_TURBO |
0x0029 | USB, TCP | ⏳ untested |
| LabelWriter Duo - 96 | LW_DUO_96 |
0x0017 | USB | ⏳ untested |
| LabelWriter Duo - 128 | LW_DUO_128 |
0x001d | USB | ⏳ untested |
| LabelWriter EL40 | LW_EL40 |
— | Serial | ⏳ untested |
| LabelWriter EL60 | LW_EL60 |
— | Serial | ⏳ untested |
| LabelWriter SE450 | LW_SE450 |
0x0400 | USB, Serial | ⏳ untested |
| LabelWriter Turbo | LW_TURBO |
— | Serial | ⏳ untested |
| LabelWriter Twin Turbo | LW_TWIN_TURBO |
0x0018 | USB | ⏳ untested |
| LabelWriter Wireless | LW_WIRELESS |
0x0031 | USB, TCP | ⏳ untested |
Click any model to open its detail page on the docs site, where engines, supported media, and verification reports live. The same data backs the interactive cross-driver table.
Full docs at https://thermal-label.github.io/labelwriter/.
- Getting started
- Hardware list (incl. NFC-lock model list)
- Wire protocols — LW raster · LW5 raster · Duo tape
- Node guide
- Web guide
- API reference
- Live demo
| Package | Role |
|---|---|
@thermal-label/labelwriter-core |
Protocol encoding, device + media registries. Browser + Node. |
@thermal-label/labelwriter-node |
Node USB (libusb) and TCP transport. |
@thermal-label/labelwriter-web |
Browser WebUSB transport. |
The per-driver *-cli package was retired — use the unified
thermal-label-cli instead.
| Node | ≥ 20.9 (Node 24 LTS recommended) |
| Browsers | Chrome / Edge 89+, secure context (https:// or localhost) |
| Linux | typically needs a udev rule for 0922:* to access without sudo |
| Devices | LabelWriter 450 series (no NFC), 550 / 550 Turbo / 5XL (NFC-locked) — see hardware list |
| Peers | @thermal-label/contracts, @thermal-label/transport, @mbtech-nl/bitmap |
| License | MIT |
Not affiliated with DYMO. Trademarks belong to their owners.
See CONTRIBUTING/
on the org .github repo.