{"id":49362145,"url":"https://github.com/thermal-label/labelwriter","last_synced_at":"2026-06-06T00:03:27.588Z","repository":{"id":353230760,"uuid":"1218515282","full_name":"thermal-label/labelwriter","owner":"thermal-label","description":"TypeScript-first DYMO LabelWriter label printer driver suite — Node.js USB/TCP, browser WebUSB, and CLI.","archived":false,"fork":false,"pushed_at":"2026-06-05T22:55:49.000Z","size":835,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-05T23:09:36.671Z","etag":null,"topics":["browser","dymo","label-printer","labelwriter","nodejs","printer-driver","reverse-engineering","tcp","thermal-label","thermal-printer","typescript","usb","webusb"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thermal-label.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"mannes","ko_fi":"mannes"}},"created_at":"2026-04-23T00:35:51.000Z","updated_at":"2026-06-05T22:53:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thermal-label/labelwriter","commit_stats":null,"previous_names":["thermal-label/labelwriter"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/thermal-label/labelwriter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thermal-label%2Flabelwriter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thermal-label%2Flabelwriter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thermal-label%2Flabelwriter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thermal-label%2Flabelwriter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thermal-label","download_url":"https://codeload.github.com/thermal-label/labelwriter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thermal-label%2Flabelwriter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33964367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","dymo","label-printer","labelwriter","nodejs","printer-driver","reverse-engineering","tcp","thermal-label","thermal-printer","typescript","usb","webusb"],"created_at":"2026-04-27T17:00:17.734Z","updated_at":"2026-06-06T00:03:27.582Z","avatar_url":"https://github.com/thermal-label.png","language":"TypeScript","funding_links":["https://github.com/sponsors/mannes","https://ko-fi.com/mannes"],"categories":[],"sub_categories":[],"readme":"# @thermal-label/labelwriter\n\n\u003e TypeScript-first DYMO LabelWriter driver — Node USB/TCP and browser WebUSB.\n\n[![CI](https://github.com/thermal-label/labelwriter/actions/workflows/ci.yml/badge.svg)](https://github.com/thermal-label/labelwriter/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/thermal-label/labelwriter/branch/main/graph/badge.svg)](https://codecov.io/gh/thermal-label/labelwriter)\n[![npm core](https://img.shields.io/npm/v/@thermal-label/labelwriter-core.svg?label=core)](https://npmjs.com/package/@thermal-label/labelwriter-core)\n[![npm node](https://img.shields.io/npm/v/@thermal-label/labelwriter-node.svg?label=node)](https://npmjs.com/package/@thermal-label/labelwriter-node)\n[![npm web](https://img.shields.io/npm/v/@thermal-label/labelwriter-web.svg?label=web)](https://npmjs.com/package/@thermal-label/labelwriter-web)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n\u003e **LabelWriter 550 / 5XL users:** These models enforce an NFC label lock —\n\u003e only genuine DYMO labels will print. This is a hardware restriction that\n\u003e cannot be bypassed. See the [hardware guide](https://thermal-label.github.io/labelwriter/hardware)\n\u003e before buying media.\n\n## Install\n\n```bash\npnpm add @thermal-label/labelwriter-node    # Node USB/TCP\npnpm add @thermal-label/labelwriter-web     # Browser WebUSB\n```\n\nFor ad-hoc printing from the terminal, install\n[`thermal-label-cli`](https://www.npmjs.com/package/thermal-label-cli) — it\nauto-detects every installed driver, no per-driver CLI needed.\n\n## Quick example (Node)\n\n```ts\nimport { discovery } from '@thermal-label/labelwriter-node';\nimport { MEDIA } from '@thermal-label/labelwriter-core';\n\nconst printer = await discovery.openPrinter();\ntry {\n  // image is RawImageData — { width, height, data } where data is RGBA bytes.\n  await printer.print(image, MEDIA.ADDRESS_STANDARD);\n} finally {\n  await printer.close();\n}\n```\n\n## Quick example (Browser)\n\n```ts\nimport { requestPrinter } from '@thermal-label/labelwriter-web';\nimport { MEDIA } from '@thermal-label/labelwriter-core';\n\nconst printer = await requestPrinter(); // call from a user gesture\ntry {\n  await printer.print(image, MEDIA.ADDRESS_STANDARD);\n} finally {\n  await printer.close();\n}\n```\n\n## Supported hardware\n\n\u003c!-- HARDWARE_TABLE:START --\u003e\n**22 devices** — 4 verified · 0 partial · 13 expected · 0 unsupported · 5 unverified\n\n| Model | Key | USB PID | Transports | Status |\n| --- | --- | --- | --- | --- |\n| [LabelWriter 4XL](https://thermal-label.github.io/hardware/labelwriter/lw-4xl) | `LW_4XL` | 0x001f | USB | 🔄 expected |\n| [LabelWriter 5XL](https://thermal-label.github.io/hardware/labelwriter/lw-5xl) | `LW_5XL` | 0x002a | USB, TCP | 🔄 expected |\n| [LabelWriter 300](https://thermal-label.github.io/hardware/labelwriter/lw-300) | `LW_300` | 0x0009 | USB, Serial | 🔄 expected |\n| [LabelWriter 310](https://thermal-label.github.io/hardware/labelwriter/lw-310) | `LW_310` | 0x0009 | USB, Serial | 🔄 expected |\n| [LabelWriter 330](https://thermal-label.github.io/hardware/labelwriter/lw-330) | `LW_330` | 0x0007 | USB, Serial | 🔄 expected |\n| [LabelWriter 330 Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-330-turbo) | `LW_330_TURBO` | 0x0008 | USB, Serial | ✅ verified |\n| [LabelWriter 400](https://thermal-label.github.io/hardware/labelwriter/lw-400) | `LW_400` | 0x0019 | USB | ✅ verified |\n| [LabelWriter 400 Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-400-turbo) | `LW_400_TURBO` | 0x001a | USB | 🔄 expected |\n| [LabelWriter 450](https://thermal-label.github.io/hardware/labelwriter/lw-450) | `LW_450` | 0x0020 | USB | 🔄 expected |\n| [LabelWriter 450 Duo](https://thermal-label.github.io/hardware/labelwriter/lw-450-duo) | `LW_450_DUO` | 0x0023 | USB | 🔄 expected |\n| [LabelWriter 450 Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-450-turbo) | `LW_450_TURBO` | 0x0021 | USB | 🔄 expected |\n| [LabelWriter 450 Twin Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-450-twin-turbo) | `LW_450_TWIN_TURBO` | 0x0022 | USB | ⏳ unverified |\n| [LabelWriter 550](https://thermal-label.github.io/hardware/labelwriter/lw-550) | `LW_550` | 0x0028 | USB | ✅ verified |\n| [LabelWriter 550 Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-550-turbo) | `LW_550_TURBO` | 0x0029 | USB, TCP | 🔄 expected |\n| [LabelWriter Duo - 96](https://thermal-label.github.io/hardware/labelwriter/lw-duo-96) | `LW_DUO_96` | 0x0017 | USB | 🔄 expected |\n| [LabelWriter Duo - 128](https://thermal-label.github.io/hardware/labelwriter/lw-duo-128) | `LW_DUO_128` | 0x001d | USB | ✅ verified |\n| [LabelWriter EL40](https://thermal-label.github.io/hardware/labelwriter/lw-el40) | `LW_EL40` | — | Serial | ⏳ unverified |\n| [LabelWriter EL60](https://thermal-label.github.io/hardware/labelwriter/lw-el60) | `LW_EL60` | — | Serial | ⏳ unverified |\n| [LabelWriter SE450](https://thermal-label.github.io/hardware/labelwriter/lw-se450) | `LW_SE450` | 0x0400 | USB, Serial | 🔄 expected |\n| [LabelWriter Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-turbo) | `LW_TURBO` | — | Serial | ⏳ unverified |\n| [LabelWriter Twin Turbo](https://thermal-label.github.io/hardware/labelwriter/lw-twin-turbo) | `LW_TWIN_TURBO` | 0x0018 | USB | ⏳ unverified |\n| [LabelWriter Wireless](https://thermal-label.github.io/hardware/labelwriter/lw-wireless) | `LW_WIRELESS` | 0x0031 | USB, TCP | 🔄 expected |\n\nClick 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](https://thermal-label.github.io/hardware/).\n\u003c!-- HARDWARE_TABLE:END --\u003e\n\n## Documentation\n\nFull docs at **\u003chttps://thermal-label.github.io/labelwriter/\u003e**.\n\n- [Getting started](https://thermal-label.github.io/labelwriter/getting-started)\n- [Hardware list](https://thermal-label.github.io/labelwriter/hardware) (incl. NFC-lock model list)\n- [Wire protocols](https://thermal-label.github.io/labelwriter/protocol/) — [LW raster](https://thermal-label.github.io/labelwriter/protocol/lw-raster) · [LW5 raster](https://thermal-label.github.io/labelwriter/protocol/lw5-raster) · [Duo tape](https://thermal-label.github.io/labelwriter/protocol/duo-tape)\n- [Node guide](https://thermal-label.github.io/labelwriter/node)\n- [Web guide](https://thermal-label.github.io/labelwriter/web)\n- [API reference](https://thermal-label.github.io/labelwriter/api/)\n- [Live demo](https://thermal-label.github.io/demo/labelwriter)\n\n## Packages\n\n| Package | Role |\n|---|---|\n| `@thermal-label/labelwriter-core` | Protocol encoding, device + media registries. Browser + Node. |\n| `@thermal-label/labelwriter-node` | Node USB (libusb) and TCP transport. |\n| `@thermal-label/labelwriter-web` | Browser WebUSB transport. |\n\nThe per-driver `*-cli` package was retired — use the unified\n[`thermal-label-cli`](https://www.npmjs.com/package/thermal-label-cli) instead.\n\n## Compatibility\n\n| | |\n|---|---|\n| Node | ≥ 20.9 (Node 24 LTS recommended) |\n| Browsers | Chrome / Edge 89+, secure context (`https://` or `localhost`) |\n| Linux | typically needs a `udev` rule for `0922:*` to access without `sudo` |\n| Devices | LabelWriter 450 series (no NFC), 550 / 550 Turbo / 5XL (NFC-locked) — see hardware list |\n| Peers | `@thermal-label/contracts`, `@thermal-label/transport`, `@mbtech-nl/bitmap` |\n| License | MIT |\n\nNot affiliated with DYMO. Trademarks belong to their owners.\n\n## Contributing\n\nSee [`CONTRIBUTING/`](https://github.com/thermal-label/.github/tree/main/CONTRIBUTING)\non the org `.github` repo.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthermal-label%2Flabelwriter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthermal-label%2Flabelwriter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthermal-label%2Flabelwriter/lists"}