31Command line, server image & Helm
tools/ZplCli can be packed as a .NET tool (package ZplCore.Cli, command zplcore).
dotnet pack tools/ZplCli -c Release -o nupkg dotnet tool install -g ZplCore.Cli --add-source nupkg zplcore render label.zpl -o label.png --dpi 300 --width 100 --height 150 # mm; one image per label zplcore render label.zpl -o labels.pdf # pdf/tiff/html contain all labels zplcore render label.epl -f tiff -o out.tif # EPL is detected (or --epl) zplcore render label.zpl -f svg > label.svg # stdout; "-" reads stdin zplcore epl2zpl label.epl -o label.zpl zplcore print label.zpl --host 192.168.1.50 --port 9100 zplcore barcode qrcode "https://example.com" -o qr.svg # png/svg/pdf/eps/jpeg/zpl zplcore validate label.zpl # exit code 1 on warnings zplcore format label.zpl -o pretty.zpl --comments # one command per line; --minify, --indent n zplcore diff old.zpl new.zpl -o diff.png --boxes # pixel overlay + line diff, exit code 1 if different zplcore formats zplcore comply label.zpl --pack gs1-logistic,sunrise # compliance pre-check (text/JSON/SARIF) zplcore verify label.zpl --fail-on mismatch,grade:C # scan-proof zplcore check "labels/**/*.zpl" --verify --layout --format junit # CI: everything in one run zplcore import legacy.zpl -o label.json --report # ZPL → label model zplcore extract label.zpl --format json · zplcore redact label.zpl -o out.zpl zplcore gs1 migrate label.zpl -o label-2d.zpl · zplcore gs1 link "(01)…" zplcore rfid encode --sscc 340123450000000017 --company-prefix 7 --format zpl zplcore twin check label.zpl --profile ZD421d-203 · zplcore twin estimate … zplcore serve --chaos chaos.json --cut-marks # virtual printer with faults zplcore lift label.pdf -o label.zpl --report # PDF/SVG → native ZPL
More options: --labels 0,2, --flip x|y|xy, --landscape, --no-antialias, --field n=value, --encoding. zplcore --help lists every command; the checking commands are described in the sections Compliance to Vector-Lift.
Server image (distroless), NativeAOT containers, NAS & Helm chart
build/Dockerfile.server publishes samples/WebApiDemo on mcr.microsoft.com/dotnet/aspnet:10.0-azurelinux3.0-distroless (or aspnet:10.0-noble-chiseled-extra): no shell, user app (non-root), port 8080, /health, SQLite demo data in /tmp – runs with --read-only. For NativeAOT containers without the .NET runtime, mcr.microsoft.com/dotnet/runtime-deps:10.0-noble-chiseled-extra serves as the base image (~79–105 MB image size). That turns even an existing NAS (such as a Synology DS923+ via Synology Container Manager) or a Raspberry Pi into a local warehouse label print and rendering server (~90 MiB RAM, 67 ms PNG and 113 ms PDF preview over LAN on a DS923+). deploy/helm/zplcore contains a Deployment, Service and HorizontalPodAutoscaler (default 2–10 replicas, 70 % CPU), probes on /health, app settings via env and a read-only root file system with emptyDir on /tmp.
docker build -f build/Dockerfile.server -t zplcore-server .
docker run --rm --read-only --tmpfs /tmp -p 8080:8080 zplcore-server
curl -X POST 'localhost:8080/api/jobs/preview?format=pdf' -H 'Content-Type: application/json' \
-d '{"data":[{"trackingNo":"00340000000000000014","name":"Anna Huber","city":"Wien","country":"AT"}]}' -o preview.pdf
helm install labels deploy/helm/zplcore --set image.repository=myregistry/zplcore-server --set image.tag=1.0.0

