Skip to content

About

Dark rig-style front-panel theme for OpenWebRX+ with a working VFO dial and segmented S-meter

Resources

Stars

16 stars

Watchers

3 watching

Forks

Latest commit

 

History

157 Commits

Folders and files

Repository files navigation

OpenWebRX+ Rig Skin Plugin

This plugin makes the OpenWebRX+ receiver panel look and work like a real rig: dark front panel, a VFO dial you can actually turn, an LCD with proper readouts, meters and scopes. I wrote it for my own receiver (SDRplay on a magnetic loop) because I never got used to tuning with sliders, and it grew from there.

It is a plain receiver plugin. No fork, nothing patched. It adds a "Rig" entry to the normal theme dropdown, so you and your visitors can switch between this and the stock look any time.

screenshot

The dial and the keys

The dial tunes. Drag it, flick it and it keeps spinning, or use the mouse wheel: one notch is exactly one tuning step, whatever your mouse. Works with a finger on phones and tablets.

Around the dial there are three key columns, grouped by what they do, every key with a status LED:

  • Audio and receive on the left: MUTE, NR, SQL, and TS. TS opens the tuning step picker and has an Auto entry that follows the mode (100 Hz on SSB/CW, 5 or 9 kHz on AM, 12.5 kHz on FM and so on). SQL switches the squelch on with an automatically chosen level.
  • VFO and memory in the middle: A/B, DW, LOCK and MW. LOCK freezes the dial, which has saved me more than once on a wall mounted tablet. MW writes a bookmark where you are (right-click MW searches bookmarks).
  • SCAN, PROP, SAT, AUTO and RIT on the right. SCAN runs the bookmark scanner that the stock UI hides behind a right click. AUTO snaps the VFO onto the strongest signal nearby, handy when you are roughly on a station and want to land exactly on it. RIT is the clarifier, see below.

Below the keys sit small - / + and left / right pairs: waterfall zoom and paging, so you never have to pinch the waterfall on a phone. Paging walks the zoomed view through the capture window, and at the edge it moves the receiver window itself if the server allows center frequency changes.

RIT (clarifier)

RIT nudges the receive frequency a little without moving the VFO, for working someone who is slightly off your frequency. Press RIT to arm it: the left and right arrow keys then step the offset (they turn green to show they belong to RIT), and the offset shows as "RIT +30" on the info line. Press RIT again to switch it off and snap back to the VFO exactly. Right-click RIT to choose the step, 10, 20, 50 or 100 Hz.

Two VFOs and dual watch

The LCD shows two VFOs side by side, A and B, each with its own frequency. They do not swap, so it stays clear which is which. The one the radio is actually listening to is marked by a bright underline and a green RX. Press A/B to pick which VFO is active; the receiver tunes there. Click the active frequency to type one in, and right-click A/B to copy the active VFO into the other.

DW is dual watch: with it armed the rig watches the other VFO in the waterfall and, when it becomes active, switches the audio there until it goes quiet again, then returns. The underline and RX follow the audio. It decides "active" by how far the signal sits above the live noise floor, not a fixed level, so it tracks band conditions and behaves the same on any setup. The default is 8 dB above the floor; right-click DW to change the sensitivity (6/8/10/12 dB) if a busy band keeps it switched over. Dual watch does not touch your squelch, so set the squelch as you like for listening. It works within the current capture window, so the two VFOs need to be on the same band; the receiver has one antenna feed, it cannot listen across two bands at once.

The LCD

The two VFO readouts lead the LCD, with the mode on a blue badge and FIL / TS and the hover frequency on a line under them, so you always know the filter width and what one dial click does. You can tune on the readout itself: point at a digit, scroll, and that digit spins. This works on the MHz digits too; when the target leaves the receiver window the window moves along with you (the server must allow center frequency changes). The S-meter has two faces: a segmented bar, and an analog needle drawn like an Icom meter face. Right-click the meter to switch, or hold your finger on it on a phone. Both move with proper meter ballistics, hold the peak, and show the S value as a number; the needle face also shows the dB reading. With the squelch on, an SQL marker sits where the gate opens. Drag the marker and the squelch follows, so you set it right on the meter, just above the noise. Below the meter a status line shows the band, S units, squelch, mute and UTC time.

Out of the box the meter is relative: it shows the same value as the stock bar, on a rig-style scale. The S numbers depend on your waterfall calibration, not on real dBm. If you know your hardware, you can calibrate it. Put this in plugins/receiver/init.js, the same file that loads the plugin (the Install section below shows where it lives on your server), before the Plugins.load line:

window.rig_skin_config = {
    smeter: {
        offset_hf: -55,    // dB offset below 30 MHz
        offset_vhf: -72,   // dB offset above 30 MHz
        iaru_vhf: true     // S9 = -93 dBm above 30 MHz (IARU standard)
    }
};

With this set, the meter reads true S units: 6 dB per S point, S9 at -73 dBm (or -93 dBm on VHF/UHF with iaru_vhf). The needle face shows real dBm, and the SQL marker and the status line follow the same calibration. It applies to every visitor of your receiver.

How to find your offsets, from best to simplest:

  • Feed a known level from a signal generator and adjust the offset until the dBm readout matches.
  • Compare against a real rig on the same antenna: tune both to the same steady station and adjust until the S readings agree.
  • No reference at all: tune to a quiet spot on the band and set the offset so the noise floor reads believable, S3 to S5 on 40 m, around S0 to S1 on 70 cm. Not precise, but honest enough.
  • If you already calibrated the smeter plugin, copy its values; they mean the same thing as long as its linearity factor is at 1.0, the default.

Change the offset, reload the page, look at the meter, repeat. The offsets depend on your SDR, its gain and your antenna, so if you change the RF gain in a profile, give them a new pass.

Then two scopes:

the two meter faces

  • A band scope centered on the tuned frequency, like the center mode scope on a rig. Click it to tune, scroll it to step, SPAN switches the width and grows automatically on wide FM. It shares the palette and levels of the main waterfall and averages its trace, so weak signals are easy to spot and click.
  • An audio scope: spectrum of what you are hearing with a small waterfall, and a waveform. Good for tuning SSB by eye. Click the S-meter to show or hide it. It keeps running while the audio is muted, so you can watch a signal without listening to it. The waveform timebase is selectable like a rig's scope: click the ms/Div label to cycle 1/3/10/30/100/300 ms per division. Fast settings draw a steady triggered sweep so you see the actual waveform shape; the slow settings roll as an amplitude envelope.

On large screens the rig widens into a two column face, LCD and dial on the left, modes and controls on the right. The chip in the top left corner names the switch it performs, "|← WIDE" grows the rig leftward into two columns and "→| NARROW" folds it back: click it to switch and keep your choice, right-click to let the rig decide again.

wide layout with propagation

Propagation

The PROP key opens a second LCD with three views. Use the prev/next arrows in the caption bar to move between them (the page counter shows where you are); the wide layout shows them side by side:

  • Band conditions estimated from NOAA SWPC data (solar flux and K index), drawn as day/night pills per band group.
  • The NCDXF/IARU beacon tracker. The 18 beacons transmit in a fixed, UTC synchronized rotation on 14.100, 18.110, 21.150, 24.930 and 28.200, so the rig knows which beacon is on the air on each frequency at any second. Click a frequency to listen in CW; while you sit on it the row turns green and shows your live S reading. Three minutes on 14.100 tells you more about the state of 20 m than any prediction.
  • The beacon radar. Pick a band (20m to 10m) on the beacon view and the rig parks on the beacon frequency while the rotation brings all 18 beacons past, ten seconds each. Each one gets a grade measured against your own noise floor: green means solid copy, yellow weak, dim means nothing heard. The picture refreshes every 3 minutes and shows what your antenna actually hears, not what a model predicts. Turn the dial or close the screen and the radio is yours again. With the BCN chip on in the DX window, the grades also color the beacons on the world map, so you see at a glance which paths are open.
  • The live MUF world map from prop.kc2g.com.

band conditions

beacon tracker

Satellites

The SAT button in the top banner opens the tracking window. It is a world map with the live position of every bird, updated every few seconds. A bird above your horizon turns green and shows its ground track and footprint. Click a bird to see its path. Click it again to tune the downlink. Under the map is the pass list for the next 24 hours: when, how long, how high, and the frequency. A pass in progress glows green. Click a row to tune. The HAM and WX chips show or hide the amateur and weather birds. Drag the window by its header, resize it from any edge or corner. It remembers where you left it.

satellite tracking

The list has the popular active birds. FM: ISS, SO-50, AO-91, PO-101, AO-27, AO-123 and the nine TEVEL2 satellites (they share 436.400 and take turns). Linear: RS-44, AO-7 with its 10 m downlink you can hear on an HF antenna, FO-29, AO-73, JO-97, XW-3 and MO-122. Digital: the IO-117 digipeater and NO-44 for APRS. Weather: Meteor M2-3 and M2-4 with LRPT images, NOAA 15 and 19 with APT.

The SAT key on the LCD still has the compact pass list, with the MIN control to hide passes too low to be useful. Click the frequency and the receiver jumps there with the right mode, across bands if the server allows it.

Orbits come from celestrak.org, cached for half a day. All the pass math runs in your browser.

satellite passes

DX cluster

Live spots also show up on the bookmark ribbon above the waterfall: small dark chips with the callsign, sitting at the spot's frequency next to the yellow bookmarks. Click one and you are there, with a sensible mode set. When several spots pile up on the same frequency you get one chip, the newest. This works whenever the Rig theme is on; the DX window does not have to be open.

The DX button in the top banner opens a window with live spots from the DX cluster network, on a world map and in a list. The DX and SAT buttons only show on the Rig theme. The other themes stay untouched. The map shows every spot as a pin, the great circle path from your QTH to the station, and the day/night line, so you see at a glance which paths are open right now. The list gives the age of the spot, the country flag and callsign, frequency, mode, and the bearing and distance from your receiver, handy with a directional antenna. Spots from the backlog source carry no country data, so they show no flag until the station is spotted live again. Click a spot or a pin and the receiver jumps there with the right mode set.

The BCN chip puts the 18 NCDXF/IARU beacons on the map as diamonds, click one to listen to it in CW; when the beacon radar is running they fill with its grades.

The map is interactive: scroll to zoom toward the cursor, drag to pan, double-click to reset, pinch to zoom on a phone. Hover a spot to read its callsign, bearing and distance. Zooming in is the easy way to pick apart spots that pile up near home.

Filter chips at the top switch between the band you are tuned to, all of HF, or everything. The ACT chip switches to a band-activity chart: spots per band from 160 m up through VHF, the band you are on highlighted, with a trend line so you can see which bands are waking up. Click a band in the chart to jump there. The window can be dragged anywhere and resized from any edge or corner, and it remembers its size, position and filter.

Spots stream in live from the HolyCluster network, with DXSummit as the backlog source where the page can reach it. The map itself is drawn in your browser from public domain Natural Earth coastline data, no map service involved.

DX cluster

Watch windows

The WATCH button adds a small window on the frequency you are on: a live waterfall of just that spot, lettered C, D, E after the two VFOs. Add as many as you like. They watch different frequencies on the band you are on, all at once, so you can keep an eye on a net, a repeater and a calling frequency together.

Each window shades the channel for its mode, and its letter blinks red when a signal is there, so you see activity without listening. Click a window to listen to it: the receiver tunes over and the window turns green. Click the speaker to go back where you were. Type or scroll the frequency to move a watch. Drag them anywhere; they stay where you put them. Right-click WATCH to park them all out of sight; the next click on WATCH brings them back.

With the squelch on, the watches also act as priority channels. When the dial sits on silence and a watch lights up, the receiver tunes to it by itself, and three seconds after it goes quiet it returns to where you were. If several are active, the one heard last wins; turn the dial and it lets go. With the squelch off nothing happens on its own.

They only cost the small waterfall, nothing on the server, and only the one you are listening to uses the receiver. On the stock themes they are not there at all.

watch windows

Windows on new and old OpenWebRX+

OpenWebRX+ is getting its own floating windows for plugins (in its master branch since September 8, 2026, in the release after 1.2.123). On an OpenWebRX+ version that has them, the DX cluster, the satellite map and the watch windows open in OpenWebRX+ windows, in the rig look: drag by the header, resize by the corner, close with the X, and OpenWebRX+ remembers where you left them. On an older OpenWebRX+ the skin draws its own windows, as before. It checks which version it runs on when the page loads and picks the right one by itself, nothing to set. The DX, SAT and WATCH buttons stay in the top banner in both cases.

Waterfall

There is a "Rig" palette in the waterfall theme selector, a jet style ramp with a steep low end that keeps weak signals visible. The band scope picks it up automatically. Works best together with auto adjusting waterfall levels on the server.

Any screen size

The panel is fluid: it scales itself so the whole front panel is always visible, and widens the layout as it scales down, so the rig keeps its full on-screen size instead of shrinking. On short wide screens (low resolution laptops) the sections flow into two balanced columns, LCD and dial on the left, modes and controls on the right, before any shrinking, and screens with plenty of width start wide right away; the layout chip in the top left corner pins one layout if you prefer (right-click it to go back to automatic). Everything refits live when you resize the window, switch profiles or open the propagation and satellite screens. On very short landscape screens it stops at half size and scrolls instead.

On a phone the rig docks across the bottom of the screen at full size, edge to edge, and scrolls for the modes and controls. A thin strip of waterfall stays on top. Drag the grip bar on the rig's top edge down for more waterfall or up for more rig; the phone remembers it, and a double tap on the bar goes back to the thin strip. Chat and Status start closed and open on top of the rig from their buttons. The panels of the digital and data modes (FT8 decodes, ADS-B, DMR and so on) appear inside the rig, under its controls: scroll down to read them, and swipe a table sideways when it is wider than the screen. The top bar scrolls sideways when its buttons do not fit. Computers and tablets keep the layout described above.

On a computer or tablet the rig is also movable: drag the grip bar on its top edge to place it anywhere, double-click (or double-tap) the bar to snap it back to its corner. The position is remembered per browser and only applies while the Rig theme is selected.

Install as an app

The receiver can be installed like an app: it gets a rig dial icon and opens fullscreen, no browser bars, which is exactly what I want on the wall mounted tablet. On Android and on the desktop the browser offers to install it when the receiver runs over https. On an iPad or iPhone use Share and Add to Home Screen in Safari; that works on any address, and it is also the best way around Chrome's touch problems on the iPad.

Install

Download the zip (simplest)

Grab the latest openwebrxplus-rig-skin-x.y.z.zip from the releases page, unzip the rig_skin/ folder into your plugins tree, and load it by name. From the folder that holds your docker-compose.yml, this fetches the latest release and sets everything up:

V=$(curl -s https://api.github.com/repos/aganet/openwebrxplus-rig-skin/releases/latest \
  | sed -n 's/.*"tag_name": "v\([^"]*\)".*/\1/p')
curl -fL -o rig-skin.zip \
  "https://github.com/aganet/openwebrxplus-rig-skin/releases/download/v${V}/openwebrxplus-rig-skin-${V}.zip"
unzip -o rig-skin.zip 'rig_skin/*' -d plugins/receiver/
rm rig-skin.zip
grep -q "Plugins.load('rig_skin')" plugins/receiver/init.js 2>/dev/null \
  || echo "Plugins.load('rig_skin');" >> plugins/receiver/init.js

On a Debian package install the plugins folder is /usr/lib/python3/dist-packages/htdocs/plugins/receiver/; unzip there instead. The zip carries three files (rig_skin.js, rig_skin.css, rig_skin_map.js); keep them together.

Update to a newer version

The same commands update an existing install, minus the init.js line (you already have it). From the compose folder:

V=$(curl -s https://api.github.com/repos/aganet/openwebrxplus-rig-skin/releases/latest \
  | sed -n 's/.*"tag_name": "v\([^"]*\)".*/\1/p')
curl -fL -o rig-skin.zip \
  "https://github.com/aganet/openwebrxplus-rig-skin/releases/download/v${V}/openwebrxplus-rig-skin-${V}.zip"
unzip -o rig-skin.zip 'rig_skin/*' -d plugins/receiver/
rm rig-skin.zip

unzip -o overwrites the old files. No container restart needed when the folder is bind-mounted. In the browser, open the page: the version print in the panel's corner turns green and says the new version is ready; click it and the page reloads on the new build. (The browser keeps the old file for up to an hour otherwise; a hard refresh, Ctrl+Shift+R, also works.)

Remote (no files on the server)

One line in your plugins/receiver/init.js, always serves the latest:

Plugins.load('https://aganet.github.io/openwebrxplus-rig-skin/receiver/rig_skin/rig_skin.js');

From the repo

If you prefer git, from the folder that holds your docker-compose.yml:

cd /path/to/your/compose/folder
git clone https://github.com/aganet/openwebrxplus-rig-skin.git
mkdir -p plugins/receiver
cp -r openwebrxplus-rig-skin/receiver/rig_skin plugins/receiver/
echo "Plugins.load('rig_skin');" >> plugins/receiver/init.js
rm -rf openwebrxplus-rig-skin

Docker mounting

However you got the files there, you end up with this layout next to your docker-compose.yml:

docker-compose.yml
plugins/
  receiver/
    init.js
    rig_skin/
      rig_skin.js
      rig_skin.css
      rig_skin_map.js

Mount it into the openwebrx service in docker-compose.yml. Relative paths work in compose. Two options:

Option A, mount the whole plugins folder. Simple, and the layout the official docs use. It hides the plugins bundled inside the image (utils, the examples) and anything previously copied into the container, so use it when this folder is your only source of plugins:

services:
  openwebrx:
    volumes:
      - ./plugins:/usr/lib/python3/dist-packages/htdocs/plugins

Option B, mount only the rig_skin folder plus init.js. Nothing else in the container is touched, so plugins that already exist inside the image or container keep working:

services:
  openwebrx:
    volumes:
      - ./plugins/receiver/rig_skin:/usr/lib/python3/dist-packages/htdocs/plugins/receiver/rig_skin:ro
      - ./plugins/receiver/init.js:/usr/lib/python3/dist-packages/htdocs/plugins/receiver/init.js

If your installation already has its own init.js loading other plugins, do not mount a new one over it: drop the second line and add Plugins.load('rig_skin'); to the existing file instead.

Step 3: recreate the container and refresh the browser:

docker compose up -d

Then pick "Rig" in the theme dropdown (Settings section of the receiver panel). Hard-refresh once (Ctrl+Shift+R) if it does not show up.

With plain docker run the same mounts work as -v "$PWD/plugins:..." arguments.

Tip: if an edit to plugins/receiver/init.js does not show up, restart the container. Some editors replace the file on save, which breaks a single-file bind mount until a restart.

Updating

Fetch the update script once:

curl -O https://raw.githubusercontent.com/aganet/openwebrxplus-rig-skin/main/update-rig-skin.sh
chmod +x update-rig-skin.sh

From then on every update is one command:

./update-rig-skin.sh           # latest release
./update-rig-skin.sh 0.10.4    # or a specific version

The script finds the plugins folder by itself. Set PLUGINS_DIR if yours is somewhere unusual. It checks the download before touching the install and never deletes anything. Then reload the receiver page.

The running version is printed on the rig's bottom-right corner. Click it to open the releases page.

Check the version

Each release bumps a version number inside the plugin. To see which one is actually running, open the receiver, press F12 for the browser console and type:

Plugins.rig_skin._version

It prints the version string, e.g. "0.10.1".

Browsers like to keep an old copy of the plugin, phones the most. Since 0.10.0 the plugin re-checks its own files against the server in the background, so your next reload gets the new version. Nothing reloads on its own.

If the console shows an older version than the server has, one hard refresh brings you over: Ctrl+Shift+R, or on a phone clear the site data.

To check what the server hands out, independent of the browser cache:

curl -s https://YOUR-RECEIVER/plugins/receiver/rig_skin/rig_skin.js | grep _version

or, on the server itself, grep _version plugins/receiver/rig_skin/rig_skin.js.

Credits

Written by SV1DOD / HB9ISH.

A skin for OpenWebRX:

  • OpenWebRX+, the fork it is built for, maintained by luarvique and 0xAF.
  • OpenWebRX by Jakob Ketterl, the original it is based on.

Data and libraries the plugin uses:

About

Dark rig-style front-panel theme for OpenWebRX+ with a working VFO dial and segmented S-meter

Resources

Stars

16 stars

Watchers

3 watching

Forks

Releases

Packages

Contributors

Languages