📻 URDS Log Validator – Documentation
📻

URDS Log Validator

User Documentation
File: urds-log-validator.html + urds-log-validator.js + urds-log-validator.css
Version: 1.2
Author: Highpoint
Date: 2026-03-26
v1.2

Table of Contents

1What is URDS Log Validator?3
2Interface Overview3
2.1Header Bar and Manual Link3
2.2Upload Bar Buttons4
3Quick Start – Uploading a Log File4
3.1Upload via File Button4
3.2Upload via Clipboard5
3.3No Import Duplicates Option5
4The Station Database (fmdx.org)5
5Validation Progress and Cancellation6
6The Results Table – Column Reference7
7Validation Score – How it Works8
7.1Score Components8
7.2Match Levels9
7.3Row Colours and Score Circles9
8Summary Bar and Statistics Rings10
9Filters and Search11
9.1Score / Colour Filter and Pills11
9.2Distance Filter11
9.3PI Code Exclusion12
9.4Free-text Search12
9.5Hide Duplicates / Hide Unidentified12
10Sorting the Table13
11Detail Row – Validation Breakdown13
12Fix Functions14
12.1Manual Fix (✏ Fix Button)14
12.2Auto Fix per Row (⚡ Auto Button)16
12.3Auto-Fix All (⚡ Auto-Fix All Button)16
13Deleting Entries17
14Map View (🌐 Globe Icon)17
14.1Opening the Map17
14.2Map Markers and Layers18
14.3Applying a Fix from the Map18
15Download and Clipboard Export19
15.1⬇ Download Filtered CSV19
15.2📋 Copy to Clipboard20
15.3Fixed Column Count Guarantee20
16Webtools Panel20
17Supported CSV Format (URDS)21
18Typical Workflow22

1 · What is URDS Log Validator?

The URDS Log Validator is a browser-based tool for FM DXers. It reads CSV log files that were recorded by TEF6686 / TEF6687-based receivers (URDS format), validates each entry against the live fmdx.org transmitter database, and assigns a confidence score to every reception.

The tool helps you to:

AF raw codes: Alternate frequency values in field 31 are supported in two formats: The tool detects both formats automatically. Values outside the FM band (65–108 MHz) are silently ignored.

2 · Interface Overview

2.1 · Header Bar and Manual Link

The header bar runs across the full width of the page and consists of three zones:

ZoneContents
LeftApplication title URDS Log Validator
CentreToast notification area, loading progress bar with percentage label, and the cancel validation button (✕)
Right📖 Manual link – opens this documentation in a new tab. The button is positioned at the far right of the header bar.
The Manual button is always visible, regardless of whether a log file has been loaded. It links to
https://highpoint.fmdx.org/manuals/urds-log-validator-Documentation.html.

2.2 · Upload Bar Buttons

Directly below the header bar is the upload / action bar. Its buttons change visibility depending on the application state:

ButtonAlways visible?Purpose
Upload FileYesOpens the OS file picker to select a .csv file
Process from ClipboardYesReads URDS log text directly from the clipboard
Show Filters / Hide FiltersYesToggles the filter bar visibility
No import duplicates (checkbox)YesDiscards duplicate Freq+PI+PS combinations on import
⚡ Auto-Fix AllAfter validationRuns the automatic fix algorithm on all incomplete rows
⬇ Download filtered CSVAfter validationExports currently visible rows as an enriched CSV file
📋 Copy to ClipboardAfter validationCopies currently visible rows as CSV text to the clipboard

3 · Quick Start – Uploading a Log File

3.1 · Upload via File Button

Click the Upload File button in the upload bar. A file picker opens. Select your .csv log file. The tool accepts only .csv files. If you select a file with a different extension a warning toast appears and the upload is blocked.

Tip: The original file name is remembered and will be used as the base name for the downloaded output file (validated_originalname.csv or bandscan_originalname.csv).

3.2 · Upload via Clipboard

If your log is already in the clipboard (copied from a text editor or directly from the receiver software), click Process from Clipboard. The tool reads the clipboard text and processes it exactly like a file upload. An empty clipboard triggers an orange warning toast.

Browser permission: The browser may ask for clipboard read access the first time. Click Allow. If the browser blocks the request (e.g. in a sandboxed iframe), use the file upload instead.

3.3 · No Import Duplicates Option

The checkbox No import duplicates (next to the upload buttons) controls what happens when the CSV contains multiple rows with identical Frequency + PI + PS combinations:

StateBehaviour
☐ Unchecked (default)All rows are imported, including duplicates. Useful for time-series analysis or finding the best-quality reception of each station.
☑ CheckedOnly the first occurrence of each Freq + PI + PS combination is imported. Speeds up processing of long overnight logs significantly.
This option is evaluated at import time. Changing the checkbox after the file is loaded has no effect until the file is re-imported.

4 · The Station Database (fmdx.org)

Immediately after the CSV is loaded, the tool determines the receiver location from the GPS coordinates stored in the first valid log row. It then downloads the complete FM transmitter database for that location from:

https://cors-proxy.de:13128/https://maps.fmdx.org/api/?qth={lat},{lon}

The download is cached in the browser's localStorage for the current calendar day. On the next load the cached data is used – no second network request is made unless you clear your browser storage or use a different location.

First upload of the day: CSV loaded → receiver QTH extracted (lat/lon from first valid row) │ ├─▶ localStorage: no cache for today? │ → fetch maps.fmdx.org via CORS proxy (~1–3 MB JSON) │ → build in-memory lookup table (keyed by frequency) │ → save to localStorage with today's date key │ → run validation on all rows │ └─▶ Toast: "Station database downloaded successfully." Second upload (same day, same location ±0.1°): CSV loaded → receiver QTH extracted │ └─▶ localStorage: cache found for today! → build lookup from cache instantly (no network request) → run validation on all rows → Toast: "Station database loaded from cache."
Cache key: The cache is keyed by rounded latitude (±0.1°) + rounded longitude (±0.1°) + calendar date, e.g. urds_qth_51.3_12.4_2026-3-22. Old entries from previous days are automatically removed when a new entry is written for the same location.
Database load failure: If the network request fails, a red toast "Failed to load station database. Validation unavailable." is shown. The table is still rendered with the raw log data, and the Auto-Fix All, Download, and Copy to Clipboard buttons become available so you can still export or inspect the unvalidated data.
No location in log: If all rows have lat=0 / lon=0 or invalid coordinates, the database download is skipped. Validation still runs but every row will score 0 (no DB data). Add GPS coordinates to your receiver setup to unlock full validation.

5 · Validation Progress and Cancellation

After the station database is loaded, all rows are validated asynchronously. This keeps the browser responsive even for very large log files (thousands of rows). The progress is shown in the header bar centre zone:

Header bar (centre): ┌─────────────────────────────────────────────┐ │ [Validating… 412 / 2267] [=======> 18%] [✕] │ └─────────────────────────────────────────────┘ Toast message Progress bar Cancel btn
ElementDescription
Toast messageShows the current status text, e.g. "Validating… 412 / 2267" or "Station database loaded from cache."
Progress barHTML <progress> element showing percentage completion. Disappears automatically 800 ms after reaching 100%.
✕ Cancel buttonA small red circular button that appears only during validation. Clicking it stops the validation loop immediately. Rows that have already been validated remain usable; unvalidated rows show a "?" score circle.

The table updates live every 500 ms during validation – you can already sort, filter, and interact with already-validated rows before the full validation completes.

After validation finishes, the three action buttons ⚡ Auto-Fix All, ⬇ Download filtered CSV, and 📋 Copy to Clipboard become visible in the upload bar.

6 · The Results Table – Column Reference

ColumnSourceDescription
#Row indexSequential number (1-based). Click the ▶ button to expand the detail row. The number reflects the original import order regardless of sorting.
DateCSV field 12 (timestamp)UTC date of the reception (YYYY-MM-DD).
TimeCSV field 12 (timestamp)UTC time of the reception (HH:MM:SS), milliseconds stripped.
MHzCSV field 3 (frequency in Hz)Tuned frequency in MHz, displayed with 2 decimal places (e.g. 97.30).
PICSV field 13Programme Identification code (hex, e.g. F201). Red + DB suggestion shown when the received PI does not match the database entry. Underlined when corrected by Fix.
PSCSV field 15Programme Service Name (8 characters). Spaces shown as underscores (_). Red + DB variants shown when the received PS does not match. Underlined when corrected. Original casing is preserved throughout.
Stationfmdx.org / pre-filled / FixHuman-readable station name from the database (e.g. "France Inter").
IDCSV field 30 / FixFMLIST station ID. Shows "No ID" in red italic when empty or zero. A 🌐 map icon appears when a database match exists (opens the embedded Leaflet map overlay for this row). A ⚠ warning icon appears when multiple DB entries on the same frequency share the same PI and PS.
TX / Cityfmdx.org / pre-filled / FixTransmitter city and ITU country code, e.g. "Strasbourg (F)".
ERPfmdx.org / pre-filled / FixEffective Radiated Power in kW.
Polfmdx.org / pre-filled / FixAntenna polarisation: H (horizontal), V (vertical), or M (mixed).
kmCalculatedGreat-circle distance from receiver to transmitter in km (whole number). Calculated from DB coordinates or pre-filled TX coordinates.
Az°CalculatedAzimuth from receiver to transmitter in degrees (whole number, 0–360).
dBµVCSV field 5Signal level in dBµV (one decimal place).
ITU / Flagfmdx.org / pre-filled / FixCountry flag image (from flagcdn.com) and ITU country code. Falls back to a custom image for ITU codes without an ISO country code.
AF-CheckCalculatedAlternate Frequency validation result: how many of the broadcast AF frequencies could be confirmed in the database with the same PI. Shown as 2/4 (50%) with colour coding (green / orange / red).
ScoreCalculatedConfidence score 0–100. See Section 7 for the calculation. Fixed rows always show 100 in blue.
ActionsThree buttons: ✏ Fix (manual fix dialog), ⚡ Auto (automatic single-row fix), 🗑 Del (delete this or all matching rows).
Pre-filled metadata: When the CSV already contains enriched data in fields 36–44 (written by previous runs of this tool or by URDS ID Inserter), those values are loaded directly into the row without a fresh API lookup. TX coordinates (fields 43–44) are sanitised: values of 0 or 0.0 (Gulf of Guinea artefact) are silently discarded.

7 · Validation Score – How it Works

Each log row is validated against the fmdx.org database. The result is a score between 0 and 100 that reflects how confidently the received station has been identified.

7.1 · Score Components

ComponentPointsCondition
PI match40Received PI code found in the database on this exact frequency
PS match30Received PS name matches one of the known PS variants in the database (case-insensitive comparison, original casing preserved for display)
AF validationup to 20Percentage of alternate frequencies that could be confirmed × 0.20
(e.g. 3/4 AF confirmed = 75% × 0.20 = 15 points)
No AF dataup to 10Bonus +5 for PI match and +5 for PS match when no AF list is present in the log row (substitutes the missing AF component)
Uniqueness10Only one DB entry matches on this frequency → single confident identification with no ambiguity
Maximum score: PI(40) + PS(30) + AF(20) + Unique(10) = 100 points.
A score of 100 means: PI confirmed, PS confirmed, all AF frequencies verified, and no ambiguity.
Station ID shortcut (Strategy 0): If the CSV already contains a valid FMLIST station ID (field 30), the validator first tries to match directly by that ID. If the ID resolves to a database entry on the correct frequency (within ±0.15 MHz), that entry is used immediately – skipping the PI/PS lookup entirely. The explanation in the detail row will read "Matched via Station ID …".
Best-match selection: When multiple database entries match at the same level (e.g. multiple stations sharing a PI on the same frequency), the tool picks the best candidate using a tx_search-style scoring formula that weighs ERP (higher = better) against distance (shorter = better). This mirrors the algorithm used in the TEF receiver firmware.

7.2 · Match Levels

LevelMeaningTypical score range
Level 1Freq + PI + PS all match75–100
Level 2Freq + PI match, PS not in DB variants40–75
Level 3Freq + PS match only, PI mismatch30–55
No matchNeither PI nor PS found on this frequency0

7.3 · Row Colours and Score Circles

Each row in the table is colour-coded. Fixed rows always appear in blue regardless of score:

ColourScore rangeMeaning
Green ≥ 75 Good match – PI, PS and usually AF confirmed. High confidence identification.
Yellow 40 – 74 Uncertain – PI confirmed but PS or AF partially unmatched. Manual review recommended.
Red 0 – 39 Poor / mismatch – significant discrepancy between received data and database.
White/grey Unidentified – no matching entry found in the database for this frequency / PI / PS combination.
Blue 100 (fixed) Manually or automatically fixed entry. All fields have been set from the database.

The score circle in the Score column mirrors the row colour:

85  ≥75% (green)    55  40–74% (orange)    12  <40% (red)    100  Fixed (blue)

8 · Summary Bar and Statistics Rings

The summary bar appears directly below the upload buttons as soon as a log is loaded. It shows at a glance how many entries are in the log and how they are distributed across score categories.

┌─────────────────────────────────────────────────────────────────┐ │ Total: 2267 Identified: 1843 Showing: 412 │ │ │ │ ⊙312 ≥75% ⊙87 40–74% ⊙24 <40% ⊙18 Fixed │ │ │ │ ╔══╗ Avg │ │ ║82║ 82% Legend: ... │ │ ╚══╝ │ └─────────────────────────────────────────────────────────────────┘
ElementDescription
TotalTotal number of rows imported from the CSV (after "No import duplicates" filtering if active).
IdentifiedRows that have at least one matching database entry (bestMatch found) or non-empty pre-filled station data.
ShowingNumber of rows currently visible after all active filters are applied.
Ring ≥75%Mini ring gauge (36×36 px canvas): number of non-fixed rows with score ≥ 75. The ring fill proportion represents the share of all rows. The number is drawn centred inside the ring.
Ring 40–74%Mini ring gauge for medium-confidence rows (orange).
Ring <40%Mini ring gauge for low-confidence and unmatched rows (red).
Ring FixedMini ring gauge for rows that have been fixed manually or automatically (blue).
Avg gaugeLarger ring (44×44 px) showing the average score across all validated rows. Fixed rows count as 100. The label text colour follows the same green/orange/red thresholds.
LegendQuick colour reference strip for row background colours (Good match / Uncertain / Poor / Unidentified / Fixed).

9 · Filters and Search

Click the Show Filters button (toggles to Hide Filters) to reveal the filter bar. The filter bar is organised in two rows. All filters are applied simultaneously and update the table in real time.

9.1 · Score / Colour Filter and Pills

The dropdown Score / colour limits the table to rows in a specific confidence category:

OptionShows rows where…
All entriesNo score filter – all rows visible
100% (perfect)Score = 100 exactly
≥ 75% 🟢Score ≥ 75 (green rows)
40–74% 🟡Score 40–74 (yellow rows)
< 40% 🔴Score below 40 (red rows)
Unidentified only ⬜No database match found at all
Manually fixed 🔵Fixed = true (blue rows)

The five coloured filter pills (🟢 ≥75%, 🟡 40–74%, 🔴 <40%, 🔵 Fixed, ⬜ Unidentified) act as toggle buttons for the same filter. Clicking an active pill deactivates the filter (returns to "All entries"). The pills are located in filter row 1, directly after the Reset Filters button.

9.2 · Distance Filter

The distance filter (filter row 2) shows only rows where the calculated distance from the receiver to the transmitter is at least the selected value:

CheckboxMinimum distanceTypical use
≥ 150 km150 kmSuppress immediate local stations
≥ 300 km300 kmDomestic skip-zone DX
≥ 700 km700 kmTropospheric duct DX
≥ 1300 km1300 kmSporadic-E DX
Custom + inputAny value in kmFine-grained distance threshold

Only one distance preset can be active at a time. Selecting a different preset automatically deselects the previous one. The custom numeric input field activates when the Custom checkbox is ticked.

Distance source: The distance is taken from the database best-match entry's coordinates (computed via the Haversine formula). If no database match exists but the CSV already contains pre-filled TX coordinates (fields 43–44), those are used as a fallback.

9.3 · PI Code Exclusion

The Exclude PI codes input field (filter row 2) accepts a comma-separated list of PI codes to hide from the table, e.g. F201,F731. This is useful to temporarily suppress known local stations. The filter is case-insensitive and the leading 0x prefix is stripped automatically.

9.4 · Free-text Search

The search box (🔍 Search table…) in filter row 2 filters the table by any text. The following fields are searched simultaneously: Date, Time, Frequency, PI, PS, Station, City, ITU, Station ID.

9.5 · Hide Duplicates / Hide Unidentified

CheckboxLocationEffect
Hide unidentifiedFilter row 1Removes rows with no database match from the visible table (does not delete them from memory).
Hide duplicatesFilter row 1Within the currently sorted order, shows only the first occurrence of each unique Freq + PI + PS combination. All subsequent duplicates are hidden. This is a display filter only – all rows remain in memory and are exported when the filter is cleared.

The Reset Filters button (filter row 1) clears all filters, checkboxes, text inputs, and distance presets in one click.

10 · Sorting the Table

Click any column header to sort the table by that column. A second click on the same header reverses the sort direction. The current sort column is indicated by a ▲ (ascending) or ▼ (descending) arrow next to the header text.

ColumnSort typeNotes
#, MHz, ERP, km, Az°, dBµV, ScoreNumericAscending by default (smallest first)
Date, Time, PI, PS, Station, TX/City, ITU, PolAlphabeticalA→Z ascending by default
IDAlphabeticalEmpty IDs sort first
AF-CheckNumericSorted by AF score percentage (0–100)
Default sort: On initial load the table is sorted by # (import order) ascending. This preserves the chronological order of the original log file.

11 · Detail Row – Validation Breakdown

Click the button at the start of any row to expand its detail view. The button changes to ▼ when open. Click again to collapse.

The detail row shows a full breakdown of how the validation score was computed:

┌─────────────────────────────────────────────────────────────────┐ │ [PI ✓] F201 found in DB on this freq │ │ [PS ✓] __INTER_ = full match │ DB variants: __INTER_ │ │ [Unique ✓] Single match – confident │ │ [Level] Freq+PI+PS (best) │ │ [AF ✓] ✓ 93.1 MHz ✓ 93.2 MHz ✓ 95.7 MHz ✗ 96.6 MHz │ │ Matched on Freq + PI + PS | Single match – confident │ │ AF: 3/4 (75%) │ ├─────────────────────────────────────────────────────────────────┤ │ ▼ All DB entries on 97.30 MHz (3) │ │ ┌────────┬──────────┬─────────────┬────────────┬─────┬──────┐ │ │ │ PI │ PS │ Station │ City │ ITU │ ERP │ │ │ ├────────┼──────────┼─────────────┼────────────┼─────┼──────┤ │ │ │ F201 │ __INTER_ │ France Inter│ Strasbourg │ F │ 50kW │ │ │ │ ... │ ... │ ... │ ... │ ... │ ... │ │ │ └────────┴──────────┴─────────────┴────────────┴─────┴──────┘ │ └─────────────────────────────────────────────────────────────────┘
BadgeColourMeaning
PIGreen / RedWhether the received PI was found in the database on this frequency
PSGreen / OrangeWhether the received PS matches any known DB variant (case-insensitive)
UniqueGreenExactly one database entry matched → high-confidence identification
MultiOrangeMultiple candidates matched → ambiguous identification, review recommended
LevelGrey (info)Match level: Freq+PI+PS (best) / Freq+PI only / Freq+PS only
AFGreen / Orange / RedAF validation results: ✓ = confirmed in DB with same PI, ✗ = not found. "No AF data in log entry" shown when the AF field is empty.

At the bottom of the detail row, a collapsible "All DB entries on X MHz" table shows every station the database knows for this frequency – useful for manual cross-checking in ambiguous cases. This section only appears when there are two or more DB entries on the frequency.

12 · Fix Functions

When the validation reveals that metadata is missing or incorrect, the fix functions let you update the row with correct data directly from the database.

12.1 · Manual Fix (✏ Fix Button)

The ✏ Fix button opens the Fix overlay for that row. The overlay has three sections:

1 – Transmitter selector

A checkbox "Show only transmitters with matching PI + PS" pre-filters the candidate list to entries that match both PI and PS. Uncheck it to see all transmitters on this frequency. The transmitter list is sorted by ascending distance from the receiver (nearest first). Each entry shows station name, city, PI, PS, ERP, ITU code, and calculated distance in km.

2 – PS variant selector

After selecting a transmitter, the second dropdown shows all known PS name variants for that transmitter. The default option "Keep logged PS: …" preserves the received PS with its original casing as-is. Select a DB variant to replace it in the exported CSV. Original casing from the database is preserved throughout.

3 – Diff table

A comparison table shows the current values (left column) and the new values from the selected candidate (right column). Changed values are shown underlined and bold in blue. Hover over an underlined value to see the old value in a tooltip ("Was: …").

┌──────────────────────────────────────────────────────────────┐ │ Fix row 2 – 97.30 MHz | PI: F201 | PS: __INTER_ │ │ │ │ ☑ Show only transmitters with matching PI + PS │ │ Select transmitter: │ │ [France Inter – Strasbourg (PI:F201 PS:__INTER_ | 50kW | F │ │ | 18 km) ▼] │ │ │ │ PS variant for output (display form): │ │ [Keep logged PS: __INTER_ ▼] │ │ │ │ Field Current New value │ │ ────────────────────────────────────────────────────────── │ │ PI F201 F201 │ │ PS __INTER_ __INTER_ │ │ Station (empty) France Inter │ │ City (empty) Strasbourg │ │ ITU (empty) F │ │ ERP (kW) (empty) 50 │ │ Pol (empty) H │ │ Dist (km) (empty) 18 │ │ Az (°) (empty) 288 │ │ TX Lat (empty) 48.64 │ │ TX Lon (empty) 7.49 │ │ Station ID (empty) 2502895 │ │ │ │ [Apply to this entry only] [Apply to all matching] [Cancel]│ └──────────────────────────────────────────────────────────────┘

Apply buttons

ButtonEffect
Apply to this entry onlyUpdates only the current row. The row is marked as fixed (blue background, score forced to 100).
Apply to all matching entriesUpdates every row in the entire log that has the same frequency and PI code with the selected candidate. This is the fastest way to fix a station that was logged many times during a session.
CancelCloses the overlay without making any changes.
Snapshot for change tracking: The first time a fix is applied to a row, a snapshot of its original values (PI, PS, Station, City, ITU, ERP, Pol, Dist, Az, TX coordinates, Station ID) is saved. Subsequent fixes to the same row always compare against the original snapshot, so the "Was: …" tooltip always shows the value that was present at import time.

12.2 · Auto Fix per Row (⚡ Auto Button)

The ⚡ Auto button applies an automatic best-candidate fix to a single row without opening the overlay. The algorithm picks the best candidate using this priority ladder:

  1. Station ID lookup: If the row already has a valid FMLIST station ID, look up that ID directly in the database. If the frequency matches (within ±0.15 MHz), use it immediately.
  2. Copy from existing row: Search all other rows in the log for a row with the same Freq + PI + PS that already has a valid station ID and a confirmed bestMatch. If found, copy that match directly (avoids redundant DB lookups for frequently-logged stations).
  3. Level 1 DB match: Find all DB entries on this frequency matching both PI and PS. If multiple, pick the one with the highest tx_search score (ERP weighted by distance).
  4. Level 2 DB match: PI-only match (no PS requirement), ranked by tx_search score.
  5. Level 3 DB match: PS-only match (one candidate only).

If no candidate can be found at all, a red toast notification "Row N: no DB candidate found." is shown and no changes are made.

If a row is already fully fixed (fixed = true AND has a valid station ID), the Auto button skips it with the toast "Row N is already complete."

12.3 · Auto-Fix All (⚡ Auto-Fix All Button)

The ⚡ Auto-Fix All button (in the upload bar, visible after loading) runs the automatic fix algorithm on every row that is not yet complete. An animated progress overlay shows the current progress:

┌───────────────────────────────────────────┐ │ ⚡ Auto-Fix All running… │ │ │ │ Processing 412 / 2267 (fixed: 298) │ │ [=============================> 62%] │ └───────────────────────────────────────────┘
Which rows are processed by Auto-Fix All? A row is included if it either has a score below 100 or is missing a station ID – even if it was previously auto-fixed. Rows where fixed = true AND a valid station ID is already present are skipped.
Visual change indicators: After any fix (manual or automatic), cells that were changed show their new value underlined. Hovering the underlined text reveals a tooltip "Was: …" with the original value. This applies to PS, PI, Station, City, ITU, ERP, Pol, km, Az°, TX coordinates, and Station ID.

13 · Deleting Entries

The 🗑 Del button opens the Delete confirmation overlay. It always shows a preview table of the row(s) that would be affected. The overlay can also be dismissed by clicking outside the modal box.

┌─────────────────────────────────────────────────────────────┐ │ 🗑 Delete Entry │ │ │ │ Row 7 — 102.90 MHz | PI: F744 | PS: JUDAICA_ │ │ │ │ # Time MHz PI PS Station │ │ 7 07:21:10 102.90 F744 JUDAICA_ Judaïca 102.9 FM │ │ │ │ This action cannot be undone. │ │ │ │ [Delete this entry only] [Cancel] │ └─────────────────────────────────────────────────────────────┘
ButtonEffect
Delete this entry onlyRemoves only the single row that was clicked.
Delete all matching (N entries)Removes all rows sharing the same Freq + PI + PS combination. The count N is shown in the button label. This button is hidden when only one row matches.
CancelCloses the overlay without deleting anything. Clicking outside the modal also cancels.
Deletion is permanent within the current session. There is no undo function. Deleted rows are gone until you reload the CSV file. Always export your validated log before performing bulk deletions.

14 · Map View (🌐 Globe Icon)

The 🌐 globe icon appears in the ID column for any row that has a database match (a best-match entry with known coordinates). Clicking it opens a full-screen embedded map overlay powered by Leaflet.js and OpenStreetMap tiles. Leaflet is loaded lazily – no map libraries are downloaded until the globe icon is first clicked.

14.1 · Opening the Map

Click the 🌐 globe icon in the ID column of any row. The map overlay appears, covering the full viewport. It can be closed at any time with the ✕ Close Map button (top-right of the overlay) or by clicking anywhere outside the map box.

The map instance is created once and reused. When you open the map for a different row, the previous markers and lines are cleared and the new row's data is plotted – the OpenStreetMap tiles are not reloaded.

14.2 · Map Markers and Layers

The map always shows the following layers simultaneously:

MarkerColourDescription
Your QTH Blue circle Receiver location extracted from the GPS coordinates in the log row. Tooltip shows lat/lon, reception time, and signal level.
Best-match TX Green circle The transmitter site selected by the validation algorithm as the most likely identification. A dashed polyline connects it to the QTH. Tooltip shows station name, city, PI, PS, ERP, polarisation, distance, azimuth, and station ID.
Alternative TX sites Red circles Other transmitters on the same frequency that also match the received PI and PS – i.e. genuinely ambiguous candidates. Each has its own dashed polyline and tooltip. Clicking a red marker opens the Fix dialog for that alternative transmitter (see Section 14.3).
Other TX sites Grey circles All other transmitters from the current log session (best-match sites of all other rows) that have not already been drawn in green or red. These provide propagation context at a glance. No polyline is drawn; tooltips show station name and distance.

Hovering over any marker highlights its connecting line (if present) and opens the tooltip. Moving the mouse away restores the default line style.

┌──────────────────────────────────────────────────────────┐ │ [✕ Close Map] │ │ ┌────────────────────────────────────────────────────┐ │ │ │ ● QTH (blue) │ │ │ │ \ │ │ │ │ \- - - - - ● Best-match TX (green) │ │ │ │ │ │ │ │ ● Alternative TX (red, clickable) │ │ │ │ │ │ │ │ · · · Other session TX sites (grey) │ │ │ └────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────┘

The map viewport is automatically fitted to encompass all plotted markers with 40 px padding. If only the QTH is available (no TX coordinates found), the map centres on the QTH at zoom level 7.

14.3 · Applying a Fix from the Map

Clicking a red alternative TX marker opens the Fix from map dialog on top of the map overlay. The dialog shows a summary table of the values that would be written to the row if the alternative transmitter is applied:

ButtonEffect
Apply to this entry onlyFixes the current row with the clicked alternative transmitter and re-opens the map to reflect the updated data.
Apply to all matching entriesFixes every row in the log that shares the same frequency and PI code, then re-opens the updated map.
CancelCloses the Fix dialog and returns to the map without making any changes.
After a fix is applied from the map, the map is automatically refreshed: the previously red alternative marker becomes the new green best-match marker for that row, and the former green marker (if different) moves to the grey "other sites" layer.
Grey "other session TX" markers are not clickable. They are display-only context markers. To fix a row based on a grey marker's transmitter, close the map and use the ✏ Fix button in the table row instead.

15 · Download and Clipboard Export

15.1 · ⬇ Download Filtered CSV

The ⬇ Download filtered CSV button exports all currently visible rows (i.e. all rows that pass the active filters) to a new CSV file in URDS format with enriched metadata fields.

Download respects active filters. If you have filtered by distance ≥ 700 km and the table shows 142 rows, the downloaded file will contain exactly those 142 rows. Use the Reset Filters button before downloading if you want to export the complete log.

The following fields are written into the output CSV (all other original fields are preserved unchanged):

CSV field indexContent written
0Record type "30" (always normalised)
13PI code (uppercase, no 0x prefix)
15PS name (underscores → spaces, 8 characters, original or fixed casing)
30Station ID (from fix or as originally present in the log)
36Station name
37City
38ITU country code
39ERP in kW
40Polarisation
41Distance in km (precise float from Haversine formula)
42Azimuth in degrees (precise float)
43Transmitter latitude
44Transmitter longitude

The output file name is validated_originalfilename.csv.

15.2 · 📋 Copy to Clipboard

The 📋 Copy to Clipboard button copies all currently visible rows as CSV text to the system clipboard. The content is identical to what the Download button would produce. This is useful for pasting directly into other tools (e.g. URDS Map Viewer) without creating an intermediate file.

A success toast "Copied N rows to clipboard." or "Copied to clipboard!" is shown after a successful copy. If the Clipboard API is unavailable, an automatic fallback using document.execCommand("copy") is attempted.

15.3 · Fixed Column Count Guarantee

Both the Download and Copy to Clipboard functions always produce output rows with exactly 45 fields (indices 0–44). This guarantees that the URDS Map Viewer and other downstream tools always find each value in the expected column position – even when the original CSV had fewer columns.

Export pipeline for each row: 1. Copy rawFields array from import 2. Pad to 45 fields: while (f.length < 45) f.push("") 3. Trim to 45 fields: f = f.slice(0, 45) 4. Ensure f[0] === "30" 5. Write back fixed/validated values at exact field indices 6. Apply CSV quoting: fields containing comma, double-quote, or newline are wrapped in double-quotes; internal double-quotes are doubled ("") 7. Join with commas
Why this matters: Earlier versions of this tool produced variable-length rows. When a station name like Judaïca 102,9 FM contained a comma, the unquoted value would split into two fields and shift all subsequent columns, causing the URDS Map Viewer to read NaN for distance and ERP. The fixed-width export with proper CSV quoting eliminates this class of error entirely.

16 · Webtools Panel

The Highpoint's Webtools panel is a navigation hub at the very top of the page linking to related tools in the Highpoint toolchain. Hover over the button to expand the panel; it closes automatically when the mouse leaves.

ToolDescription
TEF ConverterConverts raw TEF6686 / TEF6687 CSV output to standard URDS format
URDS ID InserterBatch-inserts FMLIST station IDs into an existing URDS CSV
URDS UploaderUploads a URDS CSV directly to your FMLIST account
URDS to HTMLConverts a URDS CSV to a formatted HTML reception report with station ID and TX editing capabilities
URDS Map ViewerInteractive map visualisation of URDS CSV files with full statistical analysis
FMLIST DX Log AnalyzerAnalyses FMLIST logbook export files for DX statistics
Sporadic E MonitorReal-time dashboard for monitoring Sporadic-E propagation activity

17 · Supported CSV Format (URDS)

The tool reads URDS (Universal RDS) format CSV files as produced by TEF6686 / TEF6687-based receivers. Each data row must start with a record type indicator. The tool automatically recognises and handles two variants:

Variant A – starts with "30,": 30,{unix_ts},freq,{freq_hz},1,{sig},{sig},…,{lat},{lon},{height},{float_height},{timestamp},{pi},1,{ps},… Variant B – starts with a 10-digit Unix timestamp (no "30," prefix): {unix_ts},freq,{freq_hz},1,{sig},…,{lat},{lon},…,{timestamp},{pi},1,{ps},… → The tool prepends "30," automatically before parsing. Lines not matching either pattern are silently skipped. Lines with fewer than 16 fields after parsing are skipped. Rows with lat=0 / lon=0 or NaN coordinates are skipped. Rows with lat=1 / lon=1 (uncalibrated GPS) are also skipped (in URDSMapViewer).

Key field positions (0-based index, after the record type field "30" at index 0):

IndexContentExample
3Frequency in Hz97300000 → 97.30 MHz
5Signal level in dBµV (float)39.0
8Receiver latitude (decimal degrees)48.585023
9Receiver longitude (decimal degrees)7.733249
11Antenna height (metres, float)190.04
12Timestamp (ISO 8601 UTC)2026-03-22T07:20:36Z
13PI code (with or without 0x prefix)0xF201 or F201
15PS name (optionally quoted, up to 8 chars)" INTER " or ACCENT_4
20PTY name (quoted)"No PTY"
30Station ID (FMLIST)2502895
31AF list (semicolon-separated)97.3;93.1;93.2;95.7 or 9730;9310
36Pre-filled station nameFrance Inter
37Pre-filled cityStrasbourg
38Pre-filled ITU country codeF
39Pre-filled ERP (kW)50.0
40Pre-filled polarisationH
41Pre-filled distance (km)18
42Pre-filled azimuth (°)288
43Pre-filled TX latitude48.64
44Pre-filled TX longitude7.49
AF list format: The tool auto-detects both formats. Values > 1000 are treated as integer frequency × 100 (legacy format). Values ≤ 1000 are treated as decimal MHz. Only values in the range 65–108 MHz pass the FM band sanity check.
Pre-filled metadata loading rule: Fields 36–44 are only loaded if a valid (non-zero, non-empty) station ID is present in field 30. If the ID is absent or zero, pre-filled metadata is not loaded. TX coordinate fields (43–44) are additionally sanitised: values of exactly 0 or 0.0 are discarded to prevent spurious Gulf-of-Guinea coordinates.
File encoding: The file should be saved as UTF-8 (with or without BOM – the BOM is stripped automatically). If your receiver software saves in a different encoding, the tool applies automatic multi-byte correction for common Western and Central European characters (German, French, Polish, Czech, Hungarian, and others).

18 · Typical Workflow

The following diagram shows the recommended step-by-step workflow for processing a URDS log after a DX session:

① Open URDS Log Validator in your browser (https://highpoint.fmdx.org/webtools/urds-log-validator.html) ② (Optional) Tick "No import duplicates" to collapse repeated entries from a long overnight log before import ③ Click Upload File → select your .csv log OR click Process from Clipboard if the log is in the clipboard ④ Wait for the station database download / cache load (progress bar in the header bar centre zone) ⑤ Wait for validation to complete (Validating… n / N shown in header + progress bar) → Click ✕ to stop validation early if needed; already-validated rows remain fully usable ⑥ Review the Summary Bar: • Check the four score rings for distribution overview • Check the average score gauge (green ≥75%, orange ≥40%, red <40%) ⑦ Use filters to focus on interesting entries: • Distance ≥ 700 km → Tropospheric duct / Sporadic-E DX • Distance ≥ 1300 km → Long-distance Sporadic-E only • Score ≥ 75% → Show only well-confirmed receptions • Unidentified → Find unknowns that need manual research • Exclude PI codes → Suppress known local/domestic stations ⑧ For unidentified or low-score entries: • Click ▶ to expand the detail row and read the explanation • Click 🌐 to open the embedded map and visually inspect TX sites – Click a red alternative TX marker on the map to apply that transmitter as the identification directly from the map • Click ✏ Fix → select the correct transmitter → Apply (the diff table shows exactly which fields will change) ⑨ For batch correction of well-identified entries: • Click ⚡ Auto-Fix All and wait for the progress overlay to finish → The tool uses tx_search-style scoring to pick the best candidate ⑩ (Optional) Delete clearly wrong entries (noise, local QRM) using 🗑 Del → "Delete all matching" for bulk removal ⑪ Apply any export filter if needed: • Distance ≥ 300 km for an overview without local stations • "Hide duplicates" for a compact per-station summary ⑫ Click ⬇ Download filtered CSV → The output always has exactly 45 fields per row with proper CSV quoting – ready for URDS Map Viewer or FMLIST upload ⑬ Alternatively, click 📋 Copy to Clipboard and paste directly into URDS Map Viewer ("Process from Clipboard")
Best practice for Sporadic-E sessions: After a long Es session with 2000+ entries, tick No import duplicates on import, then filter to ≥ 700 km and run Auto-Fix All. Review red and yellow entries manually using the ✏ Fix dialog or the 🌐 map view (click red alternative markers to switch identification), and delete obvious noise entries with Delete all matching. Export the result as a clean, enriched log ready for FMLIST upload or map visualisation.

URDS Log Validator · Documentation v1.2 · Author: Highpoint · March 2026
Part of the Highpoint Webtools Suite · highpoint.fmdx.org/webtools/