sjg 37c36d196e [fix](trx-frontend-http): uniform buttons, jog wheel, VFO picker, signal graph, and client count
Reorganize layout: frequency row with jog wheel on top, mode and
transmit/power side by side below. Replace VFO text box with segmented
picker. Add rolling signal history canvas. Track connected SSE clients
and display count in status hint. Unify button heights and add Enter
key support for TX limit input.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
2026-02-08 09:53:33 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00
2025-11-30 23:54:05 +01:00

trx-rs logo

trx-rs (work in progress)

This is an early, untested snapshot of a transceiver control stack (core + backend + frontends). Things may change quickly and APIs are not stable yet. Expect rough edges and bugs; use at your own risk and please report issues you hit. Features, tests and docs are still being written (or not).

The rig task is now driven by the controller components (state machine, handlers, and policies). Polling and retry behavior are configurable via the [behavior] section in the config file.

Supported backends

  • Yaesu FT-817 (feature-gated crate trx-backend-ft817)
  • Planned: other rigs I own; contributions and reports are welcome.

Frontends

  • HTTP status/control frontend (trx-frontend-http)
  • JSON TCP control frontend (trx-frontend-http-json)
  • AppKit GUI frontend (trx-frontend-appkit, macOS only, optional via appkit-frontend feature)
  • rigctl-compatible TCP frontend (trx-frontend-rigctl, listens on 127.0.0.1:4532)

Audio streaming

Bidirectional Opus audio streaming between server, client, and browser.

  • Server captures audio from a configured input device (cpal), encodes to Opus, and streams over a dedicated TCP connection (default port 4533). TX audio received from clients is decoded and played back.
  • Client connects to the server's audio TCP port and relays Opus frames to/from the HTTP frontend via a WebSocket at /audio.
  • Browser connects to the /audio WebSocket, decodes Opus via WebCodecs AudioDecoder, and plays RX audio. TX audio is captured via getUserMedia and encoded with WebCodecs AudioEncoder.

Enable with [audio] enabled = true in the server config and [frontends.audio] enabled = true in the client config.

Dependencies

System libraries

The following system libraries are required at build time:

Library Purpose Install
libopus Opus audio codec encoding/decoding zb install opus (or your system package manager)
cmake Required by the audiopus_sys build script if libopus is not found via pkg-config zb install cmake
pkg-config / pkgconf Locates system libopus during build zb install pkgconf
Core Audio (macOS) / ALSA (Linux) Audio device access via cpal Provided by the OS (macOS) or alsa-lib-dev (Linux)

Rust crate dependencies

New crate dependencies introduced for audio streaming:

Crate Version Used by Purpose
cpal 0.15 trx-server Cross-platform audio capture and playback (wraps Core Audio, ALSA, WASAPI)
opus 0.3 trx-server Safe Rust bindings to libopus for encoding/decoding audio
bytes 1 trx-server, trx-client Efficient byte buffer type for passing Opus packets through channels
actix-ws 0.3 trx-frontend-http WebSocket support for the actix-web HTTP frontend (/audio endpoint)

Plugin discovery

trx-server and trx-client can load shared-library plugins that register backends/frontends via a trx_register entrypoint. Search paths:

  • ./plugins
  • ~/.config/trx-rs/plugins
  • TRX_PLUGIN_DIRS (path-separated)

Example plugin: examples/trx-plugin-example

License

This project is licensed under the BSD-2-Clause license. See LICENSES/ for bundled third-party license files.

S
Description
Experimental ham rig and SDR controller written in Rust
Readme 31 MiB
Languages
Rust 68.2%
JavaScript 24.1%
CSS 4.6%
HTML 3.1%