SPOT Tools XLSX File Specification
This document defines the Excel workbook format used by SPOT Tools for import/export of radio configuration data.
Scope
- Format name:
SPOT Workbook v1 - File type:
.xlsx - Primary goal: interchange channel + list + radio settings with spreadsheet tools while preserving telemetry constraints
Workbook Structure
Required sheet
Channels
Optional sheets
ScanListsRadioMeta
Unknown sheets are ignored during import.
Sheet: Channels
(required)
One row per memory channel.
Required columns
active- Boolean-like (
TRUE/FALSE,true/false,1/0,yes/no,on/off)
- Boolean-like (
name- String, trimmed, max 10 characters
rx_mhz- Numeric MHz value, example:
150.125
- Numeric MHz value, example:
step_khz- Numeric step value in kHz; must map to an allowed telemetry step
scanlist_ids- Delimited stable list IDs (
ID001..ID016), example:ID001|ID003|ID005
- Delimited stable list IDs (
Optional columns
notes- Ignored by importer
tag- Ignored by importer
Sample rows
A small example of how the Channels sheet might look in
practice:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | active | name | rx_mhz | step_khz | scanlist_ids | notes |
| 2 | TRUE |
209 Rascal |
150.125 |
5 |
ID001|ID003 |
Primary field channel |
| 3 | TRUE |
1145 Echo |
150.245 |
10 |
ID002 |
Secondary scan set |
| 4 | FALSE |
111 Flick |
151.500 |
25 |
Stored but inactive |
Import behavior
- Channel number is derived from sheet row position
(
row 2 => channel 0,row 3 => channel 1, ...). - Blank rows preserve existing/default channel values at that row index.
- Empty
scanlist_idsmeans no list membership. - Unknown/invalid/duplicate list IDs cause an import error.
- Parsed channels are passed through standard sanitization/normalization.
Export behavior
- Export all 200 channels.
- Channel number is represented by row order.
- Emit canonical
scanlist_idscolumn only.
Sheet: ScanLists
(optional)
Defines list names and default active-list selection.
One row per list definition.
Columns
list_id- Stable ID,
ID001..ID016(identifier, not row order)
- Stable ID,
name- String, trimmed, max 10 characters
active_default- Boolean-like flag
Sample rows
Example rows for a ScanLists sheet:
| A | B | C | |
|---|---|---|---|
| 1 | list_id | name | active_default |
| 2 | ID001 |
Red Cnyn |
TRUE |
| 3 | ID002 |
Whale Pt |
FALSE |
| 4 | ID003 |
Missing |
FALSE |
Import behavior
- Missing sheet: keep current list names and active mask.
- Missing rows: only provided rows override; remaining lists keep current values.
list_idmust be present, valid, and unique.- Blank/invalid
name: fallback to defaultL#. - If all
active_defaultvalues are false/empty, importer should preserve current active mask (or apply the app default). - Row order defines list slot order in the app.
Export behavior
- Always emit 16 rows for IDs
ID001..ID016.
Sheet: Radio (optional)
Radio-wide settings encoded as key/value rows for forward compatibility.
Columns
keyvaluenotes(optional, ignored by importer)
Sample rows
Because Radio is key/value based, a single workbook may
include rows like these:
| A | B | C | |
|---|---|---|---|
| 1 | key | value | notes |
| 2 | rf_gain |
12 |
Mid-range receive gain |
| 3 | tag_mode |
tag |
Show tag names when available |
| 4 | scan_dwell_seconds |
10 |
Pause briefly on activity |
| 5 | backlight_time |
15 |
Example numeric setting |
| 6 | flashlight_enabled |
FALSE |
Boolean-style value |
Supported keys (initial set)
beep_controlbpm_controlscan_resume_modescan_dwell_secondspeak_timerf_gaintag_modebacklight_timeflashlight_enabledarrow_orientationpower_on_display_modewelcome_line1welcome_line2squelch_levelpulse_threshold_dbmfull_scale_dbmbattery_calibrationdefault_step_setting(optional convenience key)
Legacy-compatible (accepted on import, not canonical in export):
scan_target_mode
Value expectations
- Booleans: same boolean-like parsing rules as other sheets
- Enums: must match accepted app values
- Numeric fields: parse as integer where applicable
scan_dwell_seconds: sanitized to nearest of1, 2, 3, 5, 10, 15, 20, 25, 30peak_time: sanitized to nearest of5, 10, 20, 22, 24, 29, 39(encoded values)rf_gain: clamped to integer range0..24tag_mode:channel|tag- Strings: trimmed and validated against setting limits
arrow_orientation:up_down|left_right
Import behavior
- Unknown keys are ignored.
- Invalid values are ignored (current value is preserved).
- Missing sheet keeps existing radio settings unchanged.
Sheet: Meta (optional)
Metadata/provenance only. Optional on read.
Columns
keyvalue
Suggested keys
format=spot-workbookformat_version=1exported_by=SPOT Tools <version>exported_at= ISO timestampradio_model=uv-k5-telemetryschema_version= current JSON schema version
Sample rows
Typical metadata rows might look like this:
| A | B | |
|---|---|---|
| 1 | key | value |
| 2 | format |
spot-workbook |
| 3 | format_version |
1 |
| 4 | exported_by |
SPOT Tools 0.9.0 |
| 5 | exported_at |
2026-06-09T19:42:00Z |
Behavior
Metadata is non-authoritative and does not override parsed configuration values.
Common Parsing Rules
- Boolean-like values accepted:
TRUE/FALSE,true/false,1/0,yes/no,on/off. - Trim surrounding whitespace from text values.
- Prefer true numeric cell types for numeric columns.
- Import should collect warnings per row/cell and continue where possible.
Validation and Sanitization
After parsing workbook data, SPOT Tools should apply the same sanitization pipeline used for JSON/radio reads:
- channel activity/frequency validity checks
- allowed step enforcement
- scan-list mask/list coercion
- telemetry-safe defaults for unsupported values
This keeps workbook import behavior aligned with all other input paths.
Versioning
- Initial workbook format:
SPOT Workbook v1 - Backward compatibility strategy:
Channelssheet remains required.- Unknown keys/sheets ignored.
- New optional keys/sheets may be added in future versions without breaking old files.