Skip to content

Releases: cameronzucker/tuxlink

v0.89.1

v0.89.1 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 13 Jul 02:06
fa71109

0.89.1 (2026-07-13)

Bug Fixes

  • ft8,catalog: clippy dead-code (meter error ctor) + finder overlays under Leaflet panes (4a7cb64)
  • ft8ui,ft8: QA wave 2 — waterfall orientation, setup overflow, select-vs-start, setup always reachable (a0e691c)
  • shell,ft8ui: operator live-test wave — APRS dead-end + 5 FT-8 findings (v0.89.0) (75bb8fd)

v0.89.0

v0.89.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 12 Jul 23:46
2454d7e

0.89.0 (2026-07-12)

Features

  • catalog: aim hero — magnetic/true bearing + offline declination (283ba2f)
  • catalog: BandMatrix — per-band rows (openness dot + VOACAP bar + dial chips) (b87d2c7)
  • catalog: live-openness dots on HF band chips (289d95c)
  • catalog: StationRail Station|Live decodes tabs + LiveDecodesTab (5b52268)
  • config: additive WwvOffairConfig (948fe7f)
  • finder: peers as map diamonds that PREFILL the modem — never dial from the finder (efed5eb)
  • finder: wire internet SFI refresh + mount WWV control in Station Intelligence (d7ca0fa)
  • ft8: DeviceReservation — listener-priority acquire over in-flight meter reads (80aa809)
  • ft8: emit listening:change on set_device + hoi1 two-face guards on all ft8 writers (6b56f18)
  • ft8: ft8_cat_probe read-only dial probe (refuses during modem sessions) (7b2c3c7)
  • ft8: ft8_device_meter + ft8_list_devices commands (20b86b3)
  • ft8: ft8_set_sweep_bands command (validated, RMW, emits change) + Ft8CmdError (33d0cc3)
  • ft8ui: BandSubsetPopover — sweep band selection gated on CAT (89a6fa2)
  • ft8ui: close the six gaps a full-feature reachability audit found (53683c7)
  • ft8ui: DecodeFeed (capped) + map layer-control housing (Gateways only) (2548117)
  • ft8ui: deriveBandActivity + stripStats (evidence-only, provenance-gated) (5b26665)
  • ft8ui: deriveUiState total mapping over ServiceAxis (9-member union) (782d18a)
  • ft8ui: Ft8SetupSurface device-picker + live meter + meter/start handover (0283a8d)
  • ft8ui: Ft8SetupSurface Step 2 — rig control + Test CAT + CTA (2ff260c)
  • ft8ui: LiveBandStrip — collapsible strip composing waterfall/decodes/popover (1ee37e5)
  • ft8ui: Phase D1 — mount the FT-8 surfaces the panel never got (8f6b0b3)
  • ft8ui: useFt8Listener hook + ft8Types.ts (race-safe hydration, generation-gated) (ab77bf1)
  • ft8ui: Waterfall.tsx — Canvas2D FFT renderer with gap markers (0ac7114)
  • ft8ui: wire useFt8Listener to the real deriveUiState + deriveBandActivity (36e1015)
  • ft8: waterfall FFT consumer thread + token-counted subscriptions (3765bf3)
  • geomag: offline magnetic_declination command (WMM2025, NOAA-vector tested) (694d752)
  • shell: FT-8 ambient badge in DashboardRibbon + Ft8ListenerProvider mount (6e71a92)
  • stt: 16kHz mono f32 WAV loader (56ec2a6)
  • stt: noise-rejection confidence gate (d00d777)
  • stt: scaffold tuxlink-stt crate — DecodeMode, SttResult, SttError (8a3a3c9)
  • stt: WhisperStt model wrapper + transcribe with vocabulary biasing (35f9115)
  • wwv: backend for low-SNR clip playback, manual entry, manual-tune fallback (62d90b1)
  • wwv: capture_cycle rig orchestration with serial-sequencing branch (218b4f8)
  • wwv: CaptureSource trait + arecord capture (20e6105)
  • wwv: frontend invoke bindings + useWwvOffair hook (5447a95)
  • wwv: low-SNR clip player + manual entry + manual-tune prompt + styling (e0220dc)
  • wwv: nearest-window scheduler (WWV :18 / WWVH :45) (afd54dd)
  • wwv: off-air refresh + snapshot Tauri commands, model resolution, ingest (b6b98b0)
  • wwv: Refresh off-air control mounted in station-finder actions row (0d50369)
  • wwv: register wwv_offair_refresh + wwv_offair_snapshot_read commands (0cac962)
  • wwv: setup-time STT model fetch script + off-air space-weather guide page (2830d35)
  • wwv: spoken-number normalizer for STT output (f1577f2)
  • wwv: time-of-day WWV frequency selection (97bc28d)
  • wwv: window scheduling (:18/:45) + arm/cancel + no-copy retry-once (0ba2428)

Bug Fixes

  • config: add wwv_offair: None to all full Config literals (E0063) (264f8c0)
  • config: borrow instead of move in wwv_offair round-trip test (E0382) (c76875a)
  • contacts: make suggestion rows clickable — clicking a correspondent opened nothing (tuxlink-wxtas) (d3fd434)
  • ft8: clear two CI clippy/compile errors from Phase A (unused import, E0716) (07b6f07)
  • ft8: map ft8_set_sweep_bands infra failures to internal-error, not invalid-band (a09b783)
  • ft8: meter preempts on listener priority so the listener always wins cleanly (754e12e)
  • ft8: normalize waterfall FFT magnitude so strong signals don't saturate to 255 (de97e4b)
  • ft8ui: correct waterfall gap-marker slack to a genuine 2x cadence margin (ed1213d)
  • ft8ui: enforce the 10-min openness window so stale bands revert to no-data (63cb0ae)
  • ft8ui: interpolate active modem mode into BandSubsetPopover modem-busy copy (59b3e5b)
  • mcp: bundle tuxlink-mcp shim in release + ECT packages (b781af4)
  • wwv: adversarial-review correctness wave (rig restore, default device, timing, silence) (7296197)
  • wwv: Codex adversarial findings on the completion (clip security...
Read more

v0.88.0

v0.88.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 11 Jul 14:44
b508c4b

0.88.0 (2026-07-11)

⚠ BREAKING CHANGES

  • peers: the frontend Peer/PeersFile DTOs and the peers_read/peers:changed contract are gone; reachability reads flow through contacts_read and the Contact v2 shape.
  • contacts: the peers_read/peer_* Tauri commands and the peers:changed event are removed (unreleased surface); the frontend re-source lands in Task T-E.
  • mcp: the telnet_p2p_connect MCP tool is no longer exposed to the agent surface; agents can no longer dial a saved P2P peer's telnet endpoint. The operator's manual telnet P2P dial and the agent's radio P2P dial are unaffected.

Features

  • contacts: Contact grows tier + reachability; contacts.json schema v2 (8f30768)
  • contacts: delete the peers store — commands cutover, record-site re-point, keyring retarget (3cdcf91)
  • contacts: observation recorder + inbound limiter with exact-callsign attach (3e56353)
  • contacts: Recent section + contact-detail reachability (T-F Parts 1-2) (6e9fef6)
  • contacts: success-only last_ok + last_ok_direction on reachability rows (T-F Part 0) (9bbf572)
  • contacts: success-only last_ok timestamps (T-F Part 0) (2d3588a)
  • finder: "Dial a station" manual-dial affordance — dial an unheard callsign through the peer-connect seam (T-G) (37d3df1)
  • ft8: 51-tap Kaiser 4:1 decimator with response-verified committed table (tuxlink-b026z.3 T3) (65a3b55)
  • ft8: canonical slot-WAV writer, tuxlink-jt9 preflight round-trip proven (tuxlink-b026z.3 T2) (a044dae)
  • ft8: capture-capable device enumeration + hw:<index> resolver handle (tuxlink-b026z.3 T8) (8becb30)
  • ft8: commands + events + lib wiring; sweep race re-check; clippy round 6 (tuxlink-b026z.3 T17) (999f7ef)
  • ft8: decode types + jt9 discovery with sibling version probe (tuxlink-b026z.2 T4) (f6363d2)
  • ft8: FT8 message field extractor with pinned grammar (tuxlink-b026z.2 T2) (58adc71)
  • ft8: Ft8Config + sweep config, validation rules, alsa + tuxlink-capture deps (tuxlink-b026z.3 T9) (4ec95ad)
  • ft8: host-side slot-WAV preflight — jt9 cannot be trusted to reject bad input (tuxlink-b026z.2 T3) (ce33e2a)
  • ft8: jt9 runner — spawn/timeout/kill discipline, partial salvage, full failure taxonomy (tuxlink-b026z.2 T5) (0152d98)
  • ft8: listener service core — supervisor, start sequence, snapshot, ring (tuxlink-b026z.3 T11) (67f57a6)
  • ft8: listener state machine — axes, health flags, sweep element, N/k counters (tuxlink-b026z.3 T6) (0aabbb8)
  • ft8: modem arbiter — pause/hold/resume + rig-session serialization (tuxlink-b026z.3 T14) (20ee1fe)
  • ft8: modem yield seams — ardopcf choke wrapper, Dire Wolf pre-probe hook, VARA spawn_blocking (tuxlink-b026z.3 T15) (b365386)
  • ft8: salvage-on-signal parity in the jt9 runner + contract doc edits (tuxlink-b026z.3 T7, resolves tuxlink-gujnz) (374870c)
  • ft8: slot anomaly rules — surplus drop, clock-anomaly abandonment, lost-frames drop (tuxlink-b026z.3 T5) (bcb0ea4)
  • ft8: slot pipeline — capture/decode threads, tap, backpressure, ring records (tuxlink-b026z.3 T12) (3fd0848)
  • ft8: src/ft8 skeleton — traits, wire records, fakes, ALSA source, clock probe (tuxlink-b026z.3 T10) (25b9826)
  • ft8: stop protocol + resume/device-absent recovery (tuxlink-b026z.3 T13) (8dfeaa8)
  • ft8: sweep scheduler + provenance downgrade + composition pin (tuxlink-b026z.3 T16) (056f817)
  • ft8: tuxlink-capture leaf crate + FT8 band→dial table (tuxlink-b026z.3 T1) (abcc392)
  • ft8: tuxlink-jt9 leaf crate + jt9 stdout line parser (tuxlink-b026z.2 T1) (7ed80e3)
  • ft8: wall-clock-true slot assembler — boundaries, gap fill, provenance (tuxlink-b026z.3 T4) (c0ec114)
  • mcp: agent telnet P2P dial — (peer_id, endpoint_id) addressing, rebinding-safe denylist (ff5d084)
  • mcp: curated find_peers behind the egress arm gate (bc3d4cd)
  • mcp: engine-aware VARA agent egress — honor HF/SAT vs FM, drop the VaraHf hard-pin (93726ff)
  • mcp: find_peers reads contacts; telnet host:port never crosses the agent surface (1c5ef02)
  • packet: thread SessionIntent through the packet connect path (cfa8816)
  • peers: ARDOP record sites — outer connect-fail, exchange, and answer (806428e)
  • peers: circle peer layer on both maps (escaped divIcon, map_peers-gated) (3f347ed)
  • peers: contact-link reconciliation + peer_id favorite cleanup; finder/map capabilities on (053a148)
  • peers: endpoint-keyed keyring secrets with conservative migration and cascade clear (4688104)
  • peers: favorites link — peer_id on FavoriteDial, recorder->recents bridge, double-count suppression (f1e8b64)
  • peers: finder station-type filter + peer rows + capability hide (6f4928b)
  • peers: frontend P2P connect seam — peer Connect dials p2p with via/path/intent (69fb08f)
  • peers: frontend peer types, usePeers hook, distinct aggregation (cf037d0)
  • peers: global observation sink + VARA record sites (dial + answer) (0102d87)
  • peers: inbound auto-create rate limiter + quarantine counter with p2p_limits config (bf1203f)
  • peers: packet record sites — dial + answer (ab5db94)
  • peers: peer data model — types + serde wire shapes (c4e9458)
  • peers: peer store — open/quarantine/flush, upsert/dedup, split routing, bounded caps (d3a66a6)
  • peers: recorder drop-guard, central observation entry, Tauri commands + state wiring (8d500c7)
  • peers: telnet record sites + global reject->limiter plumbing complete the 8-site matrix ([0b1...
Read more

v0.87.2

v0.87.2 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 10 Jul 16:15
4488e17

0.87.2 (2026-07-10)

Bug Fixes

  • catalog: preserve gateway SSID in parsed callsign — dial the station that actually answers (002b5fc)
  • lint: allow result_large_err on the transport give-back — VaraConfig growth crossed clippy's 128-byte Err threshold (8a0955e)
  • mcp: pass sideband default through the rig_tune port — ardop_tune_rig grew a second argument (71bf98c)
  • rig: convert catalog CENTER to sideband DIAL at the CAT tune — every catalog dial transmitted 1.5 kHz off-channel (80f70bd)
  • rig: gate sideband conversion off FM, preserve fractional-kHz centers, pin center semantics in MCP docs (Codex adrev round) (657befb)
  • rig: set_mode passband -1 — never change the operator's filter width (86055ba)
  • vara: give the data socket an RF-scale read timeout — 2s cmd cadence disconnected the first on-air gateway answer (8e53a2f)
  • vara: hold PTT 250ms after VARA's PTT OFF — stop amputating frame tails (acbdcf0)
  • vara: shut down the data socket on abort + harden xzxk1 tests (Codex adrev round) (ae4a4a7)

v0.87.1

v0.87.1 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 09 Jul 16:23
b11a63f

0.87.1 (2026-07-09)

Bug Fixes

  • elmer: stop the streaming card collapsing to a gray line on transcript overflow (4e2cef3)
  • shell: grant window:allow-set-title (1695 unhandled rejections) (ff38fe1)

v0.87.0

v0.87.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 08 Jul 21:07
8bcbc05

0.87.0 (2026-07-08)

Features

  • config: persist selected connection; bump schema 5->6 (Contract 2) (a20248a)
  • mcp: agent print + report export (Contract 3, tuxlink-z2nwx) (9d38f3d)
  • mcp: modem_get_status reports selected + running with SoT kind (Contract 2) (ccdae4c)
  • mcp: read-only vara_probe deep probe tool (Contract 1b) (ebf1e2c)
  • mcp: rich audio-card inspection + disambiguation guidance (Contract 4, tuxlink-77seh) (3486e53)
  • mcp: VARA cmd-port reachability on vara_status (Contract 1a) (7038436)
  • ui: kind-aware active-modem panel + persist selected connection (Contract 2) (792016d)

Bug Fixes

  • 7ppfq: address Codex review (private-leak lint, vara-fm panel, hydrate race) (e9d55da)
  • config: add active_connection to all Config struct literals (CI E0063) (191e75c)
  • mcp: reject leaf-symlink escape in report export/print (Codex P2) (144baf6)

v0.86.0

v0.86.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 08 Jul 15:58
15bae78

0.86.0 (2026-07-08)

⚠ BREAKING CHANGES

  • elmer: Limits.max_tool_turns is replaced by Limits.max_response_duration.

Features

  • elmer: remove the 10-tool-turn cap; bound a run by wall-clock instead (386608c)
  • elmer: render one StreamingStatusCard; kill the bubble/indicator glitches (cab37a7)
  • elmer: StreamingStatusCard — collapsed counter + bounded expand (h5azu/06v9s/d5zns) (bf6c612)
  • elmer: useStreamAutoFollow pin-to-bottom scroll hook (06v9s) (0581843)
  • elmer: useThinkingPulse verb + elapsed ticker (3de5e8e)

Bug Fixes

  • elmer: keep Stop responsive between fast tool turns; stronger deadline test (8324055)

Refactors

  • elmer: extract RADIO_VERBS into radioVerbs module (7e2f1cb)

v0.85.0

v0.85.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 08 Jul 02:27
a399120

0.85.0 (2026-07-08)

Features

  • rig: bundle Hamlib 4.7.2 with Yaesu FTX-1 support (tuxlink-13pno) (f94b268)

v0.84.0

v0.84.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 07 Jul 17:29
6305a38

0.84.0 (2026-07-07)

Features

  • rig: expose rigctld_binary override field; document bundled default (tuxlink-a9ip3) (45a075b)
  • rig: resolve bundled tuxlink-rigctl/rigctld by default (tuxlink-a9ip3) (0b0ef3a)

Bug Fixes

  • ci: correct libusb dev package name to libusb-1.0-0-dev (tuxlink-a9ip3) (ba27a94)
  • ci: dummy-backend smoke must match the freq line, not the whole capture (tuxlink-a9ip3) (9e4dc15)
  • ci: ldd allow-list must basename the loader path; empty rigctld_binary=bundled (tuxlink-a9ip3) (3b52b5d)
  • packaging: drop system hamlib dep, add bundled-binary base libs (tuxlink-a9ip3) (c13544e)

v0.83.0

v0.83.0 Pre-release
Pre-release

Choose a tag to compare

@cameronzucker cameronzucker released this 07 Jul 14:03
c8eb438

0.83.0 (2026-07-07)

Features

  • config: enrich serial device pickers with real USB device name from sysfs (tuxlink-xj7e1) (bd0fa80)
  • elmer: context meter counter-mode when window is unknown (4951fc2)
  • elmer: emit ContextUsage from the compat path (windowless) (c6c5cff)
  • elmer: make context-meter denominator Option<u32> end to end (6495802)
  • elmer: probe /v1/models for the compat context window (cfb0160)
  • ft8: M2 real-WAV acquisition slice (channelize + Costas sync + thin e2e) (4a2b621)
  • ft8: receive-only type-4 non-standard-callsign unpack (a140f6f)
  • mcp: expose VARA provisioning to Elmer as MCP tools + playbook (wire-walk Flow 3) (cdb5709)
  • vara: anytime VARA setup entry point in the VARA panel (wire-walk Flow 2) (71a69d6)
  • vara: backend commands to provision VARA HF via the engine (3072602)
  • wizard: optional VARA HF provisioning step in onboarding (5aebeea)

Bug Fixes

  • config: serial-name enrich walks ancestors for bInterfaceNumber (Codex P2, tuxlink-xj7e1) (d32ed9b)
  • elmer: anti-stacking guard for Ollama — stop the Stop-then-Send OOM (P0) (ee60f2f)
  • elmer: bound the /v1/models probe + reject bogus context lengths (ee3c641)
  • elmer: gate num_ctx on loopback-alias-aware isLocalOllamaEndpoint (0637219)
  • elmer: gate operator num_ctx control on the Ollama preset (742dfc9)
  • elmer: retry compat request once without stream_options on 400/422 (165f026)
  • elmer: stop sending temperature to Anthropic frontier models (400) (615c64f)
  • ft8: correct sync.rs metric provenance docs + harden sort (M2 review) (dac4d6c)
  • ft8: harden M2 acquisition per Codex adversarial round (72019d1)
  • vara: address Codex adversarial review findings (525bc6f)
  • vara: detect dropped VARA connection (heartbeat) + poll status so the panel unlocks (tuxlink-6urh2) (efa7605)
  • vara: listener terminal EOF stamps SocketLost, not laundered Open (tuxlink-6urh2) (7d1a7ef)
  • vara: mark_socket_lost returns bool, not Result<(),()> (clippy) (tuxlink-6urh2) (bfde602)
  • vara: non-blocking liveness drain + non-UTF8 counts as alive (tuxlink-6urh2) (b784032)
  • vara: rebuild drop-detection as a consuming EOF-aware heartbeat (Codex, tuxlink-6urh2) (8af6c6f)
  • vara: thread bound host/port into mark_socket_lost (reopen target) (tuxlink-6urh2) (697389a)
  • vara: treat EINTR as a live idle tick in the liveness read (tuxlink-6urh2) (e7d41bb)