Embeddable WYSIWYG label editor + render API: design JSON in – ZPL, PNG, PDF or SVG out.
203
A WYSIWYG label editor for your own application, plus a stateless render API: the editor runs in the browser (embed it with an iframe or the JS SDK), designs are JSON documents you store yourself, and the API turns them into ZPL, PNG, PDF or SVG. Built on the zplCore rendering engine. Website and documentation: https://zplcore.com/docs/designer/
| Tag | Image |
|---|---|
1.0.0, 1.0, 1, latest | ASP.NET Core runtime on Azure Linux (distroless), linux/amd64 and linux/arm64 |
No shell, no package manager, non-root user app (UID 1654), port 8080. The server keeps no state: any number of
replicas, no sticky sessions.
docker run --rm -p 8080:8080 --read-only --tmpfs /tmp \
-e ZPLCORE_DESIGNER__AUTH__MODE=apikey \
-e ZPLCORE_DESIGNER__AUTH__APIKEYS__0=<your key, at least 16 characters> \
zplcore/designer:1.0.0
Open http://localhost:8080/designer/ – the editor UI. The API lives below /designer/api/ and needs the key in the
header X-Api-Key:
# ZPL of a design document (one label per record)
curl -X POST localhost:8080/designer/api/zpl \
-H 'X-Api-Key: <your key>' -H 'Content-Type: application/json' \
-d '{"document":{"label":{"unit":"Mm","width":50.8,"height":25.4,"items":[{"type":"text","name":"title","x":3,"y":4,"width":44,"height":4,"fontSize":8,"dataField":"name"}]}},"records":[{"name":"Hello"}]}'
# the same label as PNG (also: api/render/pdf, api/render/svg)
curl -X POST localhost:8080/designer/api/render/png \
-H 'X-Api-Key: <your key>' -H 'Content-Type: application/json' -d @request.json -o label.png
OpenAPI document: /designer/api/openapi/zplcore-designer.json. JS SDK for host pages: /designer/sdk/zplcore-designer.mjs
(also .umd.js, .d.ts). Probes: /healthz (liveness), /readyz (renders a tiny label).
The mode is required: ZPLCORE_DESIGNER__AUTH__MODE. The static editor UI stays public, the API needs a key or a token.
| Mode | Settings |
|---|---|
apikey | ZPLCORE_DESIGNER__AUTH__APIKEYS__0..n (at least 16 characters each, from a secret), header X-Api-Key (ZPLCORE_DESIGNER__AUTH__APIKEYHEADER to change it) |
jwt (oidc) | OIDC bearer tokens: ZPLCORE_DESIGNER__AUTH__AUTHORITY (issuer), ZPLCORE_DESIGNER__AUTH__AUDIENCE, optional ZPLCORE_DESIGNER__AUTH__REQUIREDROLE (claim role/roles), ZPLCORE_DESIGNER__AUTH__REQUIREHTTPSMETADATA |
none | no authentication – only behind your own proxy that authenticates (logged as a warning) |
Recommended for operation – read-only root file system with a writable /tmp, no capabilities, no privilege escalation:
docker run -p 8080:8080 --read-only --tmpfs /tmp --cap-drop ALL --security-opt no-new-privileges \
-e ZPLCORE_DESIGNER__AUTH__MODE=apikey -e ZPLCORE_DESIGNER__AUTH__APIKEYS__0=<key> zplcore/designer:1.0.0
zplCore Designer is commercial software under the zplCore licence agreement: https://zplcore.com/legal/eula/ (also in the
image: /licenses/LICENSE.md; third-party notices: /licenses/THIRD-PARTY-NOTICES.md).
Without a licence key the Designer runs in evaluation mode: every feature works, but previews and outputs carry the
zplCore.com TRIAL watermark. The offline licence key (product "Designer" plus an SDK licence of the same or a higher
type) comes from the environment variable ZPLCORE_LICENSE (the key itself) or ZPLCORE_LICENSE_FILE (path of a mounted
secret file). Licences: https://zplcore.com/pricing/
Environment variables ZPLCORE_DESIGNER__… (ASP.NET Core configuration, section Designer):
| Variable | Meaning |
|---|---|
ZPLCORE_DESIGNER__PATHBASE | route prefix of UI and API (default /designer) |
ZPLCORE_DESIGNER__ALLOWEDORIGINS__0..n | origins allowed to embed the editor (frame-ancestors) and to call the API from the browser (CORS); empty = same origin |
ZPLCORE_DESIGNER__LIMITS__* | protection limits: MAXREQUESTBODYBYTES, MAXRECORDSPERREQUEST, MAXITEMSPERDESIGN, MAXIMAGEBYTES, MAXCONCURRENTRENDERS, MAXQUEUEDRENDERS, QUEUETIMEOUT, RENDERTIMEOUT, RATELIMIT__PERMITSPERWINDOW, RATELIMIT__WINDOW |
ZPLCORE_DESIGNER__UI__BRANDING__* | title, logo, hidden tabs of the editor |
ASPNETCORE_FORWARDEDHEADERS_ENABLED=true | trust X-Forwarded-* of your ingress (client IP for the rate limit, https links) |
OTEL_EXPORTER_OTLP_ENDPOINT (+ standard OTEL_*) | OpenTelemetry export of metrics, traces and logs; unset = off |
Folders, mounted read-only and used when present: /fonts (printer fonts, e.g. E:NAME.TTF), /graphics (printer-memory
graphics), /templates, /icons, /svg-fonts, /graphic-fonts (font families released for graphic text).
A Helm chart (non-root, read-only root file system, HPA, optional NetworkPolicy) is described in the documentation: https://zplcore.com/docs/designer/ – API keys and the licence key come from existing Secrets only, never from values files.
The images are signed with cosign; every platform image carries its SBOM (SPDX) as a signed attestation. Public key: https://zplcore.com/cosign.pub
cosign verify --key cosign.pub zplcore/designer:1.0.0
# SBOM of one platform image (digests: docker buildx imagetools inspect zplcore/designer:1.0.0)
cosign verify-attestation --key cosign.pub --type spdxjson zplcore/designer@sha256:<digest of the platform image>
Content type
Image
Digest
sha256:a623be23b…
Size
91.3 MB
Last updated
about 23 hours ago
docker pull zplcore/designer