WD4DAN ADIF Log Tool Help & Documentation
Runs in your browser

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.

Opening a file

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.

Row numbers (# 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.

Checkboxes (row selection)

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.

Editing a cell

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.

SUBMODE is linked to MODE

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.

Cell colors

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.

Column width, resize, and reorder

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 menus

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.

File menu

Opening, saving, exporting, and inspecting the log file itself.

New

Clears the grid and starts a blank, untitled log. Asks first if you have unsaved changes.

Open…Ctrl+O

Opens an .adi/.adif file from your computer. In Chrome/Edge this uses the File System Access API, so Save can write straight back to the same file afterward; in other browsers it falls back to a normal file picker and Save works as a download instead.

Merge Files…

Adds the records from one or more additional files onto the end of the currently open log, without clearing what's already there.

Import Paper Log Image…

A notice first explains the limits of AI reading and recommends the POTA Paper Logsheet as the format that reads best. Then choose up to 5 photos of a handwritten paper log; they are sent to an AI service to be transcribed, then shown in a review table where you can correct any cell or skip rows before adding them to the end of your log (one Undo step). Rows the model found hard to read are highlighted. Always double-check calls, dates and times against the original. There is a daily limit on how many images each visitor can read; the notice shows your current remaining count. Above the table, optional boxes for your own callsign, state, county and grid square let you set one value for the whole batch — editing any of them immediately updates that field on every row below (adding the column if it wasn't already showing), even rows that already had something there. A blank callsign box is outlined in red as a reminder to fill it in. If the log has a POTA park reference, a POTA Reference box appears too, right after callsign; changing it looks up the new park and fills in My State automatically, or turns My State into a dropdown of just that park's states/provinces if it spans more than one. My Grid Square is filled in from the same park lookup too, whenever the park is found (regardless of how many states it spans). Both My State (when auto-filled) and My Grid Square are locked read-only in that case, since the park's own data is the real answer, not a guess to hand-edit. Once My State is known, My County becomes a dropdown of that state's counties: the county written on the sheet (with or without the word "County") is matched to the list and stored in ADIF form (for example VA,Fairfax), and one that can't be matched is kept but outlined in red. Changing My State clears a county that isn't in the new state. With no My State, the county is left as written and can't be checked. A contact logged as park-to-park with more than one of the other station's parks becomes one row per park, each with its own SIG_INFO, since POTA credits a multi-park P2P that way. After you choose photos you're asked whether it's a Generic, POTA or SOTA log: that tells the reader which reference to look for (SOTA uses MY_SOTA_REF / SOTA_REF) and decides whether the box above the table is POTA Reference, SOTA Reference or absent. A SOTA summit reference is looked up the same way as a park — filling in My State and My Grid Square, or offering a dropdown when a summit's association covers more than one state. These photos leave your browser, but only when you choose to import them.

Recent Files

Your last several opened files, by name. In Chrome/Edge, picking one reopens it directly (after a one-time permission prompt); elsewhere it just points you back to Open…, since the browser can't reopen a file by name on its own.

SaveCtrl+S

Writes back to the file you opened (Chrome/Edge), or downloads a new copy otherwise. If the log has any issues under the current validation mode (Generic by default, or POTA/SOTA once opted into), you'll be shown them first and asked to confirm before it actually saves — see Validation reference.

Save As…

Same as Save, but always lets you pick a new file name/location.

Export as CSV…

Saves every column currently in the grid as a .csv file — useful for spreadsheets or other tools that don't read ADIF. Prompts you to choose the save location and file name (in browsers without that picker, it downloads to your default downloads folder instead). Same validation-issue confirmation as Save, above.

Export POTA Log… / Export SOTA Log…

Saves a trimmed .adi containing only the fields that program's own validator checks (see the tables in Validation reference), instead of every field in the full log. Prompts you to choose the save location and file name, same as Export as CSV.

View Raw ADIF…

Shows the file exactly as it was when you opened it — a read-only reference copy. Edits made in this session are not reflected here; that's what View Current ADIF is for. Has a Copy to Clipboard button.

View Current ADIF…

Shows the live, current state of the log as plain ADIF text — only the columns currently visible (see Show/Hide Columns), in whatever order the grid is currently sorted. Useful for a quick look at exactly what would be saved right now. Has a Copy to Clipboard button.

Edit menu

Undo history, search, and row-level operations.

Undo / RedoCtrl+Z / Ctrl+Y

Steps backward or forward through every change you've made — cell edits, row add/delete/move, column changes, everything. Grayed out when there's nothing to undo/redo in that direction.

Find & Replace…Ctrl+F

Find All selects every row containing your search text (in one column or across all of them). Replace All substitutes the text directly, optionally restricted to the selected rows only and/or case-sensitive.

Add Row

Inserts a new blank row (after the current selection, or at the end if nothing's selected) and jumps straight to it with the first cell ready to type into. Carries over QSO_DATE/TIME_ON, BAND/MODE/OPERATOR/ STATION_CALLSIGN, and any park/summit reference field (MY_POTA_REF/POTA_REF/MY_SIG_INFO/ SIG/MY_SIG/MY_SOTA_REF/ SOTA_REF) from the row above, when that column exists and the row above has a value in it. If there's no row above (or it has no QSO_DATE/TIME_ON), those two pre-fill with the current UTC date/time instead.

Duplicate Row

Copies the selected row(s) and inserts the copies right after the originals.

Delete Row(s)

Removes the selected row(s) from the log.

Move Row Up / Move Row Down

Shifts a single selected row one position earlier or later in the log's order.

Add Column…

Pick a known ADIF field from the dropdown (its type is already known, so there's nothing else to configure), or choose Custom field… to name your own field and give it a type — including a custom enumeration (fixed list of allowed values) if you want a dropdown editor for it. The new column is added blank to every row.

Delete Column…

Removes a field from every row. Undo brings it straight back.

View menu

Controlling which columns show and how the grid looks.

Show/Hide Columns…

Check or uncheck individual columns, or use one of the quick preset buttons: POTA Fields Only, SOTA Fields Only (exactly the fields those validators check — see the tables under Validation reference), or Show All. Hidden columns stay hidden through other edits, undo/redo, etc., until you show them again or use Reset Columns.

Reset Columns

Restores every column to visible and puts them back in the standard ADIF field order, undoing any manual reordering or hiding.

Grid font

Switches the grid's font between Sans, Monospace, and Serif. Remembered between visits.

Tools menu

Bulk edits, column tools, and validation.

Bulk edits

Duplicate POTA Log (n-fer)…

For an "n-fer" activation — one outing physically inside several overlapping parks — where POTA wants the same contacts submitted separately for each park. Requires MY_SIG_INFO to already exist on the log (there has to be an "old" park reference to duplicate from) — if it doesn't, this shows an error explaining what to do instead. Otherwise, enter the new park reference and confirm; it sets MY_SIG_INFO to that reference on every row of the log you have open right now (shows you the old → new value, the park's name when it's found, and row count before making the change — a not found or inactive badge appears next to either reference if it looks like a problem, same checks as Validate (POTA), purely informational). This edits the open log in place — it's a normal undoable edit (Ctrl+Z), not a separate exported file — so after saving/exporting for one park, run it again with the next park's reference for the next submission.

Fix Time (HHMM → HHMMSS)

Normalizes any 4-digit TIME_ON/TIME_OFF value (HHMM) to the fuller 6-digit HHMMSS form by appending 00 seconds.

Set TIME_OFF = TIME_ON

Fills in a blank TIME_OFF from that row's TIME_ON, for logs where you only record a single timestamp per contact.

Column tools

Add Column…/Delete Column… moved to the Edit menu.

Fill Column…

Sets one column to a fixed value across rows. By default it only fills blank cells; check Fill/replace all rows to overwrite non-blank values too. Can be limited to selected rows only.

Split Column…

Splits one column's value into two new columns at the first occurrence of a delimiter you choose (a space, by default). Everything before the delimiter goes into the first new field, everything after into the second; if a row's value doesn't contain the delimiter, it all goes into the first field and the second is left blank.

Split Log…

Downloads one separate .adi file per distinct value of a column you choose — for example, splitting a combined log into one file per BAND.

Validation & duplicates

Find Duplicates…

Groups rows that share the same CALL/BAND/MODE/QSO_DATE and lets you delete the extras — in POTA validation mode, SIG_INFO is also part of that match, so a park-to-park contact with a different park isn't grouped as a duplicate. The same grouping also drives the automatic warning described under Validation reference.

Validate… → Generic / POTA / SOTA

Runs one of the three validators over the whole log and lists every issue found, with a Copy to Clipboard button. See Validation reference below for exactly what each one checks.

Statistics…

Total QSOs, unique calls, date range, and a breakdown by band and by mode. Has an Open in QSO Map for more detail… button — the same Open in QSO Map flow below, for QSO Map's richer per-band/mode/grid-square breakdowns.

Other

Open in QSO Map…

Sends the current log to the separate QSO Map tool (great-circle contact map + stats) in a new tab. This is one of the few features that sends data off your machine (see the overview at the top of this page) — it only happens when you click this specific button, and only sends what's currently in the grid (including unsaved edits). Like Save, you'll be shown any validation issues first and asked to confirm.

Help menu

Donate!

Opens WD4DAN's Buy Me a Coffee page in a new tab — the same link as the Donate button in the status bar.

Help & Documentation

This page.

View Changelog

Opens changelog.html in a new tab — same link as the one in Help → About.

About WD4DAN ADIF Editor

Shows the app's version number and which ADIF spec revision it was built against (also shown as the little badge at the bottom right of the status bar), a link to buy WD4DAN a coffee, and a View Changelog link (opens changelog.html in a new tab — what's new, version by version).

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 as HHMM/HHMMSS with valid hour/minute/second ranges, numbers, Y/N booleans, grid squares, lat/lon locations, and known enumerated values (BAND, MODE, etc.).
  • STATE checked against that row's DXCC entity's own list of valid subdivisions (falling back to a looser check across all entities if DXCC isn't set).
  • CNTY/MY_CNTY checked against the counties of that row's STATE/MY_STATE. ADIF writes a county as STATE,County (for example VA,Fairfax); a bare Fairfax, a county from a different state, or a name that isn't a real county in that state is flagged as a warning. With no STATE/MY_STATE the 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.
  • FREQ checked against that row's BAND's known frequency range.
  • SUBMODE checked against that row's MODE.
  • DXCC/MY_DXCC checked against the list of known DXCC entity codes.
  • warning CALL/ OPERATOR/STATION_CALLSIGN must 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 CALL and QSO_DATE are 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.

FieldLevelNotes
CALL, QSO_DATE, TIME_ON, MODE, BANDerrorRequired on every row.
STATION_CALLSIGN or OPERATORerrorAt least one of these two is required.
MY_SIG_INFOwarning or errorYour 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_INFOwarningOnly 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_CALLSIGNerrorMust 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.
DuplicateswarningSame 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.
OPERATORerrorSame "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/OPERATORerror"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.

Not currently checked: 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

FieldLevelNotes
CALL, BAND, MODE, QSO_DATE, TIME_ONerrorRequired on every row.
STATION_CALLSIGN or OPERATORerrorAt least one of these two is required.
MY_SOTA_REFerrorYour activator summit reference (e.g. W4C/EM-004), required on every row.
SOTA_REFwarningOnly relevant for a summit-to-summit contact; format-checked when present, never required.
CALL vs. STATION_CALLSIGN/OPERATORerror"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:

PresetFields
POTACALL, QSO_DATE, TIME_ON, MODE, BAND, MY_SIG_INFO, SIG_INFO, STATE, MY_STATE, SIG, OPERATOR, STATION_CALLSIGN
SOTACALL, QSO_DATE, TIME_ON, MODE, BAND, STATION_CALLSIGN, OPERATOR, MY_SOTA_REF, SOTA_REF, STATE, MY_STATE

Keyboard shortcuts

ShortcutAction
Ctrl/Cmd+OOpen a file
Ctrl/Cmd+SSave
Ctrl/Cmd+Shift+SSave As
Ctrl/Cmd+ZUndo
Ctrl/Cmd+Y or Ctrl/Cmd+Shift+ZRedo
Ctrl/Cmd+FFind & Replace
Tab / EnterCommit a cell edit and move to the next cell
EscapeCancel 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:

ItemMeaning
File nameThe current file's name; a trailing * means there are unsaved changes.
Row countTotal rows in the log right now.
Selected countHow 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 buttonOpens WD4DAN's Buy Me a Coffee page in a new tab — same link as Help → Donate!.
App version badgeThis app's own version number (also shown in Help → About).
ADIF spec badgeThe ADIF specification version this app was built against (also shown in Help → About).