Conversation
- converts incoming timestamp from nanoseconds to milliseconds - adjusts displays to use timestamp instead of age - removes the now unused age from strike objects - adjust time limit to a constant 30 minutes to match panel text The memory imposed limit should be on the size of the array, not the age.
Integrates TCI (Transceiver Control Interface) as a first-class rig-bridge
plugin, enabling direct WebSocket connection to SDR applications such as
Thetis (Hermes Lite 2 / ANAN), ExpertSDR (SunSDR2), and SmartSDR (Flex).
## New plugin: rig-bridge/plugins/tci.js
- Ported TCI protocol from rig-listener, restructured as a plugin descriptor
- Push-based — no polling; frequency, mode, PTT and filter width arrive
automatically after sending `start;`
- Supports: vfo, modulation, trx, rx_filter_band messages
- Full TCI_MODES / TCI_MODES_REV maps for all 12 TCI modulation types
- Auto-reconnects every 5 s on connection drop
- setFreq / setMode / setPTT send correct TCI commands
- WebSocket resolved via require('ws') with fallback to globalThis.WebSocket
so the plugin works both with the ws npm package and Node 21+ built-in WS
- All event bindings use addEventListener (not .on()) — avoids the
"tciSocket.on is not a function" crash when running under Node 21+ without
the ws npm package (W3C EventTarget has no EventEmitter .on() method)
## Config (rig-bridge/core/config.js)
- Added tci section to DEFAULT_CONFIG: host, port (40001), trx (0), vfo (0)
- Updated radio.type comment to include 'tci'
- Extended loadConfig() merge to include tci section
## Registry (rig-bridge/core/plugin-registry.js)
- Added 'tci' to the registerBuiltins() plugin loop
## Web config UI (rig-bridge/core/server.js)
- Added "SDR Radios (TCI)" optgroup with TCI option to the radio type dropdown
- Added TCI form section: host, port (min 1 / max 65535), TRX index
(min 0 / max 7), VFO index (min 0 / max 1)
- onTypeChange() toggles .tci-opts.show to show/hide the TCI section
- populateForm() loads tci config values into TCI fields
- saveAndConnect() collects TCI fields with validation:
- host cannot be empty
- port must be 1–65535
- trx/vfo clamped to 0 minimum via Math.max(0, ...)
- POST /api/config merges newConfig.tci into config.tci before reconnect
## Dependencies (rig-bridge/package.json)
- Added ws ^8.14.2 (was missing; rig-bridge previously had no WebSocket dep)
## Version bump
- package.json and rig-bridge.js: 1.1.0 → 1.2.0
## Documentation (rig-bridge/README.md)
- Added "SDR Radios via TCI (WebSocket)" supported-radios table
- Added full TCI setup section: per-app enable instructions, config JSON
example, field reference table, expected log output
- Added 3 TCI troubleshooting rows (connection refused, no freq updates,
remote SDR host)
- Updated project structure tree to include plugins/tci.js
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add +/− buttons on the right side of the DXNewsTicker banner that let users resize the scrolling text in real time. Button and bar height scale proportionally with the text. The chosen scale (0.7×–2.0×) is persisted in localStorage so it survives page reloads. - Extract base font-size constants (BASE_LABEL_SIZE, BASE_TEXT_SIZE, BASE_HEIGHT) and multiply by textScale throughout the component - Add textScale to the animation-duration useEffect deps so scroll speed recalculates after a resize - Add i18n keys app.dxNews.increaseTextSize / decreaseTextSize to all 15 language files (English fallback for non-English locales) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…able, but "spot.ref - spot.name" in the title (which is displayed in mouse-over).
Add a hot key (/) to toggle the DE and DX labels
docs: clarify contributor setup and staging PR workflow, Fixes #663
Add TCI/SDR plugin to rig-bridge + bump to v1.2.0
feat: add inline text size controls to DX News ticker
[BUG 660] POTA & SOTA panels truncate information
Add DXCC target selector for DX Target panel
margin on draggable container
lightning to work with new draggable panels; refactored muf map to use theme colors and align with code in other layers
Merge main to Staging
Feature 634 - Map Widgets Alignment
Fix lightning map layer timestamps
- Warn explicitly when ws npm package is missing and native WebSocket fallback activates - Log which WebSocket implementation (ws npm vs native) is selected at startup - Disable perMessageDeflate on ws connections for compatibility with non-standard TCI servers (e.g. Thetis) - Add specific error branch for Sec-WebSocket-Accept handshake failures with actionable guidance Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… as otehr code (eg PSKFilterManager) relies on it.
… error electron-winstaller's postinstall tries to copy vendor/7z-arm.exe on ARM Linux, which fails because the file doesn't exist for Linux targets. Added --ignore-scripts to npm install and ELECTRON_SKIP_BINARY_DOWNLOAD=1 to prevent these Windows-only lifecycle hooks from running on Raspberry Pi. Also added npm prune --omit=dev after build to reclaim ~500 MB of disk space. Fixes: #<electron-winstaller ENOENT on Bullseye/ARM> Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
[BUG 673] PSKReporter Always Uses FN31 as Grid Square
Improve TCI plugin diagnostics and Thetis compatibility
…than just km. All comparisons are still done in km, but we display in the appropriate unit. I also had to update the panel header to list the strike radius in both units, in order to have this fit, i had to override the font size down to 11px.
Enables the WSJT-X relay to join a UDP multicast group so multiple
applications on the same machine or LAN can receive WSJT-X packets
simultaneously, rather than competing for a single unicast socket.
Changes:
- core/config.js: Add three new defaults to DEFAULT_CONFIG.wsjtxRelay:
multicast (bool, default false), multicastGroup ('224.0.0.1'),
multicastInterface ('' = OS picks NIC). Deep-merge in loadConfig()
picks these up automatically with no structural changes.
- plugins/wsjtx-relay.js:
· Derive mcEnabled / mcGroup / mcInterface constants at create() time
· In the 'listening' handler, call socket.addMembership() after bind
completes (the only valid moment per the Node.js dgram API).
Wrapped in try/catch — failure logs a clear error and degrades
gracefully to unicast; the plugin keeps running.
· In disconnect(), call socket.dropMembership() before socket.close()
to cleanly release the IGMP membership. Failure is non-fatal and
logged but does not block socket teardown.
· getStatus() now exposes multicast and multicastGroup for the
status API and any future UI status display.
- core/server.js (Integrations tab UI):
· Multicast checkbox with onchange toggle handler
· Collapsible wsjtxMulticastOpts div containing Multicast Group and
Multicast Interface text inputs, shown only when checkbox is checked
· populateIntegrations() populates all three new fields on load
· saveIntegrations() collects and POSTs the new values; the existing
POST /api/config handler merges and restarts the plugin automatically
- rig-bridge-config.example.json: Add multicast, multicastGroup,
multicastInterface fields (all at their default/off values)
- README.md: Extend wsjtxRelay config JSON example and field table with
the three new options; add 'Multicast Mode' subsection explaining when
and how to use it (WSJT-X UDP server change, multicastInterface for
multi-homed systems, link-local scope note); add troubleshooting row.
Feature is strictly opt-in (multicast: false by default) — zero impact
on existing unicast configurations.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
[BUG 685] Add full multicast support for WSJT-X, so that multiple apps can listen
…-arm Fix/setup pi electron winstaller arm
Feature/tci rig bridge plugin wsjtx multicast
a new left border tabset using FlexLayout. This panel can collapse. The lock layout control can not be deleted from the border space.
removed styling from JSX, added selectors for border overrides in CSS
added update for stored layout data to add border container, set the lock layout to not be removable, removed empty div
class to the lock button, added locked state styling to the button
[FEATURE] Relocate Layout Lock Button so it's not consuming vertical screen space
Add optional fixed DX cluster spotter coordinates via env vars
[BUG 695] Lightning layer is not using settable distance units
security fixes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Type of change
How to test
Checklist
server.js: caches have TTLs and size caps (we serve 2,000+ concurrent users)var(--accent-cyan), etc.).bak,.old,console.logdebug lines, or test scripts includedScreenshots (if visual change)