Skip to content

Releases: OK1BR/skimmer-for-linux

Skimmer for Linux 0.5.0

Choose a tag to compare

@OK1BR OK1BR released this 20 Sep 21:06
v0.5.0
41c19a1

A feature release on top of v0.4.1: the skimmer gained a third CW decoder — the neural DeepCW engine — and it now keeps its callsign dictionary current by itself. The waterfall and the decode pane got the reading improvements a full contest weekend asked for.

What's new

  • DeepCW, a neural CW engine — a third backend behind the decode interface, running the published DeepCW Conformer + CTC model through ONNX Runtime, which is loaded at run time by dlopen. Preferences → Decoding → CW engine; the Device row picks CPU or CUDA, with a fall back to CPU when the GPU provider will not load. A trained model decides on the rhythm of the keying instead of on a threshold, which is the regime a band-wide skimmer lives in: on the two IQ fixtures it tabled 10 stations against the classical decoder's 7 on 20 m, and 33 against 28 on an 80 m contest band. Neither the runtime nor the model ships with the package — the model is AGPL-3.0-only and is fetched separately, the README says where — and without either one the app says so in its log and stays on the classical decoder, which remains the default.
  • The decode pane shows a draft — DeepCW reads a word or two behind the keying, so the unconfirmed tail is drawn dim and firms up when it commits, instead of the pane standing still and then jumping.
  • MASTER.SCP keeps itself current — with Keep MASTER.SCP current on (the default, Preferences → Decoding) the app asks supercheckpartial.com in the background, at most once a day, whether a newer list is out. It downloads only a file that changed, checks it (checksum, call count, how much of it reads like callsigns) and swaps it into the running dictionary without a reconnect, mid-contest if need be; the status log names the release and the call count. A missing network, a slow server or a bad file changes nothing. The loader also no longer reads the list's !!Order,1,1 header line as a callsign.
  • Ctrl+wheel zooms the waterfall about the pointer (#11) — the frequency under the mouse stays under the mouse instead of the window's middle being the anchor.
  • Protocol words take a colour by their role (#12) — CQ / TEST / QRZ amber, DE blue, reports violet, TU / 73 / K coral; whole tokens only, so a CQ is found by eye in a pane that is running. Preferences → Display switches it off.
  • Your own transmission no longer spoils the picture (#17, #18) — the waterfall pauses for the length of the over rather than washing out to near-white, and the decoder commits the draft it was holding instead of dropping it.
  • A torn callsign is glued as a whole run (#3) — fragments between two word gaps are joined as one piece or not at all, never as a head with the tail lost: UA6HNU is read 224 times on the fixture where the previous code produced it not once, and the phantoms that rule used to leave behind are gone. A call that is already a known one with stray text glued on is no longer swallowed by itself.
  • The packages are built on current systems — the AppImage carries GTK 4.22 instead of the two-year-old 4.14 that cannot parse a stylesheet written for a current GTK, so a themed desktop no longer gets a wall of stylesheet errors at every start, and the .rpm is compiled on Fedora against the libwebsockets the distribution actually ships. Ubuntu 26.04 and Fedora 44 are what the packages are built and install-tested on.

Known issues

DeepCW now and then writes a structurally valid mutation of a callsign it otherwise reads correctly on the same frequency, and that mutation can enter the station table beside the real station (#21) — measuring the rest of it needs another contest. On a few stations the word gaps inside an over are lost, so the pane reads CQTESTSF6WSF6W (#19). Neither touches the classical decoder, which is what a default installation runs.

Install / requires

Needs a running TCI server. sdr-for-linux v0.5.1 or newer is the tested one, and from that version the waterfall holds every line's frequency through a retune; other TCI servers should work in principle and one SunSDR / ExpertSDR3 run has been reported — they are not yet a tested, supported target, reports welcome in #2. AppImage (chmod +x, run), .deb for Ubuntu 26.04+ and .rpm for Fedora 44+ are attached; on Arch, skimmer-for-linux is on the AUR (paru -S skimmer-for-linux).

Skimmer for Linux 0.4.1

Choose a tag to compare

@OK1BR OK1BR released this 11 Sep 17:33
v0.4.1
6122d7a

A maintenance release on top of v0.4.0: the TCI client no longer assumes it is talking to sdr-for-linux. Prompted by the first report of the skimmer running against a SunSDR with ExpertSDR3 (#2, SM0ONR) — the code was audited against the TCI 2.0 specification with Thetis' TCI server as a second reference, and every assumption that only held for our own server was removed. Each fix has a gate check that fails on the previous code.

What's new

  • TCI port is a setting — Preferences → Radio → Port (1–65535, default 40001). The spec names no default port; ExpertSDR3 shows its own in its settings. The connection probe, the engine and the About dialog all use it; a change reconnects like a host change.
  • One IQ block per WebSocket message — binary frames are reassembled per message and the Stream header is read once per message. Trailing bytes are ignored (and logged once), a message shorter than its header claims is dropped with a warning. The old code cut a continuous byte stream by the header length and would have read any padding as the next header.
  • Blocks of other receivers are dropped — the skimmer asks for receiver 0 only; a server that streams every receiver to every client (Thetis' AlwaysStreamIQ, a two-receiver SunSDR) no longer gets RX1 samples mixed into the RX0 decoder bank.
  • The centre-stamp extension is honoured only after the server acknowledges it — the reserved header words are treated as reserved unless the server echoed iq_stamp:1. With sdr-for-linux nothing changes; with any other server the dds label is used, as before.
  • One command per text frame — iq_samplerate, iq_start and iq_stamp go out as three frames instead of one batched frame.
  • Diagnostics for remote testers — the log now states when the IQ stream is up (receiver, rate, format, channels, frames per block), when the server runs a different IQ sample rate than requested, and when no IQ arrives within three seconds of the request. If the skimmer connects but shows nothing, the log says why.

Install / requires

Needs a running TCI server. sdr-for-linux v0.5.0 works (the smooth retune of the waterfall wants its main branch ≥ 98c57de); other TCI servers should work in principle and one SunSDR / ExpertSDR3 run has been reported — they are not yet a tested, supported target, reports welcome in #2. AppImage (chmod +x, run), .deb for Ubuntu 24.04+ / Debian 13+ and .rpm for Fedora 40+ are attached; on Arch, skimmer-for-linux is on the AUR (paru -S skimmer-for-linux).

Skimmer for Linux 0.4.0

Choose a tag to compare

@OK1BR OK1BR released this 06 Sep 10:38
v0.4.0
a9dc73f

The skimmer got a window worth looking at. The headline work of this release, on top of v0.3.0, is an in-app waterfall with a callsign column — CW Skimmer's layout, asked for by LB0EI for pileup work — and every piece of it ran live on the air before it shipped.

What's new

  • Waterfall view — the top of the window is now a waterfall in CW Skimmer's layout: frequency vertical, time flowing sideways, a kHz scale, the SDR's six colour schemes (Preferences → Display). An FFT tap on the raw IQ band feeds it (23.4 Hz bins at every sample rate, a row every 10.7 ms). The history lives in absolute frequency, so a retune moves the VFO marker and never the picture; mouse wheel pans, Ctrl+wheel zooms, dragging the scale strip pans.
  • Callsign column — beside the scale, every tracked station gets a dot on its frequency and its callsign next to it: CQ callers marked, stations the logbook calls a dup or contest-invalid in gray, the same colours as the panadapter spots and the decode pane. Crowded labels spread out around their anchors instead of piling up, and the tooltip carries kHz, WPM/Bd, SNR, heard count and age. Click a callsign and the radio tunes to that station's tracked frequency while log-for-linux pre-fills its Call entry — the same path a panadapter spot click takes. Live-verified with all three apps on one TCI server.
  • The waterfall flows while you tune — with a current sdr-for-linux (its main branch at 98c57de or later, newer than v0.5.0) every IQ block carries its DDC centre stamp and the radio reports each tuning step at once, so lines hold their frequency through knob sweeps and clicks: no teeth, no bars, no pause. Against sdr-for-linux v0.5.0 the waterfall works too, but the picture can tear around a retune.
  • The station list is gone — the column is the list in another shape; the header keeps one toggle, waterfall on or off. Preferences are grouped in four tabs (Radio · Decoding · Spots · Display).
  • Fixes — closing the window mid-session no longer trips GTK criticals from timers firing on destroyed widgets (engine thread, feed and every timer are torn down on close-request); a second launch presents the running window instead of building a second one inside the first.
  • For the bench — SKIM_IQ_FILE=<capture.cf32> replays a recording into the window at real-time pace, the way to look at the waterfall without a radio; a twelfth gate (skimmer-spectrum-test) covers the spectrum tap, the composer, the label layout and the click hit test.

Install / requires

Needs a running sdr-for-linux with its TCI server enabled — v0.5.0 works, the smooth retune wants its main branch (≥ 98c57de). AppImage (chmod +x, run), .deb for Ubuntu 24.04+ / Debian 13+ and .rpm for Fedora 40+ are attached; on Arch, skimmer-for-linux is on the AUR (paru -S skimmer-for-linux).

Skimmer for Linux 0.3.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 13:51
v0.3.0
96b5d1b

The skimmer speaks RTTY. The headline work of this release, on top of v0.2.0, ran live on a 20 m contest band mid-RTTY-contest before it shipped.

What's new

  • RTTY mode — the second decode mode next to CW: Baudot FSK, 45.45 Bd, ITA2 with US-TTY figures and unshift-on-space. The demodulator acquires the tone pair by periodogram (sub-bin tone centres), rides it with per-tone automatic threshold correction — a mark tone 10 dB under the space still copies exact — and runs two start-bit-anchored UARTs on both signal polarities, so reversed-shift and wrong-sideband signals copy as-is. A layered squelch (tone pair over the noise floor, envelope anti-correlation of the two tones, framing-validity tracking, a fast presence gate) keeps noise channels quiet. Pick it under Preferences → Decoding → Mode; the channel bank switches to the wider RTTY geometry (250 Hz spacing, ±225 Hz passband) on its own. Live mid-contest: real spots on the telnet feed, clean copy of strong stations, ~11 % of one core at 192 kHz IQ / 768 channels.
  • TX hold — while your own transmission deafens the receiver, the engine now freezes all decode state instead of decoding the dead band: no garbage text during your over, and the station answering you decodes from its first character after unkey. Driven automatically by the radio's keyed-state broadcasts over TCI (needs a current sdr-for-linux, ≥ cc470af; with an older server nothing changes).
  • Redrawn icon — a new application icon plus a 16×16 monochrome symbolic variant for the shell.

Install / requires

Needs a running sdr-for-linux with its TCI server enabled. AppImage (chmod +x, run), .deb for Ubuntu 24.04+ / Debian 13+ and .rpm for Fedora 40+ are attached; on Arch, skimmer-for-linux is on the AUR (paru -S skimmer-for-linux).

Skimmer for Linux 0.2.0

Choose a tag to compare

@OK1BR OK1BR released this 09 Aug 13:03
27837f0

Contest awareness and polish on top of v0.1.0. The new pieces were watched live mid-contest during the WAE CW weekend.

What's new

  • Contest-invalid stations gray out — the duplicate service of log-for-linux grew an INV verdict: a station the active contest scores no points for at all (in WAE, every EU call for an EU operator) now dims to gray exactly like a dup — in the decode pane and on the panadapter. The pileup you cannot score stops competing for your eye. Older logbook builds keep working; verdicts the skimmer does not know are simply ignored.
  • Reported frequencies hold across a grid boundary — with Preferences → Frequency step set, a station parked on a cell edge used to alternate a whole grid step between re-announces, on the panadapter label and in the telnet feed alike. The reported value now holds until the station genuinely moves (more than ¾ of a step) or the grid setting changes.
  • About dialog, primary menu, --version — the gear button became the standard primary menu (Preferences, About). About carries the version plus pasteable debug info: GTK/libadwaita versions, TCI host, telnet-feed state, settings / MASTER.SCP / decode-log paths. skimmer-for-linux --version prints from the local process and exits — it never raises or disturbs a running instance.

Install / requires

Unchanged from v0.1.0: needs a running sdr-for-linux with its TCI server enabled. AppImage (chmod +x, run), .deb for Ubuntu 24.04+ / Debian 13+ and .rpm for Fedora 40+ are attached; on Arch build from source or use packaging/PKGBUILD.

Skimmer for Linux 0.1.0

Choose a tag to compare

@OK1BR OK1BR released this 04 Aug 09:44
b1087bd

First release: a native GTK4/libadwaita multi-channel CW skimmer for Linux — the third app of the OK1BR family alongside sdr-for-linux and log-for-linux. It pulls wideband IQ from the TCI server in sdr-for-linux, splits the segment into hundreds of narrow channels and decodes every signal in it at once. Decoding was validated on the air through a full contest day.

Highlights

  • Whole-segment decode: polyphase channelizer (−109 dBc isolation, ~1 % of a core per 192 kHz) feeding a decoder per channel, all in parallel
  • Soft-decision semi-Markov Viterbi CW decoder — a faded element is weak evidence, not no evidence: it reads through QSB where a threshold decoder tears the callsign apart
  • A fist model: the decoder learns each operator's own character and word spacing, so a 5-dit character gap no longer files as a word space
  • A clock that re-locks in one jump when the other side of a QSO comes back at their own speed, instead of gliding the wrong way past the dit/dah boundary
  • Pre-roll replay on squelch attack — the head of an over after dead air is decoded, not eaten by the gate warming up
  • Tone splitter (opt-in, SKIM_TONE_SPLIT=1 / SKIM_TONE_FOCUS=1): two stations sharing one channel decode separately; still awaiting its live verdict
  • RBN-grade callsign validation — nothing unvalidated ever reaches the wire
  • Spots to the radio: station tracker with ghost dedup and QSY tracking, spot frequencies exact to the Hz, CQ-only by default
  • Local telnet cluster feed in the CW-Skimmer dialect (default port 7300) for loggers; no uplink to the RBN network by decision
  • Click a decoded callsign and the radio tunes to the exact carrier while log-for-linux pre-fills its entry row
  • Dup-aware colours: calls already worked dim to gray from the logbook's duplicate service, in the pane and on the panadapter, the moment you log them
  • Headless GLib-only engine with 10 offline gates (meson test, no radio needed) plus a ~50× realtime replay harness for A/B runs on recorded IQ

Requires

A running sdr-for-linux with its TCI server enabled (Prefs → Radio → TCI). Click-through to the logbook additionally needs a server build with the click relay.

Install

  • AppImage (attached): chmod +x, run
  • .deb (Ubuntu 24.04+ / Debian 13+) and .rpm (Fedora 40+): attached
  • Arch: build from source (meson setup builddir --prefix=$HOME/.local && meson install -C builddir); AUR-style PKGBUILD in packaging/

Preferences live in ~/.config/skimmer-for-linux/settings.ini, decode logs in ~/.local/share/skimmer-for-linux/. Drop a MASTER.SCP into the config directory and the callsign extractor uses it as a dictionary boost.

The skimmer is read-only against the radio: it never keys, and the one deliberate write is the tuning you asked for by clicking a station.