Browser-based, print-ready QSL labels and direct QSL cards generated locally from an ADIF log.
Open the hosted helper
or clone this repository and serve make_qsl_labels.html locally.
QSL_SENT=Y and QSL_SENT_VIA=B to the
selected records while retaining untouched fields and records.All ADIF/config processing happens in the browser. The application does not upload logs or snapshots and contains no analytics event reporting.
ADIF export preserves record order and all untouched field names, values, type indicators, and extension fields. Updated records receive canonical field-length descriptors; line endings, outer record whitespace, and trailing header whitespace may be normalized. Filtering can intentionally omit records when “only filtered QSOs” is selected.
In the printer dialog, choose Actual size / 100%. Disable “Fit to page.”
make_qsl_labels.html from the hosted site or a local static server..adi, .adif, or .txt log in Data.Snapshots written by v5.25 use schema version 1. See
docs/config-schema.md for compatibility and migration
details.
Requirements:
pdftoppm) for PDF pixel comparisonnpm ci
npx playwright install chromium
npm run serve
Then open http://127.0.0.1:4173/make_qsl_labels.html.
npm run lint
npm run format:check
npm run test:unit
npm run test:e2e
Or run the same aggregate used by CI:
npm run ci
For a local working-tree comparison against the latest commit:
npm run benchmark:pdf
Set PDF_BASELINE_REF to compare against another Git reference.
The suite includes configuration migrations, label/card snapshot round trips, official-spec-derived ADIF fixtures, seeded parser properties, untouched ADIF field/record preservation, PDF page-box and preview-to-PDF pixel comparisons, responsive Playwright scenarios, and axe accessibility checks.
PDF regression tests use a 0.1 mm page-size tolerance. The visual comparison allows up to 6% changed pixels because PDF rasterization re-antialiases the 4× canvas image; larger changes fail and produce diagnostic images under the Playwright test output directory.
The runtime PDF library is pinned and self-hosted:
vendor/jspdf.umd.min.jsDevelopment and test dependencies are pinned in package-lock.json.
MIT — free to use, fork, and adapt.