Keep the fields. Account for every contact.

A merge should not silently strip a logger's custom fields. QSO Merge Bench reads every supported field, including names it does not recognize, and presents them in the comparison table. Field names are normalized to uppercase; values and optional type indicators are retained.

Lengths protect literal data

ADI uses declared field lengths. In <APP_NOTE:5:S><EOR>, the five-character value is literally <EOR>; it does not end the record. The parser consumes the value length before looking for the next tag. Export recalculates the length of every value. These rules follow ADIF section IV.A.

What preservation means here

Contacts kept separate preserve their field values and order. Merged contacts retain A's field order, add fields present only in B, and apply your choices to shared conflicts. Free annotation text outside fields, original capitalization of field names and formatting whitespace are not copied. Your original files are unchanged.

Export headers identify the new tool and format version. Original ADIF_VER, PROGRAMID, PROGRAMVERSION and CREATED_TIMESTAMP header values remain in the JSON manifest as provenance. Other custom header fields are preserved, with explicit choices for conflicts. Conflicting USERDEF definitions stop comparison instead of silently reinterpreting values.

The conservation equation

Every input contact maps to exactly one output contact. Each explicit pair merge reduces the output count by one: input contacts = output contacts + merged pairs. In the synthetic sample, six inputs with one merge produce five outputs. A contact cannot be merged twice.

Read both downloads

The ADI is reparsed and compared with the pending output field values before either download is offered. The JSON manifest records source filenames and headers, all output-to-input mappings, explicit decisions, and both original records for each merged pair. The manifest is private material, not anonymous telemetry.

Structural checks do not prove the records are true, the field values are semantically valid, or a specific logger will accept the file. Test the new copy in a separate logger database before replacing a working log. Review private download handling and bounded input support.

Open the merge bench