Skip to content

[FEATURE] IBP Beacon Integration #878

@ceotjoe

Description

@ceotjoe

Background

The IBP (International Beacon Project) runs 18 HF beacons on 5 bands (14.100, 18.110, 21.150, 24.930, 28.200 MHz). The schedule is fully deterministic — no API needed for the core feature:

slot = floor((utcSeconds % 180) / 10) // 0–17, changes every 10 s
14.100 → beacons[slot % 18]
18.110 → beacons[(slot - 1 + 18) % 18]
21.150 → beacons[(slot - 2 + 18) % 18]
24.930 → beacons[(slot - 3 + 18) % 18]
28.200 → beacons[(slot - 4 + 18) % 18]

Inspired by DL8MFN.


Phase 1 — Core Panel (no server required) ✅ Done

src/utils/ibp.js — pure JS schedule engine

  • Beacon list: 18 callsigns, lat/lon, grid square, ITU region
  • getCurrentSchedule(utcDate){ band → { callsign, location, bearing, distanceKm } }
  • getSecondsUntilNext(utcDate) → countdown to next slot change
  • Bearing/distance calculated from user's QTH using existing geo.js

src/hooks/useIBP.js

  • Ticks every second (just for the countdown)
  • Snaps schedule to every 10 s boundary
  • Returns { schedule, secondsRemaining, slot }

src/components/IBPPanel.jsx

  • Table: one row per band, columns: band / current beacon callsign+location / bearing from QTH / distance / countdown bar
  • Progress bar showing position within 10-second slot
  • Optionally overlay propagation quality (GOOD/FAIR/POOR) from the existing bandConditions data that's already in App.jsx
  • Compact mode for sidebar / full mode for main panel

Phase 2 — Map Layer Plugin ✅ Done

src/plugins/layers/useIBPLayer.js (follows existing plugin pattern)

  • Static markers for all 18 beacon sites
  • Currently-transmitting beacons pulse/highlight per-band colour
  • Great circle arcs from user QTH to active beacons (reuse useGreatCircle pattern)
  • Click popup: callsign, location, current/next transmission time, propagation score
  • Layer metadata: category: 'propagation', defaultEnabled: false

Phase 3 — RBN Cross-Reference

The Reverse Beacon Network often spots IBP beacons. The existing useRBN.js plugin already pulls RBN data.

  • Filter RBN spots where dx matches any IBP callsign
  • Compare to expected schedule: beacon X should be on band Y right now → did the RBN hear it?
  • Show confirmed reception indicators in the panel (green checkmark if RBN heard it in this slot)
  • This effectively gives you real propagation evidence vs. predictions

Phase 4 — Listening Log (optional, needs server)

server/routes/ibp.js

  • POST /api/ibp/heard — user logs they heard a beacon (callsign, band, signal report, UTC)
  • GET /api/ibp/stats — aggregated recent reports
  • Stored in SQLite alongside other server state

src/components/IBPListenLog.jsx (integrated into IBPPanel)

  • Quick "I heard this" button per beacon row
  • Local-only history (localStorage), optionally sync to server

Phase 5 — Alert / Watch

Reuse the existing useAudioAlerts hook:

  • User can pin a specific beacon callsign
  • Alert fires 15 seconds before that beacon's next scheduled slot
  • Works across all 5 bands (alert for whichever bands propagation predicts as open)

Integration Points in the Existing Codebase

What Where
Hook import + panel wiring App.jsx (follows existing pattern)
Add to all 3 layouts ClassicLayout.jsx, ModernLayout.jsx, DockableLayout.jsx
Layer plugin registration src/plugins/layerRegistry.js
i18n keys src/lang/en.json + 16 other langs
Band colours reuse src/utils/bandColors.js
Propagation overlay consume existing bandConditions prop (no new data fetch)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

Status

In Progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions