The web app now renders with the cross-platform Skia engine: measurably closer to Labelary than the previous GDI renderer (60.6k vs 68.5k mismatched pixels across the sample suite), roughly 3x faster end-to-end thanks to its tuned grayscale PNG pipeline, and no longer tied to Windows hosting. The desktop app keeps the GDI renderer, which remains the fidelity reference.
Fixes
The "Five Labels" RMA label's own layout had two collisions that rendered identically (and identically wrong) on Labelary: the PDF417 sat flush against the Data Matrix and ran through the footer rule. The sample now spaces the symbols and sizes the PDF417 to clear the footer.
Version 1.9.0
June 11, 2026
Enhancements
Open a ZPL file straight into the editor: both apps gained an "Open" control accepting .zpl and .txt files, with the content validated (it must contain a ^XA…^XZ label) before it replaces the editor text.
Copy the editor's ZPL to the clipboard with one click: the new Copy button disables itself when the editor is empty and flashes "Copied" as confirmation.
Paging through a multi-label stream in the desktop app is instant: rendered labels are cached per label, the preview no longer copies bitmaps, and renders go straight to the screen bitmap instead of round-tripping through PNG encode/decode (preview renders are up to 15x faster).
Fixes
Switching labels in the desktop app no longer hangs for seconds on large documents: paging now moves only the active-label highlight instead of re-colouring every token in the editor, and linter results are reused instead of recomputed.
Version 1.8.0
June 11, 2026
Enhancements
The cross-platform Skia renderer is 5x faster (about 4 ms per 4x6 label, down from 30): labels render to a grayscale canvas with a tuned PNG encoder, producing the same grayscale PNG format Labelary serves.
Reverse-printed fields (^FR over graphics) and barcodes draw substantially faster in both renderers, and a new benchmark project (Ignyte.ZplRenderingEngine.Benchmarks) reports per-sample render times and memory so performance regressions are caught the same way rendering regressions are.
The Labelary fidelity guard now covers the full 50-label test corpus in addition to the built-in samples - 63 labels, each with a committed ground-truth image and a per-label deviation budget that only ratchets down.
Fixes
^LS (label shift) shifts fields LEFT for positive values, as on a real printer, and the shifted origin stops at the label edge instead of pushing fields off the canvas.
Print darkness is simulated: when ~SD plus ^MD reaches zero or below, the label prints blank, exactly as Labelary renders it; out-of-range ~SD values are ignored while out-of-range ^MD values still apply.
^GD diagonals are drawn as Labelary draws them - a parallelogram whose thickness is horizontal, so a thick shallow diagonal no longer renders heavier than Labelary's.
Version 1.7.0
June 11, 2026
Enhancements
PDF417 (^B7) and Data Matrix (^BX) symbols are now pixel-identical to Labelary's. Both encoders are faithful ports of the engine Labelary uses (Okapi Barcode): the same data-compaction mode decisions, error-correction generation and module placement, verified module-for-module across text, numeric, mixed, binary and multi-block payloads.
GS1-128 support: Code 128 (^BC) now honours the full set of ZPL invocation codes in field data - >8 inserts FNC1, >9 / >: / >; select or switch subsets A / B / C, >0 prints a literal ">", and >7 / >6 / >5 insert FNC2-4 - with the codes stripped from the interpretation line, exactly as Labelary renders them.
Fixes
A blank ^B7 security level now defaults to 0 and automatic sizing picks Labelary's column/row shape; impossible size requests render nothing instead of a wrong-size symbol.
Suite-wide pixel mismatch versus Labelary dropped a further 12% (79.5k to 69.6k) across the sample suite.
Version 1.6.0
June 11, 2026
Enhancements
Two new built-in samples: "Five Labels" (hazmat, cold-chain pharma, retail price tag, IT asset tag, and RMA labels) and "Five Labels (Relative)" (shipping, nutrition panel, warehouse bin, event ticket, and lab specimen labels built entirely with relative positioning — each section re-anchored with ^LH).
UPC-A barcodes (^BU) are now rendered: full encoding with computed check digit, guard and end-symbol bars extended below the data bars, and Labelary's exact four-part interpretation line (system digit, two spread 5-digit groups, check digit) in the resident font A face.
^GC circles with a border at or beyond the radius now draw a solid disc, enabling filled badges with reverse-printed text.
Fixes
^LH (Label Home) is now stateful: real-world labels that re-anchor each section with a fresh ^LH render correctly (previously only one home position applied to the whole label, collapsing such layouts).
QR codes are placed below the field origin by the current ^BY default bar height — the previous fixed 10-dot offset was only correct at the ^BY default. Verified against Labelary at heights 7 through 150.
Field blocks (^FB) honour the ^A font width multiplier in the GDI renderer, matching Labelary and the Skia renderer.
Centered ^FB lines ending with an explicit \& hard break now center exactly; only wrapped and end-of-data lines keep Labelary's trailing-space allowance.
Version 1.5.0
June 11, 2026
Enhancements
The ^FP (Field Parameter) command is now supported in both renderers, matching Labelary's behaviour exactly: ^FPH,g adds the requested gap in printer dots between characters (unscaled by the ^A width multiplier), ^FPV prints characters stacked vertically at font-height steps in all four orientations, and ^FPR prints characters in reverse order ending at the field origin.
Real-world labels using ^FP now render correctly — the "Real Life 2" sample's deviation from Labelary dropped a further 24%, and the suite-wide pixel mismatch fell from 46.4k to 43.9k.
Two ^FP probe labels joined the regression case set, locking the new behaviour into the golden-image suite.
Fixes
Field-scoped state (like ^FP) survives the ^FT/^FO that follows it on the same field, and is correctly cleared at the end of each ^FD field.
Version 1.4.0
June 11, 2026
Enhancements
QR codes (^BQ) are now pixel-identical to Labelary's. The encoder is a faithful port of the same engine Labelary uses (Okapi Barcode): identical segment splitting for mixed text/number data, the same automatic error-correction boosting (e.g. Q is raised to H when it fits the symbol), and the same data-mask selection — verified module-for-module across byte, alphanumeric, numeric and mixed payloads at every ECC level.
Barcode interpretation lines now reproduce Labelary's exactly: the human-readable text under Code 128, Code 39, Interleaved 2-of-5 and Code 11 uses the resident font A face at a magnification equal to the module width, with Labelary's 6-dot gap below the bars — replacing the bold condensed text that previously collided with the bars.
New per-sample fidelity guard in the test suite: every built-in sample is rendered and compared ink-for-ink against a committed Labelary reference, and each sample's deviation is capped by a budget that only ratchets down — a regression in any single label now fails the build even if the overall numbers improve.
Suite-wide pixel mismatch versus Labelary dropped 61% in this release (120k → 46k pixels across the sample suite).
Fixes
^FB field-block text was stretched ~3% versus plain text and centered lines sat several dots off; blocks are now wrapped and aligned with the same glyph layout as plain fields, including Labelary's centering rule (each wrapped line centers as if it kept one trailing space), and wrapped lines advance by the ZPL line height instead of GDI's.
All ^FO-anchored text in the GDI renderer sat 1–2 dots above Labelary's position; the embedded ZPL Elite face anchors exactly on the field origin now.
Version 1.3.0
June 10, 2026
Enhancements
The resident bitmap fonts A–H now render with their authentic letterforms: eight original "ZPL Elite A–H" faces, traced from Labelary's own renders, replace the generic monospace stand-in. Each font's true cell geometry, fixed character pitch and discrete 1–10× magnification steps are reproduced exactly — e.g. ^CFA,15 and ^CFA,20 both snap to 2× like a real printer.
Character-set quirks of the real fonts are honoured: font B renders lowercase as capitals, OCR-A font H has no lowercase at all (the pen still advances one cell, as on a printer), and OCR-B font E carries its authentic leading above the cap.
ZPL-I-style labels match Labelary much more closely — the bitmap-font sample's ink agreement rose from 69.7% to 91.7%, and the whole sample suite's pixel mismatch dropped a further 8%.
Fixes
Bitmap-font text in the Skia renderer now snaps to the printer's discrete magnification steps instead of scaling continuously, matching the GDI renderer and Labelary.
Font E text sat two dots high at small sizes; it now lands exactly on Labelary's baseline.
Version 1.2.0
June 10, 2026
Enhancements
Scalable font 0 is now "ZPL Elite", an original face traced from Labelary's font-0 renders (CG Triumvirate Bold Condensed): ~99% per-glyph shape agreement, string widths within a pixel of Labelary, and a 47% drop in suite-wide pixel difference versus the previous substitute font.
MaxiCode (^BD) barcodes are now real, scannable symbols — all modes 2–6 including structured-carrier shipments — drawn module-for-module in Labelary's footprint and verified by an independent decoder.
Data Matrix (^BX) and PDF417 (^B7) render as real, scannable symbols, and QR (^BQ) now matches Labelary almost module-for-module.
The cross-platform Skia renderer reached full feature parity with the GDI engine (word-wrapped ^FB field blocks, ^GE ellipses, ^GF raster images) and is locked in by its own golden-image regression suite — ready to host on a Linux server.
Fixes
The rendered canvas always equals the requested media size, as on Labelary — a smaller ^PW/^LL no longer shrinks the image.
Pixel-accuracy fixes verified against the Labelary API: rotated ^FO text anchors its em-box top-left on the field origin, QR symbols sit 10 dots below the origin, barcode HRI text sits at Labelary's cap position, ^GC/^GE stroke inside their bounding box, and ^GD diagonal orientations were inverted.
Version 1.1.0
June 9, 2026
Enhancements
A built-in linter reports the same problems — with the same wording — as Labelary's: shown in a Problems panel beneath the preview, with the offending ZPL highlighted in the editor.
The editor gained a Clear button, the preview a view-only 90° Rotate, and two real-world shipping labels joined the built-in samples.
The rendering core was split into a cross-platform library (parser, barcode encoders, linter, formatter, samples) with a new SkiaSharp render backend for non-Windows servers.
Streaming multi-label rendering plus a CPU-bound concurrency throttle keep memory flat when rendering hundreds of labels at once.
Fixes
Code 128 uses the compact numeric subset only when the data explicitly invokes it (">;"), matching Labelary's widths; ^LR label-reverse is now stateful across fields.
Version 1.0.0
June 8, 2026
Enhancements
Initial release: live ZPL preview in a WinForms desktop app and a Blazor web app over a self-contained rendering engine — text, barcodes (Code 128, Code 39, Interleaved 2-of-5, Code 11, QR), boxes/circles/diagonals, embedded ^GF images, multi-label streams, a one-command-per-line formatter, syntax highlighting, built-in samples and PNG export. All barcodes verified scannable with an independent decoder.