Problem
Band classification today covers UK amateur licence allocations only — docs/reference/bands.md and src/lib/bands.ts. bandFromFrequencyMhz() / BandPill / channel-list band filter / /#/reference/band-plan all use UK_BANDS.
Operators routinely programme non-amateur receive channels that never match a pill:
| Service |
Typical use |
Example range (UK-oriented) |
| PMR446 |
Licence-free listen (often RX-only on ham rigs) |
~446.0 – 446.2 MHz |
| Airband |
Aviation AM monitoring |
~118 – 137 MHz |
| Marine VHF |
Coastal / harbour listen |
~156 – 162 MHz (ITU marine band) |
| FM broadcast |
Broadcast FM |
~87.5 – 108 MHz |
| AM broadcast |
LW / MW / SW broadcast |
LW ~148 – 285 kHz; MW ~526 – 1606 kHz; SW multiple HF segments |
Frequencies outside amateur allocations show no band pill or a muted unknown — even when the channel is deliberately programmed (e.g. PMR446, Glasgow Tower). Worse, naive labelling could confuse broadcast LW with amateur 136 kHz (LW) — same colloquial “LW” wording, different services and licence rules.
Intended outcome
Extend band reference and lookup so non-amateur services classify with distinct IDs, labels, and colours, while keeping amateur bands authoritative where allocations overlap in operator mental models.
Documentation (tier-2 reference)
- Extend
docs/reference/bands.md or add a sibling doc (e.g. docs/reference/frequency-services.md) indexed from the reference hub — domain-neutral, not CPS wire tables.
- Document each new service: MHz/kHz range(s), UK relevance, typical RX-only note, authoritative source link where practical.
- Disambiguation table — explicit label rules, e.g.:
| ID (proposed) |
UI label |
Not to be confused with |
136khz |
136 kHz |
Broadcast LW (broadcast-lw) |
broadcast-lw |
LW broadcast |
Amateur 136 kHz |
broadcast-mw |
MW broadcast |
160 m amateur |
broadcast-sw |
SW broadcast |
Amateur HF bands (document coarse SW segments or multiple rows — TBD in PR) |
pmr446 |
PMR446 |
70 cm amateur (430 – 440 MHz — adjacent but non-overlapping) |
airband |
Airband |
2 m / 4 m amateur |
marine |
Marine |
— |
fm-broadcast |
FM broadcast |
— |
- Update
docs/reference/display-conventions.md — band pill rules for amateur and non-amateur categories.
- Disclaimer: programming convenience only; non-amateur TX restrictions; not authoritative for on-air operation.
Implementation (src/lib/bands.ts)
- Add
category (or equivalent) on BandDefinition, e.g. 'amateur' | 'pmr' | 'airband' | 'marine' | 'broadcast'.
- Extend band table with new rows; preserve lookup rule (first match in frequency order) but order rows so non-overlapping ranges are unambiguous; where services are adjacent (amateur 136 kHz vs broadcast LW), tight min/max bounds and distinct labels prevent misclassification.
- Consider exporting
UK_AMATEUR_BANDS + ALL_BANDS (or FREQUENCY_BANDS) so channel-list filter can default to amateur-only while still classifying PMR/airband/etc. on pills.
- New colours: visually distinct from amateur palette; broadcast family may share a hue family (LW/MW/SW) but must not reuse amateur 136 kHz violet.
- Tests: boundary MHz values per row; PMR446 channel centre; airband tower freq; marine ch 16; FM R4; broadcast LW vs 136 kHz amateur; no false match on 2 m repeater for marine band.
UI
BandPill — render new bands (optionally subtle category styling, e.g. outline for non-amateur — TBD in PR).
BandPlanTable / /#/reference/band-plan — group or section: Amateur | PMR & services | Broadcast (or tabs).
- Channel list band filter (
ChannelsListSectionNav) — include new bands when present in codeplug; consider amateur-only default with opt-in “all services”.
- Map / channel detail — pills appear for classified non-amateur RX-only channels.
Proposed frequency rows (starting point — verify in PR)
Ranges are indicative; PR author should cite Ofcom / ITU / ETSI sources and tighten bounds.
| ID |
Label |
Min (MHz) |
Max (MHz) |
Category |
Notes |
broadcast-lw |
LW broadcast |
0.1485 |
0.285 |
broadcast |
Not amateur 136 kHz |
broadcast-mw |
MW broadcast |
0.5265 |
1.6065 |
broadcast |
|
broadcast-sw |
SW broadcast |
TBD |
TBD |
broadcast |
One coarse row or multiple HF segments |
fm-broadcast |
FM broadcast |
87.5 |
108.0 |
broadcast |
UK FM band |
airband |
Airband |
118.0 |
137.0 |
airband |
Civil aviation VHF AM |
marine |
Marine |
156.0 |
162.05 |
marine |
ITU marine VHF |
pmr446 |
PMR446 |
446.0 |
446.2 |
pmr |
Licence-free; RX-only typical on ham rigs |
Existing amateur rows unchanged unless ordering adjustment needed for lookup.
Affected
docs/reference/bands.md (and/or new reference doc)
docs/reference/display-conventions.md
docs/features/README.md — reference index row
src/lib/bands.ts, src/lib/bands.test.ts
src/components/reference/BandPlanTable.tsx
src/components/crud/BandPill.tsx (+ .md component docs)
src/components/SectionNav/sections/ChannelsListSectionNav.tsx — filter options
src/routes/reference/band-plan.tsx — page copy if sections added
Related
Out of scope
- Programming airband/PMR on OpenGD77 1701 (no AM airband on that radio per operator docs) — classification only; export limits stay in format adapters
- CB (27 MHz), FRS/GMRS, or non-UK band plans unless added in follow-up
- Storing band on
Channel model — continue inferring from frequency at display time unless a separate ticket justifies persistence
Manual verify
- PMR446 channel (e.g. 446.05625 MHz) →
PMR446 pill, not unknown.
- Airband (e.g. 121.5 MHz) →
Airband pill.
- Marine ch 16 (156.8 MHz) →
Marine pill.
- FM broadcast (e.g. 95.0 MHz) →
FM broadcast pill.
- Broadcast LW (e.g. 198 kHz) →
LW broadcast — not amateur 136 kHz.
- Amateur 136 kHz allocation still →
136 kHz amateur pill.
- Band plan page lists amateur and non-amateur sections with correct ranges.
- Channel list band filter includes PMR/airband/etc. when channels exist.
npm run lint && npm run test && npm run build.
Workflow note
Branch from origin/main. Atomic commits — e.g. docs(reference): … then feat(bands): … then feat(ui): band plan sections. PR linking Closes #.
Problem
Band classification today covers UK amateur licence allocations only —
docs/reference/bands.mdandsrc/lib/bands.ts.bandFromFrequencyMhz()/BandPill/ channel-list band filter //#/reference/band-planall useUK_BANDS.Operators routinely programme non-amateur receive channels that never match a pill:
Frequencies outside amateur allocations show no band pill or a muted unknown — even when the channel is deliberately programmed (e.g. PMR446, Glasgow Tower). Worse, naive labelling could confuse broadcast LW with amateur 136 kHz (LW) — same colloquial “LW” wording, different services and licence rules.
Intended outcome
Extend band reference and lookup so non-amateur services classify with distinct IDs, labels, and colours, while keeping amateur bands authoritative where allocations overlap in operator mental models.
Documentation (tier-2 reference)
docs/reference/bands.mdor add a sibling doc (e.g.docs/reference/frequency-services.md) indexed from the reference hub — domain-neutral, not CPS wire tables.136khzbroadcast-lw)broadcast-lwbroadcast-mwbroadcast-swpmr446airbandmarinefm-broadcastdocs/reference/display-conventions.md— band pill rules for amateur and non-amateur categories.Implementation (
src/lib/bands.ts)category(or equivalent) onBandDefinition, e.g.'amateur' | 'pmr' | 'airband' | 'marine' | 'broadcast'.UK_AMATEUR_BANDS+ALL_BANDS(orFREQUENCY_BANDS) so channel-list filter can default to amateur-only while still classifying PMR/airband/etc. on pills.UI
BandPill— render new bands (optionally subtle category styling, e.g. outline for non-amateur — TBD in PR).BandPlanTable//#/reference/band-plan— group or section: Amateur | PMR & services | Broadcast (or tabs).ChannelsListSectionNav) — include new bands when present in codeplug; consider amateur-only default with opt-in “all services”.Proposed frequency rows (starting point — verify in PR)
Ranges are indicative; PR author should cite Ofcom / ITU / ETSI sources and tighten bounds.
broadcast-lwbroadcast-mwbroadcast-swfm-broadcastairbandmarinepmr446Existing amateur rows unchanged unless ordering adjustment needed for lookup.
Affected
docs/reference/bands.md(and/or new reference doc)docs/reference/display-conventions.mddocs/features/README.md— reference index rowsrc/lib/bands.ts,src/lib/bands.test.tssrc/components/reference/BandPlanTable.tsxsrc/components/crud/BandPill.tsx(+.mdcomponent docs)src/components/SectionNav/sections/ChannelsListSectionNav.tsx— filter optionssrc/routes/reference/band-plan.tsx— page copy if sections addedRelated
dmr-programmingfrequencies/(airband, PMR in codeplugs) — inspiration, not a hard dependencyOut of scope
Channelmodel — continue inferring from frequency at display time unless a separate ticket justifies persistenceManual verify
PMR446pill, not unknown.Airbandpill.Marinepill.FM broadcastpill.LW broadcast— not amateur136 kHz.136 kHzamateur pill.npm run lint && npm run test && npm run build.Workflow note
Branch from
origin/main. Atomic commits — e.g.docs(reference): …thenfeat(bands): …thenfeat(ui): band plan sections. PR linkingCloses #.