WD4DAN ADIF Editor
A browser-based editor for ADIF (.adi/.adif) ham radio
logs, styled to work like a desktop application. You open a log, edit it in a
spreadsheet-style grid, validate it, and save it back out.
Your log stays on your computer. ADIF logs routinely carry names, addresses, and emails via QSL fields, so opening, editing, validating, and saving all happen locally in your browser, the same as using a desktop program. Only these features send anything off your machine, and only when you use them:
- Open in QSO Map sends your current log to the separate QSO Map tool on this site, in a new tab.
- Import Paper Log Image sends the photos you choose to an AI service to be read.
- POTA park checks send just the park reference numbers (not the rest of your log) to this site, to look up whether each park exists and is active.
This page documents every menu item, toolbar button, and grid behavior. Use the list on the left (or the top of the page on a phone) to jump to a section.
The grid
How the spreadsheet itself works — selecting, editing, and reading rows.
Use File → Open…, or just drag an .adi/.adif file
and drop it onto the grid. Columns are created automatically from whatever
fields actually appear in the file, ordered to match the standard ADIF field
order first, with anything else sorted alphabetically after.
CALL, OPERATOR, and STATION_CALLSIGN are
automatically uppercased on open if they weren't already (callsigns are
conventionally uppercase); a trailing * next to the file name in
the status bar right after opening means this actually changed something. See
File → View Raw ADIF… if you need to see the file exactly as
it was before that normalization. The same three fields are also uppercased
the moment you type or paste into one of their cells in the grid, not just on
open.
# column)Shows the row's current position in the grid — it updates live if you sort a column, and doesn't reflect where the record sits in the underlying file. Click a row number to select just that row (like a spreadsheet row header); Shift-click or Alt-click another row number to select every row in between.
Each checkbox toggles that one row in or out of the selection, and clicking several just accumulates — it doesn't replace your previous picks. Shift-click or Alt-click a checkbox to select a contiguous range instead. The checkbox in the column header selects or clears every row at once. Row/column tools that say "selected rows" (Fill Column, Replace All, Export subsets, etc.) act on whatever's checked here — with nothing checked, they act on the whole log.
Click any data cell to edit it — a text box, dropdown, or checkbox opens
depending on the field's ADIF data type (for example BAND and
MODE offer a dropdown of known values; a boolean field like
QSL_RCVD offers Y/N). Press Tab or
Enter to commit and move to the next cell, or
Escape to cancel. Clicking into a data cell also clears any
checkbox selection — checkbox/row-number clicks are the only way to
multi-select rows, so editing and multi-select don't get tangled together.
The SUBMODE cell's dropdown only lists submodes that are
actually valid for that row's MODE (for example, only MFSK
submodes like FT4/FT8/JS8 show up when MODE is MFSK). A row with
no MODE set yet can't have its SUBMODE edited until MODE is filled in.
Blue outline — the last cell you clicked into. Darker blue — the cell currently being edited. Red — a validation error on that cell. Amber — a validation warning. Hover a red or amber cell to see the specific issue as a tooltip; see Validation reference below for what gets checked.
Columns size themselves to fit their widest value automatically (including the header title, which is never truncated) and re-measure live as you edit. Drag a column's border to resize it by hand, or drag a column header left/right to reorder it — both are remembered, and reordering is undoable (Ctrl+Z) like any other change.
Right-click a row for Add/Duplicate/Delete/Move Up/Move Down/Copy as ADIF/Copy as CSV — including blank space below the last row, which acts the same as right-clicking that row. Right-click a column header for Hide/Show, Add Column, Fill Column, Split Column, or Delete Column — each opens pre-filled for the column you clicked; blank space in the header row past the last column acts the same as right-clicking that last column. Hide/Show Column (from either the right-click menu or View → Show/Hide Columns) is a normal undoable change (Ctrl+Z) like any other.
Validation reference
What gets checked, and how strict each one is. Every row is checked continuously as you edit — problem cells get colored and a tooltip explains why (see Cell colors); the three Validate commands just gather everything into one list.
Generic validation
Runs automatically in the background and is what colors cells red/amber as you edit. Checks include:
- Every field's value against its ADIF data type — dates as
YYYYMMDD, times asHHMM/HHMMSSwith valid hour/minute/second ranges, numbers, Y/N booleans, grid squares, lat/lon locations, and known enumerated values (BAND, MODE, etc.). STATEchecked against that row'sDXCCentity's own list of valid subdivisions (falling back to a looser check across all entities if DXCC isn't set).CNTY/MY_CNTYchecked against the counties of that row'sSTATE/MY_STATE. ADIF writes a county asSTATE,County(for exampleVA,Fairfax); a bareFairfax, a county from a different state, or a name that isn't a real county in that state is flagged as a warning. With noSTATE/MY_STATEthe county can't be checked, and you get a warning saying so. County lists cover the US (from the Census Bureau's county list), Alaska and New Zealand; other countries aren't checked. Applies in every validation mode. In the grid, these two columns are dropdowns of the row's state's counties.FREQchecked against that row'sBAND's known frequency range.SUBMODEchecked against that row'sMODE.DXCC/MY_DXCCchecked against the list of known DXCC entity codes.- warning
CALL/OPERATOR/STATION_CALLSIGNmust look like a callsign — at least 2 letters and 1 number somewhere in the value (a deliberately loose check; no regex correctly matches every real-world callsign format). - error
CALLandQSO_DATEare required on every row. - warning Possible duplicate contact — a row sharing the same CALL/BAND/MODE/QSO_DATE as another row.
POTA validation
Follows POTA's own logging guide.
| Field | Level | Notes |
|---|---|---|
CALL, QSO_DATE, TIME_ON, MODE, BAND | error | Required on every row. |
STATION_CALLSIGN or OPERATOR | error | At least one of these two is required. |
MY_SIG_INFO | warning or error | Your activator park reference. Missing (warning), malformed (warning), containing a comma-separated list of multiple parks (error), not found in the real POTA park list (warning), or found but marked inactive (error) all get flagged — see below. |
SIG_INFO | warning | Only relevant for a park-to-park contact; same checks as MY_SIG_INFO when present, but every case here (including a comma-separated list and an inactive park) is a warning, not an error. |
MY_SIG_INFO / STATION_CALLSIGN | error | Must match the value used on every other row of the log — a POTA log is one continuous activation by one station at one park, so a row with a different value is flagged (both directions: the majority value's rows are fine, the odd one out is the error). Only checked once a field has at least two different non-blank values in the log; doesn't apply if it's blank throughout or already uniform. |
| Duplicates | warning | Same CALL/BAND/MODE/QSO_DATE and SIG_INFO as another row. Rows with different SIG_INFO (park-to-park with different parks) aren't duplicates. |
OPERATOR | error | Same "must match" rule as MY_SIG_INFO/STATION_CALLSIGN above, but only checked when STATION_CALLSIGN isn't used anywhere in the log — some logging software records the operator there instead. If any row has a STATION_CALLSIGN, OPERATOR isn't checked for consistency at all. |
CALL vs. STATION_CALLSIGN/OPERATOR | error | "You can not log yourself" — flagged when CALL's base callsign matches STATION_CALLSIGN's or OPERATOR's base callsign (portable/QRP suffixes like /P ignored, so W4XYZ/P working W4XYZ still counts). |
Park reference format: only letters, digits, and a single dash — e.g.
US-3751. Anything that doesn't match that shape gets a generic
"doesn't look like a POTA reference" warning. A reference that does match
the shape is then checked against the real, current POTA park list (the same data
source shown as "POTA Parks Last Update" in Help → About) — one not found in that
list is a warning, one found but marked inactive is an error.
MY_POTA_REF/POTA_REF —
the modern ADIF-spec fields for the same park reference — because the POTA log
uploader doesn't accept them yet. Use MY_SIG_INFO/SIG_INFO instead.
SOTA validation
| Field | Level | Notes |
|---|---|---|
CALL, BAND, MODE, QSO_DATE, TIME_ON | error | Required on every row. |
STATION_CALLSIGN or OPERATOR | error | At least one of these two is required. |
MY_SOTA_REF | error | Your activator summit reference (e.g. W4C/EM-004), required on every row. |
SOTA_REF | warning | Only relevant for a summit-to-summit contact; format-checked when present, never required. |
CALL vs. STATION_CALLSIGN/OPERATOR | error | "You can not log yourself" — flagged when CALL's base callsign matches STATION_CALLSIGN's or OPERATOR's base callsign (portable/QRP suffixes like /P ignored, so W4XYZ/P working W4XYZ still counts). |
Show/Hide Columns & export presets
The POTA/SOTA quick-filter buttons in Show/Hide Columns, and the Export POTA/SOTA Log menu items, both use these same field lists:
| Preset | Fields |
|---|---|
| POTA | CALL, QSO_DATE, TIME_ON, MODE, BAND, MY_SIG_INFO, SIG_INFO, STATE, MY_STATE, SIG, OPERATOR, STATION_CALLSIGN |
| SOTA | CALL, QSO_DATE, TIME_ON, MODE, BAND, STATION_CALLSIGN, OPERATOR, MY_SOTA_REF, SOTA_REF, STATE, MY_STATE |
Keyboard shortcuts
| Shortcut | Action |
|---|---|
Ctrl/Cmd+O | Open a file |
Ctrl/Cmd+S | Save |
Ctrl/Cmd+Shift+S | Save As |
Ctrl/Cmd+Z | Undo |
Ctrl/Cmd+Y or Ctrl/Cmd+Shift+Z | Redo |
Ctrl/Cmd+F | Find & Replace |
Tab / Enter | Commit a cell edit and move to the next cell |
Escape | Cancel a cell edit, or close the open dialog |
Shift-click or Alt-click (checkbox or row number) | Select a range of rows |
Status bar
The strip along the bottom of the editor, left to right:
| Item | Meaning |
|---|---|
| File name | The current file's name; a trailing * means there are unsaved changes. |
| Row count | Total rows in the log right now. |
| Selected count | How many rows are currently checked, if any. |
| Validation State | "Validation State: N issues" (total issues found under the current validation mode — Generic by default, or POTA/SOTA once opted into, see below; click it to open the matching results dialog), or a green "Validation State: OK" once the log is clean. Blank until a log is open. |
| Validation mode | "Validation Mode: Generic/POTA/SOTA" — which validator is currently live/automatic. Set automatically when you open a file whose MY_SIG is POTA or SOTA (a notice tells you), otherwise by a prompt shown when you open it, or Validation reference's Generic/POTA/SOTA options; click it to open a dialog and switch modes directly from the status bar. |
| Donate button | Opens WD4DAN's Buy Me a Coffee page in a new tab — same link as Help → Donate!. |
| App version badge | This app's own version number (also shown in Help → About). |
| ADIF spec badge | The ADIF specification version this app was built against (also shown in Help → About). |