ADIF-to-QSL-label

ADIF to QSL Labels

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.

Features

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.”

Browser workflow

  1. Open make_qsl_labels.html from the hosted site or a local static server.
  2. Load an .adi, .adif, or .txt log in Data.
  3. Choose Label sheets or Direct QSL card and adjust the layout.
  4. Add custom columns by selecting any discovered ADIF tag. A tag restored from a snapshot remains available even when the current log does not contain it.
  5. Use Save snapshot to keep all stable settings and Load snapshot to restore them later.
  6. Export the PDF. Multi-page exports show progress and can be cancelled.

Snapshots written by v5.25 use schema version 1. See docs/config-schema.md for compatibility and migration details.

Local development

Requirements:

npm ci
npx playwright install chromium
npm run serve

Then open http://127.0.0.1:4173/make_qsl_labels.html.

Verification

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.

Dependencies

The runtime PDF library is pinned and self-hosted:

Development and test dependencies are pinned in package-lock.json.

License

MIT — free to use, fork, and adapt.