Repository navigation
Releases
Releases · u8array/ZPLab
ZPLab v0.9.0
Features
- Ask the printer from the document: a document can carry printer queries such as
~HS. When the desktop app prints over the network or USB, Query printer shows the printer's reply. With labels in the document the button reads Query and print. - Narrower numeric Code 128 barcodes: the Automatic subset checkbox lets the printer pack runs of digits. Contributed by @hieptuanle in #588.
- Sensors and interfaces without typing ZPL: two new tabs under Settings, Setup Script set the media sensors, calibration, printhead resistance, serial port and applicator port.
- Corner radius preview: the Rounding dropdown of a box names each radius and previews it on the canvas.
- ZPL reference in your language: its parameter tables follow the app language.
- Catalan: the 33rd interface language. Contributed by @quimalborch in #584.
Changes
- The browser supports 132 of the 225 ZPL commands, up from 125. The desktop app with a connected printer supports 147, up from 134.
- The MCP server keeps host commands and accepts the Code 128
modeproperty. - Tauri 2.12.5 and security fixes for encrypted connections.
Fixes
- Large centred text lands where the printer puts it. Reported by @pglomski in #565.
- QR Code magnification goes up to 100. Reported by @pglomski in #566.
- A GS1 DataBar can be dragged to a new width, and a barcode placed with
^FTstays put while dragging. - Selection, snapping and alignment follow the bars of a barcode. Hidden objects are no snap targets. Contributed by @skovkode in #595.
- The Code 128 preview matches the printout for the text under the barcode and for subset shifts. Contributed in part by @skovkode in #600.
- A control character in barcode data reaches the printer as the correct byte.
- The import report says whether a command needs a printer, cannot be decoded or is malformed.
- Oversized
^GFimports, long CSV files without a header row and large printer replies no longer crash the app. Contributed by @skovkode in #606. - An imported
^GFBgraphic exports correctly, and a^FXcomment stays with its field. - Opening another document closes the old dialogs. Undo and redo no longer leave deleted objects selected.
- A line is never thicker than it is long, and a decimal in a whole-number parameter is cut off, as on the printer.
- An edit that changes nothing adds no undo step.
- Top bar menus and the printer status chip are no longer hidden behind the output panel.
Full Changelog: v0.8.1...v0.9.0
v0.8.1
Features
- Renderer in the output dialog: Other printer and the PDF export show a Renderer select. It writes the same setting as Settings, App, Preview. With Built-in the PDF holds the current page only.
Changes
- The renderer option Off is now Built-in: ZPLab draws the label itself.
Fixes
- The output dialog no longer gets stuck when the Labelary privacy notice appears. Other printer and the PDF export work on the first try.
Full Changelog: v0.8.0...v0.8.1
v0.8.0
Features
- Output: File, Output is the one dialog for printing and for the PDF and PNG exports. Print lists the ways to the printer, among them Other printer for the operating system's print dialog. File writes a PDF or a PNG. The ZPL panel bar has an Output button too.
- One label per data row: the PDF export offers a Scope that writes one page per data row. It needs a mapped dataset and a working preview renderer.
- The printer in the ZPL panel: the desktop app shows the print target with a coloured dot for its state. Check now reports model, firmware, memory, state and warnings. Read configuration shows the printer's configuration. The output dialog has the same check under Check printer.
- Adopt settings: on the desktop, Adopt from printer lists the printer's own settings beside the app's values, with every difference ticked. Adopt selected writes them into the label settings and the printer profile. Eighteen settings are covered, from darkness and speed to media type and label size.
- Printer storage: the Fonts and Graphics tabs under Settings, Objects list every file with its origin. On the desktop, Read printer adds what the printer holds and shows how full each drive is. Show displays a stored graphic or a font sample the printer draws, Delete removes a file from the printer.
- Adding a font: Add font opens a dialog that proposes the printer filename and shows each face. The font list draws a sample per font, so the names stay readable.
- Fonts from this computer: the desktop app lists the installed fonts in that dialog. Fonts whose licence forbids embedding are greyed out.
- Command list and reference: the Command list sits left of the code and the ZPL reference right. Each folds to a rail.
- The source editor: an unmatched
^XAor^XZis underlined and offers the missing command as a repair. Apply on an emptied buffer asks whether to start a new design. - Reference blocks: 218 of the 225 commands show syntax, parameters and an example.
- Manage stored objects: the delivery select of a graphic or font links to its list under Settings, Objects.
- Deleting a cached file: an image or font can be deleted while an undo step still uses it. The confirmation says how many steps go with it.
Changes
- The File menu lost Send to Zebra Printer, Print as Image (browser), Export PDF and Export batch PDF. Output replaces all four.
- The Insert button of the reference is gone. A double-click or the right-click menu inserts a command. The arrow keys and
Enteract in the Command list, which is now a separate pane. - With a connected printer the desktop app covers 134 of the 225 ZPL commands, up from 127 in 0.7.1. The browser still covers 125.
- The AppImage shows up in Linux software centres with a description and screenshots, like the deb and rpm.
Fixes
- The desktop menu keeps working after a rebuild, for example after loading a CSV batch. Reported by @pglomski in #532.
- A dialog opened above the ZPL panel takes clicks again while the panel holds an edit it cannot apply.
- Minor and patch dependency updates, including Tauri 2.12.1.
Full Changelog: v0.7.1...v0.8.0
ZPLab v0.7.1
Features
- Profile graphics on the label: the Image source select lists the graphics your printer profile holds under "In the printer profile". Picking one puts that graphic on the label as a recall, so the job names it instead of carrying its bytes. The canvas draws it from the profile's copy at the graphic's own size.
- Delivery for every image: the Delivery select is there for every image, uploaded or picked. "Once in the setup script" gives the image a printer name and adds its bytes to the setup script in your printer profile. "Already on the printer" gives it the name only. An option you cannot pick shows the reason on hover.
Changes
- The Activate button under Printer storage is gone. The Delivery select replaces it.
- PRIVACY.md describes what leaves your device.
Fixes
- The Linux builds now run on older distributions as well, down to Ubuntu 22.04, Debian 12 and RHEL 9.
- An update check without an answer gives up after 30 seconds.
Full Changelog: v0.7.0...v0.7.1
v0.7.0
Features
- Export PDF: File, Export PDF writes one PDF page per label page, drawn by the renderer you picked for the preview. A batch PDF holds one page per data row.
- Preview off: Settings, Preview offers Off next to Labelary and the connected printer. With Off no label leaves the app for a preview. A PDF then holds the current page, drawn from the canvas.
- Print target: Settings, Printer holds how labels are sent and to which printer. Send to Zebra Printer opens with that method selected. An address and device from an earlier version carry over on the first start.
- Printer-native fonts:
~DT,~DU,~DSand~DBfont downloads and~DEencoding tables land in your printer profile on import. A font in the printer's own format replays from the profile as it was sent. - Stored formats: a page names the path
^DFstores its format under. A Template section shows that path, the page's slots and its dataset in one place. An imported^XFrecall block becomes a batch row of the template it recalls. - One delivery per resource: each font, graphic and stored format has its own delivery select. It ships with every job, uploads once in the setup script, or is already on the printer.
- GS1 Digital Link: QR Code and Data Matrix take the link as a content type.
- MECARD: a second contact type next to vCard. vCard takes a mobile number, a postal address, a note and a birthday. Both fill their fields from your browser profile until you insert the first variable.
- WiFi password: the field takes a variable and shows what you type.
- Export as
.prn: File, Export ZPL saves.zplor.prn. The desktop app and Chromium offer both in the save dialog. Other browsers download a.zplfile. - Docker: the web build ships as
ghcr.io/u8array/zplab, published with every release from this one on. - Insert from the reference: a right-click on a command offers the insert.
- The selection as an image: a right-click on the canvas copies or saves the selection as a PNG at printer resolution. The whole label saves at screen resolution.
- A taller ZPL panel: drag the panel up to the full height below the header.
Changes
- The content type "Contact" is now "vCard".
- Every empty
^FDor^FVslot in the ZPL panel is marked as a placeholder. - The deb and rpm show up in Linux software centres with a description and screenshots.
- MCP: an argument at the wrong level is refused by name, a design file handed over as a JSON string is read, a broken object is reported once per object, and an object without a rotation still opens.
Fixes
- Print a positioned
^FNwithout a font in the default font - Minor and patch dependency updates, including Tauri 2.12 and Konva 10.7
Full Changelog: v0.6.0...v0.7.0
ZPLab v0.6.0
Features
- Command reference beside the code: a panel explains the command your cursor is on, in your language. Search the catalogue or walk it with the arrow keys. Double-click a command to insert it. Every other use of that command is marked in the code.
- Stored graphics:
~DG,^IMand^ILnow import. Upload a graphic once through the printer setup script, the way fonts already work, so print jobs only recall it. Importing ZPL keeps the graphics it uploads in your printer profile, and the import summary links to them. - Objects in the printer settings: fonts and graphics for the printer now live in one place, together with the images this browser cached. Nothing still in use gets deleted, not even what an undo step or the clipboard holds.
- Agents edit in place over MCP:
edit_designchanges the label you have open, as one undo step you can take back. Only the change travels, not the whole design. ZPLab tells the agent to offer once and then keep editing, instead of asking before every change. - Undo what an agent replaced: when
open_in_appreplaces your label, a banner brings the previous one back, and you can switch between the two until you reload. - Linter: two more things the printer does silently are flagged. A field left open before the next
^FOis dropped, and one click inserts the missing^FS. A hex control byte cuts the rest of a text field.
Changes
- Design files are now written as schema version 6. ZPLab 0.5.0 cannot open them; older files still open here.
- A font keeps the printer drive it was imported with, and a bare font name is pinned to
E:..TTEfonts are accepted. - A font the browser cannot draw is still accepted for the printer, and the font manager says so.
- The image panel lost its cache-delete button. Deleting cached images moved to Settings, Objects. The Fonts tab is now "Font settings", and its upload list moved to Objects too.
- MCP: an
open_in_appreply says whether the replace can be undone,get_schemastates each numeric range, a prop of another object type is refused instead of ignored,raster_imagetakes a threshold from 1, and a call that fails validation names the field. Variables you send no longer need ids. - You can throw away a source edit straight from the review dialog.
Fixes
- Keep the default delimiter when
^FHstands on its own line - Drop raw line breaks from field data, as the printer does
- Stop a
^FNslot armed without data from printing a stray field - Return focus to the opener when a dialog closes
- Minor and patch dependency updates, including React 19.3, Konva 10.5, zod 4.6 and Vite 8.3, and rustls 0.23.45 for RUSTSEC-2026-0285
Full Changelog: v0.5.0...v0.6.0
ZPLab v0.5.0
Features
- Plain ZPL by default: exported, copied and printed ZPL no longer carries ZPLab's
^FXmetadata, so it can go straight to a printer or another tool, and the ZPL panel shows exactly what leaves the app. Enable "Keep ZPLab metadata in exports" for lossless re-import; the MCPexport_zpltool accepts ametadataflag. - Edit the ZPL without losing editor state: hidden objects, names, locks and groups survive applying an edit, even when you paste an older export of the same label back in. (inspired by @jogibear9988's idea in #375)
- Import warnings inline: findings with a source position are marked in the code panel, so you can see which line the editor could not model.
- Preflight warns about slot conflicts: before printing, you are told when two fields feed one
^FNslot with different encodings, which would print wrong data.
Changes
- The metadata sidecar is now written as
^FXZPLab:{"dpmm":8,"w":100,"h":60}^FS(values in mm); files from 0.4.x still import. - "New" keeps the media settings (size, density, media type) instead of resetting everything.
Fixes
- Park template slot declarations off the label instead of printing their default as a stray field at the origin (printer-measured)
- Keep mapped
^FNslots bare in batch stored formats and park recall-only slots off the label, so recall values no longer print on their own (reported by @ectoby, #407) - Repair duplicate or invalid
^FNslots when loading a saved design instead of sharing one slot in batch output - Limit the label shift and home inputs to the
^LSand^LHranges - Draw
^GBcorners at the printer's radius - Read the QR
^FDswitch prefix per spec and pin the^BYheight that shifts an^FOQR code - Emit the barcode
^BYinside the field, after the field opener - Re-import multi-page exports byte-exact by consuming every block's geometry sidecar instead of keeping it as a comment
- Report an
^FEembed with a character range (#n,a,x,y#) as a partial import instead of collapsing it silently - Render
^FRtext over a filled box solid instead of hollow on WebKit (reported by @ectoby, #399) - Dependency updates (minor and patch), including zod 4.5.4
Full Changelog: v0.4.0...v0.5.0
ZPLab v0.4.0
Features
- Editable ZPL source: the code panel below the canvas is a full editor, and applying an edit leaves every object you did not touch byte-exact. (suggested by @jogibear9988, #375)
- Calibrated device fonts: Font 0 and the resident fonts A-H match the printed glyphs across the full Latin-1 range, in every rotation.
- Printer-impact warnings: before sending, the output panel names the commands that reconfigure the printer (
^JU,^ST) or fire an action (~JA,~JC). - RFID transponder setup:
^RS,^RBand^RWround-trip as label configuration, with a settings tab and a canvas guide for the transponder position.
Fixes
- Load custom fonts in the desktop build, where the upload failed with "Could not load font file" (reported by @ectoby, #391)
- Match the Code 49 symbol height to the printed stack (printer-measured)
- Render the EAN/UPC guard zone independently of the interpretation line
- Attribute the
^FEprinter list to the spec instead of claiming exclusivity - Keep the settings reset button's height stable while it is armed
Full Changelog: v0.3.2...v0.4.0
ZPLab v0.3.2
Features
- Raw binary graphics import:
.zpl/.prnstreams with raw binary^GF/~DYpayloads now parse byte-exact; uncompressed bitmaps decode into editable images and re-export in a text-safe spec form. - Code 128 control characters: control bytes encode via subset invocations, imported invocation sequences become editable control chips, and the interpretation line matches the printed symbol.
Fixes
- Match the Aztec, MicroPDF417, MSI, Code 39, Interleaved 2-of-5 and TLC39 canvas symbols to the printed module layout (printer-measured)
- Derive GS1 field data once for canvas, preflight and print, so the preview can no longer drift from the wire
- Decode
^FNdefaults through the owning field's encoder on import - Keep images in headless MCP exports and probe barcode bounds with the app's measurement kernel instead of default boxes
- List every valid Aztec error-correction domain in the preflight detail
Full Changelog: v0.3.1...v0.3.2
ZPLab v0.3.1
Features
- Icon anchor control: the barcode value-anchor buttons use icons, so they no longer overflow in longer languages.
- Collapsible setup-script preview: the ZPL preview in the printer-settings dialog folds away to free space on small screens.
- Data placeholders: an empty variable default shows the connected data row's value as its placeholder.
Fixes
- Match the MaxiCode canvas symbol to the printed module layout and size
- Report a missing MaxiCode carrier message as a preflight finding instead of a red canvas error, parse
^BDwithout a mode to the spec default, and round-trip structured-append sets - Warn in preflight about Aztec error-correction values the preview cannot render, instead of erroring on the canvas
- Keep label width/height inputs editable while clearing them (no more freeze at 0)
- Keep a MaxiCode's position when rotating a group that contains it
Full Changelog: v0.3.0...v0.3.1