Note on sequencing
Transparency up front: the reference implementation (PR #3684) already exists — built by @jensenpat. Per GOVERNANCE.md this is out of order (RFC should precede a new feature area). This RFC formalizes the design for maintainer sign-off, mirroring how #3613 (remote receive antennas) was handled. #3684 is held until this RFC is approved.
Problem
Operators regularly join recurring on-air nets — gatherings on a fixed frequency/band/mode at a regular local time (weekly traffic nets, daily club nets, monthly special-interest nets). Today AetherSDR has no way to remember those schedules or to be reminded before one starts; the operator tracks them out-of-band (calendar, memory) and manually tunes when it's time. Radio memory channels don't help: they're radio-authoritative, finite, have no recurrence, and no reminder.
Proposal
A personal Net Reminder Scheduler: the operator adds favorite recurring nets, gets a reminder shortly before each starts, and clicks Tune Now to jump straight to it with the saved mode/filter.
Conceptually a net is a memory-channel preset + a recurrence rule + a reminder:
- Tuning reuses the existing
MemoryEntry shape and MemoryRecallPolicy command builders (incl. the cross-band display pan set band= preselect) — no new radio protocol surface (Principle I).
- Recurrence is stored as an RFC 5545 RRULE subset (Daily / Weekly / Monthly-nth-weekday + one-time) plus an IANA timezone and local time-of-day — never a precomputed instant — so "20:00 local" stays correct across DST. The firing instant is computed lazily via
QTimeZone.
- Operator-scoped client state (Principle XIII) — persists locally as versioned JSON, works with no radio connected, and never consumes a radio memory slot. Distinct from radio-authoritative memories.
- Reminder delivery — a guaranteed in-app actionable banner ("Tune Now") plus a best-effort OS tray notification as the attention-getter.
Cross-platform impact
| Platform |
Reminder |
Tuning |
| Linux / Windows / macOS |
In-app banner (guaranteed, identical everywhere) + best-effort QSystemTrayIcon balloon (guarded by isSystemTrayAvailable()) |
Shared MemoryRecallPolicy builders — identical |
Pure QtCore core (headless, unit-tested); no new dependency; no platform-specific code. The in-app banner is independent of tray availability, so the actionable path works even on minimal Linux WMs / under Do-Not-Disturb.
Alternatives considered
- Use radio memory channels — radio-authoritative, finite slots, no recurrence, no reminder, requires a connected radio. Wrong tool. Rejected.
- External calendar /
.ics reminders — no in-app tuning, no awareness of the radio. (.ics export is a fine future complement.)
- Desktop cron / notification daemons — platform-specific, no tuning integration, not discoverable in-app. Rejected.
Implementation scope (reference: PR #3684)
Headless core (NetEntry, NetRecurrence, NetSchedulePlanner, NetScheduleStore, NetScheduler) + UI (NetSchedulerDialog, NetReminderBanner, MainWindow_Nets) + a Settings menu entry. ~2,568 lines, 21 files, 3 unit-test targets (recurrence incl. DST, JSON round-trip, planner). Deep-reviewed: DST/recurrence correct, Principle I/V/XIII honored, cross-platform degradation clean, no blockers.
Requesting maintainer approval before merging #3684.
Note on sequencing
Transparency up front: the reference implementation (PR #3684) already exists — built by @jensenpat. Per GOVERNANCE.md this is out of order (RFC should precede a new feature area). This RFC formalizes the design for maintainer sign-off, mirroring how #3613 (remote receive antennas) was handled. #3684 is held until this RFC is approved.
Problem
Operators regularly join recurring on-air nets — gatherings on a fixed frequency/band/mode at a regular local time (weekly traffic nets, daily club nets, monthly special-interest nets). Today AetherSDR has no way to remember those schedules or to be reminded before one starts; the operator tracks them out-of-band (calendar, memory) and manually tunes when it's time. Radio memory channels don't help: they're radio-authoritative, finite, have no recurrence, and no reminder.
Proposal
A personal Net Reminder Scheduler: the operator adds favorite recurring nets, gets a reminder shortly before each starts, and clicks Tune Now to jump straight to it with the saved mode/filter.
Conceptually a net is a memory-channel preset + a recurrence rule + a reminder:
MemoryEntryshape andMemoryRecallPolicycommand builders (incl. the cross-banddisplay pan set band=preselect) — no new radio protocol surface (Principle I).QTimeZone.Cross-platform impact
QSystemTrayIconballoon (guarded byisSystemTrayAvailable())MemoryRecallPolicybuilders — identicalPure QtCore core (headless, unit-tested); no new dependency; no platform-specific code. The in-app banner is independent of tray availability, so the actionable path works even on minimal Linux WMs / under Do-Not-Disturb.
Alternatives considered
.icsreminders — no in-app tuning, no awareness of the radio. (.icsexport is a fine future complement.)Implementation scope (reference: PR #3684)
Headless core (
NetEntry,NetRecurrence,NetSchedulePlanner,NetScheduleStore,NetScheduler) + UI (NetSchedulerDialog,NetReminderBanner,MainWindow_Nets) + a Settings menu entry. ~2,568 lines, 21 files, 3 unit-test targets (recurrence incl. DST, JSON round-trip, planner). Deep-reviewed: DST/recurrence correct, Principle I/V/XIII honored, cross-platform degradation clean, no blockers.Requesting maintainer approval before merging #3684.