From 1167806d6bea24cb88379a62fd21759b49a675ff Mon Sep 17 00:00:00 2001 From: ceotjoe Date: Mon, 6 Apr 2026 10:23:25 +0200 Subject: [PATCH 01/14] Add --update flag to rig-bridge install scripts and update README - Windows .bat and macOS/Linux .sh installers now accept --update: stops any running instance (port 5555), re-clones into a staging dir, preserves rig-bridge-config.json, re-installs deps, restarts - Explicit git availability check added to all scripts - Safe staging-dir approach: old files only deleted after successful clone - Option A in Getting Started rewritten to reflect the Settings UI download journey with per-OS shell instructions - New "Updating Rig Bridge" section added to README with per-OS update commands, notes on Command Prompt requirement on Windows, and a clear description of what is and isn't preserved across updates - Contents list renumbered accordingly Co-Authored-By: Claude Sonnet 4.6 --- rig-bridge/README.md | 109 ++++++++++++++++++++++++----- server/routes/rig-bridge.js | 132 +++++++++++++++++++++++++++++++++--- 2 files changed, 214 insertions(+), 27 deletions(-) diff --git a/rig-bridge/README.md b/rig-bridge/README.md index fd0a1912..b735da40 100644 --- a/rig-bridge/README.md +++ b/rig-bridge/README.md @@ -12,14 +12,15 @@ It also connects FT8/FT4 decoding software (WSJT-X, JTDX, MSHV, JS8Call) to Open 1. [Supported Radios](#supported-radios) 2. [Getting Started](#getting-started) -3. [Connecting Your Radio](#connecting-your-radio) -4. [Connecting to OpenHamClock](#connecting-to-openhamclock) -5. [Digital Mode Software (FT8, JS8, etc.)](#digital-mode-software) -6. [APRS via Local TNC](#aprs-via-local-tnc) -7. [Antenna Rotator](#antenna-rotator) -8. [HTTPS Setup (needed for openhamclock.com)](#https-setup) -9. [Troubleshooting](#troubleshooting) -10. [Advanced Topics](#advanced-topics) +3. [Updating Rig Bridge](#updating-rig-bridge) +4. [Connecting Your Radio](#connecting-your-radio) +5. [Connecting to OpenHamClock](#connecting-to-openhamclock) +6. [Digital Mode Software (FT8, JS8, etc.)](#digital-mode-software) +7. [APRS via Local TNC](#aprs-via-local-tnc) +8. [Antenna Rotator](#antenna-rotator) +9. [HTTPS Setup (needed for openhamclock.com)](#https-setup) +10. [Troubleshooting](#troubleshooting) +11. [Advanced Topics](#advanced-topics) --- @@ -67,15 +68,49 @@ Select **Simulated Radio** in the setup screen. A fake radio will drift through ### Step 1 — Download and run Rig Bridge -**Option A — Standalone executable (easiest, no installation needed)** +**Option A — Installer from the OpenHamClock Settings tab (recommended)** -1. Go to the Releases page and download the file for your operating system: - - `ohc-rig-bridge-win.exe` — Windows - - `ohc-rig-bridge-macos` — macOS (Intel) - - `ohc-rig-bridge-macos-arm` — macOS (Apple Silicon / M1, M2, M3, M4) - - `ohc-rig-bridge-linux` — Linux -2. Double-click the file to run it. On macOS you may need to right-click → Open the first time. -3. A terminal/console window will appear showing log messages — leave it running. +> Requires **Node.js** and **git** to be installed on your computer. + +1. In OpenHamClock, open **Settings → Rig Bridge**. +2. Tick **Enable Rig Bridge**. +3. Click the download button for your operating system — **Windows**, **Mac**, or **Linux**. + +**Windows** + +4. Open your Downloads folder and double-click `install-rig-bridge.bat`. + A Command Prompt window will open, download Rig Bridge, and start it automatically. + +**macOS** + +4. Open **Terminal** (Applications → Utilities → Terminal) and run: + ```bash + chmod +x ~/Downloads/install-rig-bridge.sh + ~/Downloads/install-rig-bridge.sh + ``` + The script downloads Rig Bridge and starts it. Leave the Terminal window open. + +**Linux** + +4. Open a terminal and run: + ```bash + chmod +x ~/Downloads/install-rig-bridge.sh + ~/Downloads/install-rig-bridge.sh + ``` + The script downloads Rig Bridge and starts it. Leave the terminal open. + +--- + +5. Once Rig Bridge is running, return to OpenHamClock **Settings → Rig Bridge** and click + **Open Setup UI** — this opens **http://localhost:5555** in a new tab. +6. Copy the **API Token** shown at the top of that page. +7. Back in OpenHamClock **Settings → Rig Bridge**, paste the token into the **API Token** field. +8. Confirm **Host** is `http://localhost` and **Port** is `5555`. +9. Tick **Click-to-tune** if you want spot clicks to tune your radio, then click **Save**. + +Now configure your radio in the Rig Bridge Setup UI — see [Connecting Your Radio](#connecting-your-radio). + +To update Rig Bridge in the future, see [Updating Rig Bridge](#updating-rig-bridge). **Option B — Run from source with Node.js** @@ -109,6 +144,48 @@ See [Connecting to OpenHamClock](#connecting-to-openhamclock) below. --- +## Updating Rig Bridge + +To update to the latest version, re-run the installer script you downloaded during setup +with the `--update` flag. Your radio configuration is preserved automatically. + +**Windows** + +Open Command Prompt, navigate to your Downloads folder, and run: + +```cmd +install-rig-bridge.bat --update +``` + +> You cannot pass arguments by double-clicking a `.bat` file — open Command Prompt first +> (`Win + R` → type `cmd` → Enter), then run the command above. + +**macOS / Linux** + +```bash +~/Downloads/install-rig-bridge.sh --update +``` + +> If you no longer have the original script, download it again from +> **Settings → Rig Bridge** in OpenHamClock — the `--update` flag works on a freshly +> downloaded copy too, as long as Rig Bridge is already installed. + +### What the update does + +1. Stops the running Rig Bridge instance (if any) +2. Downloads the latest files from the repository +3. Preserves your `rig-bridge-config.json` (radio settings, tokens, plugins) +4. Re-installs dependencies +5. Restarts Rig Bridge + +### What gets reset + +Nothing in your configuration is changed. Any manual edits you made directly to +`rig-bridge.js` or other source files **will be overwritten** — the update replaces +all source files. + +--- + ## Connecting Your Radio ### Yaesu radios (FT-991A, FT-891, FT-710, FT-DX10, etc.) diff --git a/server/routes/rig-bridge.js b/server/routes/rig-bridge.js index 5e3755cd..851180c3 100644 --- a/server/routes/rig-bridge.js +++ b/server/routes/rig-bridge.js @@ -456,6 +456,21 @@ module.exports = function (app, ctx) { 'echo.', '', 'set "RIG_DIR=%USERPROFILE%\\openhamclock-rig-bridge"', + '', + 'set "UPDATE_MODE=0"', + 'for %%A in (%*) do (', + ' if /I "%%A"=="--update" set "UPDATE_MODE=1"', + ')', + '', + 'if "%UPDATE_MODE%"=="1" (', + ' if not exist "%RIG_DIR%\\rig-bridge.js" (', + ' echo Error: rig-bridge is not installed at %RIG_DIR%', + ' echo Run this script without --update to install first.', + ' pause', + ' exit /b 1', + ' )', + ')', + '', 'if not exist "%RIG_DIR%" mkdir "%RIG_DIR%"', '', 'where node >nul 2>nul', @@ -466,20 +481,61 @@ module.exports = function (app, ctx) { ' exit /b 1', ')', '', - 'echo Cloning rig-bridge...', - 'if not exist "%RIG_DIR%\\rig-bridge.js" (', - ' git clone --depth 1 --filter=blob:none --sparse https://github.com/accius/openhamclock.git "%RIG_DIR%\\repo" 2>nul', - ' if exist "%RIG_DIR%\\repo" (', - ' cd /d "%RIG_DIR%\\repo"', + 'where git >nul 2>nul', + 'if errorlevel 1 (', + ' echo Git not found. Please install from https://git-scm.com', + ' pause', + ' exit /b 1', + ')', + '', + 'if "%UPDATE_MODE%"=="1" (', + ' echo Checking for running rig-bridge...', + ' netstat -ano 2>nul | findstr ":5555 " | findstr "LISTENING" >nul 2>nul', + ' if not errorlevel 1 (', + ' echo Stopping running rig-bridge on port 5555...', + ' for /f "tokens=5" %%P in (\'netstat -ano ^| findstr ":5555 " ^| findstr "LISTENING"\') do (', + ' taskkill /PID %%P /F >nul 2>nul', + ' )', + ' timeout /t 2 /nobreak >nul', + ' )', + ')', + '', + 'if "%UPDATE_MODE%"=="1" (', + ' echo Downloading latest rig-bridge files...', + ' if exist "%RIG_DIR%\\.update-staging" rmdir /S /Q "%RIG_DIR%\\.update-staging"', + ' git clone --depth 1 --filter=blob:none --sparse https://github.com/accius/openhamclock.git "%RIG_DIR%\\.update-staging" 2>nul', + ' if exist "%RIG_DIR%\\.update-staging" (', + ' cd /d "%RIG_DIR%\\.update-staging"', ' git sparse-checkout set rig-bridge', - ' xcopy /E /Y /I "%RIG_DIR%\\repo\\rig-bridge" "%RIG_DIR%"', + ' if exist "%RIG_DIR%\\rig-bridge-config.json" copy /Y "%RIG_DIR%\\rig-bridge-config.json" "%TEMP%\\rig-bridge-config.bak" >nul', + ' for /f "delims=" %%F in (\'dir /b /a-d "%RIG_DIR%"\') do (', + ' if /I not "%%F"==".update-staging" if /I not "%%F"=="node_modules" del /F /Q "%RIG_DIR%\\%%F" >nul 2>nul', + ' )', + ' xcopy /E /Y /I "%RIG_DIR%\\.update-staging\\rig-bridge" "%RIG_DIR%"', ' cd /d "%RIG_DIR%"', - ' rmdir /S /Q repo', + ' rmdir /S /Q .update-staging', + ' if exist "%TEMP%\\rig-bridge-config.bak" copy /Y "%TEMP%\\rig-bridge-config.bak" "%RIG_DIR%\\rig-bridge-config.json" >nul', ' ) else (', - ' echo Git clone failed. Make sure git is installed.', + ' echo Update failed: git clone error. Existing installation unchanged.', ' pause', ' exit /b 1', ' )', + ') else (', + ' echo Cloning rig-bridge...', + ' if not exist "%RIG_DIR%\\rig-bridge.js" (', + ' git clone --depth 1 --filter=blob:none --sparse https://github.com/accius/openhamclock.git "%RIG_DIR%\\repo" 2>nul', + ' if exist "%RIG_DIR%\\repo" (', + ' cd /d "%RIG_DIR%\\repo"', + ' git sparse-checkout set rig-bridge', + ' xcopy /E /Y /I "%RIG_DIR%\\repo\\rig-bridge" "%RIG_DIR%"', + ' cd /d "%RIG_DIR%"', + ' rmdir /S /Q repo', + ' ) else (', + ' echo Git clone failed. Make sure git is installed.', + ' pause', + ' exit /b 1', + ' )', + ' )', ')', '', 'cd /d "%RIG_DIR%"', @@ -487,7 +543,11 @@ module.exports = function (app, ctx) { 'call npm install --omit=dev', '', 'echo.', - 'echo Starting Rig Bridge...', + 'if "%UPDATE_MODE%"=="1" (', + ' echo Restarting Rig Bridge (updated)...', + ') else (', + ' echo Starting Rig Bridge...', + ')', 'echo Setup UI: http://localhost:5555', 'echo.', 'node rig-bridge.js', @@ -507,6 +567,22 @@ module.exports = function (app, ctx) { 'set -e', '', 'RIG_DIR="$HOME/openhamclock-rig-bridge"', + '', + 'UPDATE_MODE=0', + 'while [[ $# -gt 0 ]]; do', + ' case "$1" in', + ' --update) UPDATE_MODE=1 ;;', + ' *) echo "Unknown argument: $1"; exit 1 ;;', + ' esac', + ' shift', + 'done', + '', + 'if [ "$UPDATE_MODE" -eq 1 ] && [ ! -f "$RIG_DIR/rig-bridge.js" ]; then', + ' echo "Error: rig-bridge is not installed at $RIG_DIR"', + ' echo "Run this script without --update to install first."', + ' exit 1', + 'fi', + '', 'mkdir -p "$RIG_DIR"', '', 'if ! command -v node &> /dev/null; then', @@ -517,8 +593,38 @@ module.exports = function (app, ctx) { ' exit 1', 'fi', '', + 'if ! command -v git &> /dev/null; then', + ' echo "git not found. Install git and re-run."', + ' exit 1', + 'fi', + '', + 'if [ "$UPDATE_MODE" -eq 1 ]; then', + ' echo "Checking for running rig-bridge..."', + ' RB_PID=$(lsof -ti tcp:5555 2>/dev/null || fuser 5555/tcp 2>/dev/null | tr -d " " || true)', + ' if [ -n "$RB_PID" ]; then', + ' echo "Stopping running rig-bridge (PID $RB_PID)..."', + ' kill "$RB_PID" 2>/dev/null || true', + ' sleep 2', + ' fi', + 'fi', + '', 'echo "Downloading rig-bridge..."', - 'if [ ! -f "$RIG_DIR/rig-bridge.js" ]; then', + 'if [ "$UPDATE_MODE" -eq 1 ]; then', + ' STAGING="$RIG_DIR/.update-staging"', + ' rm -rf "$STAGING"', + ' git clone --depth 1 --filter=blob:none --sparse https://github.com/accius/openhamclock.git "$STAGING"', + ' if [ -d "$STAGING" ]; then', + ' cd "$STAGING" && git sparse-checkout set rig-bridge', + ' [ -f "$RIG_DIR/rig-bridge-config.json" ] && cp "$RIG_DIR/rig-bridge-config.json" /tmp/rig-bridge-config.bak', + ' find "$RIG_DIR" -maxdepth 1 ! -name ".update-staging" ! -name "node_modules" ! -path "$RIG_DIR" -delete', + ' cp -r "$STAGING/rig-bridge/"* "$RIG_DIR/"', + ' rm -rf "$STAGING"', + ' [ -f /tmp/rig-bridge-config.bak ] && cp /tmp/rig-bridge-config.bak "$RIG_DIR/rig-bridge-config.json"', + ' else', + ' echo "Update failed: git clone error. Existing installation is unchanged."', + ' exit 1', + ' fi', + 'elif [ ! -f "$RIG_DIR/rig-bridge.js" ]; then', ' cd "$RIG_DIR"', ' git clone --depth 1 --filter=blob:none --sparse https://github.com/accius/openhamclock.git repo 2>/dev/null', ' if [ -d repo ]; then', @@ -536,7 +642,11 @@ module.exports = function (app, ctx) { 'npm install --omit=dev', '', 'echo ""', - 'echo "Starting Rig Bridge..."', + 'if [ "$UPDATE_MODE" -eq 1 ]; then', + ' echo "Restarting Rig Bridge (updated)..."', + 'else', + ' echo "Starting Rig Bridge..."', + 'fi', 'echo "Setup UI: http://localhost:5555"', 'echo ""', 'node rig-bridge.js', From 5c9498d2e608aeefb250b8c62bd13877f75b815b Mon Sep 17 00:00:00 2001 From: ceotjoe Date: Mon, 6 Apr 2026 10:25:44 +0200 Subject: [PATCH 02/14] Add README banner, Alpha badge and i18n to rig-bridge settings tab - Prominent amber banner added to the top of the Rig Bridge settings tab (always visible) linking to the rig-bridge README on the main branch and asking users to read it carefully before setup - Cloud Relay section header now carries an inline Alpha badge (amber border/text, uppercase) to signal pre-release status - 5 new i18n keys under station.settings.rigBridge.* namespace added to all 15 active locale files with proper native-language translations (fr, de, es, ca, it, nl, pt, ru, ja, ko, ka, ms, sl, th) Co-Authored-By: Claude Sonnet 4.6 --- src/components/SettingsPanel.jsx | 48 +++++++++++++++++++++++++++++++- src/lang/ca.json | 5 ++++ src/lang/de.json | 5 ++++ src/lang/en.json | 5 ++++ src/lang/es.json | 5 ++++ src/lang/fr.json | 5 ++++ src/lang/it.json | 5 ++++ src/lang/ja.json | 5 ++++ src/lang/ka.json | 5 ++++ src/lang/ko.json | 5 ++++ src/lang/ms.json | 5 ++++ src/lang/nl.json | 5 ++++ src/lang/pt.json | 5 ++++ src/lang/ru.json | 5 ++++ src/lang/sl.json | 5 ++++ src/lang/th.json | 5 ++++ 16 files changed, 122 insertions(+), 1 deletion(-) diff --git a/src/components/SettingsPanel.jsx b/src/components/SettingsPanel.jsx index d8586440..211fc875 100644 --- a/src/components/SettingsPanel.jsx +++ b/src/components/SettingsPanel.jsx @@ -4649,6 +4649,33 @@ export const SettingsPanel = ({ {/* Rig Bridge Tab */} {activeTab === 'rig-bridge' && (
+ {/* README Banner */} +
+
+ {t('station.settings.rigBridge.readme.heading')} +
+
+ {t('station.settings.rigBridge.readme.body')}{' '} + + {t('station.settings.rigBridge.readme.link')} + +
+
+
- Cloud Relay + {t('station.settings.rigBridge.cloudRelay.title')} + + {t('station.settings.rigBridge.alpha')} +
{cloudRelaySession ? ( <> diff --git a/src/lang/ca.json b/src/lang/ca.json index c11adad4..04e4877b 100644 --- a/src/lang/ca.json +++ b/src/lang/ca.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configurat — les decodificacions WSJT-X apareixeran a OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configurant...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Relé al núvol", + "station.settings.rigBridge.readme.body": "Rig Bridge requereix programari local i una configuració acurada. Reviseu la guia de configuració completa abans d'activar:", + "station.settings.rigBridge.readme.heading": "Llegiu el README abans de configurar", + "station.settings.rigBridge.readme.link": "README de rig-bridge a GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Sota l’horitzó", diff --git a/src/lang/de.json b/src/lang/de.json index 75336ba0..2ee92102 100644 --- a/src/lang/de.json +++ b/src/lang/de.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay konfiguriert — WSJT-X-Dekodierungen erscheinen in OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Wird konfiguriert...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Cloud-Relay", + "station.settings.rigBridge.readme.body": "Rig Bridge erfordert lokale Software und eine sorgfältige Konfiguration. Lesen Sie die vollständige Einrichtungsanleitung, bevor Sie es aktivieren:", + "station.settings.rigBridge.readme.heading": "README vor der Einrichtung lesen", + "station.settings.rigBridge.readme.link": "rig-bridge README auf GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Unter dem Horizont", diff --git a/src/lang/en.json b/src/lang/en.json index f3991c29..641061da 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configured — WSJT-X decodes will appear in OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configuring...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Cloud Relay", + "station.settings.rigBridge.readme.body": "Rig Bridge requires local software and careful configuration. Review the full setup guide before enabling:", + "station.settings.rigBridge.readme.heading": "Read the README before setting up", + "station.settings.rigBridge.readme.link": "rig-bridge README on GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Below Horizon", diff --git a/src/lang/es.json b/src/lang/es.json index 93dff75d..81424a5d 100644 --- a/src/lang/es.json +++ b/src/lang/es.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configurado — las decodificaciones WSJT-X aparecerán en OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configurando...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Retransmisor en la nube", + "station.settings.rigBridge.readme.body": "Rig Bridge requiere software local y una configuración cuidadosa. Revise la guía de configuración completa antes de activar:", + "station.settings.rigBridge.readme.heading": "Lea el README antes de configurar", + "station.settings.rigBridge.readme.link": "README de rig-bridge en GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Bajo el horizonte", diff --git a/src/lang/fr.json b/src/lang/fr.json index 6d8dd409..9d986890 100644 --- a/src/lang/fr.json +++ b/src/lang/fr.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configuré — les décodages WSJT-X apparaîtront dans OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configuration en cours...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Relais Cloud", + "station.settings.rigBridge.readme.body": "Rig Bridge nécessite un logiciel local et une configuration soigneuse. Consultez le guide complet avant d'activer :", + "station.settings.rigBridge.readme.heading": "Lisez le README avant la configuration", + "station.settings.rigBridge.readme.link": "README de rig-bridge sur GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Sous l'horizon", diff --git a/src/lang/it.json b/src/lang/it.json index aa1f1fe3..8891f2a7 100644 --- a/src/lang/it.json +++ b/src/lang/it.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configurato — le decodifiche WSJT-X appariranno in OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configurazione in corso...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Relay Cloud", + "station.settings.rigBridge.readme.body": "Rig Bridge richiede software locale e una configurazione attenta. Consulta la guida di configurazione completa prima di abilitare:", + "station.settings.rigBridge.readme.heading": "Leggi il README prima della configurazione", + "station.settings.rigBridge.readme.link": "README di rig-bridge su GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Sotto l'orizzonte", diff --git a/src/lang/ja.json b/src/lang/ja.json index ee2fd582..1409b4a3 100644 --- a/src/lang/ja.json +++ b/src/lang/ja.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "リレーが設定されました — WSJT-XデコードがOpenHamClockに表示されます", "station.settings.rigControl.wsjtxRelay.status.pushing": "設定中...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X リレー", + "station.settings.rigBridge.alpha": "アルファ", + "station.settings.rigBridge.cloudRelay.title": "クラウドリレー", + "station.settings.rigBridge.readme.body": "Rig Bridgeにはローカルソフトウェアと慎重な設定が必要です。有効にする前に完全なセットアップガイドを確認してください:", + "station.settings.rigBridge.readme.heading": "設定前にREADMEをお読みください", + "station.settings.rigBridge.readme.link": "GitHubのrig-bridge README", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "地平線下", diff --git a/src/lang/ka.json b/src/lang/ka.json index f299522c..9e33ed45 100644 --- a/src/lang/ka.json +++ b/src/lang/ka.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay კონფიგურირებულია — WSJT-X დეკოდირებები გამოჩნდება OpenHamClock-ში", "station.settings.rigControl.wsjtxRelay.status.pushing": "კონფიგურაცია...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "ალფა", + "station.settings.rigBridge.cloudRelay.title": "ღრუბლოვანი რელე", + "station.settings.rigBridge.readme.body": "Rig Bridge-ს სჭირდება ლოკალური პროგრამული უზრუნველყოფა და ფრთხილი კონფიგურაცია. გააქტიურებამდე გადახედეთ სრულ დაყენების სახელმძღვანელოს:", + "station.settings.rigBridge.readme.heading": "გამართვამდე წაიკითხეთ README", + "station.settings.rigBridge.readme.link": "rig-bridge README GitHub-ზე", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "ჰორიზონტის ქვემოთ", diff --git a/src/lang/ko.json b/src/lang/ko.json index 9be2da0e..405af932 100644 --- a/src/lang/ko.json +++ b/src/lang/ko.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "릴레이 구성 완료 — WSJT-X 디코드가 OpenHamClock에 표시됩니다", "station.settings.rigControl.wsjtxRelay.status.pushing": "구성 중...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X 릴레이", + "station.settings.rigBridge.alpha": "알파", + "station.settings.rigBridge.cloudRelay.title": "클라우드 릴레이", + "station.settings.rigBridge.readme.body": "Rig Bridge는 로컬 소프트웨어와 신중한 설정이 필요합니다. 활성화하기 전에 전체 설정 가이드를 검토하세요:", + "station.settings.rigBridge.readme.heading": "설정 전 README를 읽어주세요", + "station.settings.rigBridge.readme.link": "GitHub의 rig-bridge README", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "수평선 아래", diff --git a/src/lang/ms.json b/src/lang/ms.json index 40937110..5ae6346c 100644 --- a/src/lang/ms.json +++ b/src/lang/ms.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay dikonfigurasi — penyahkodan WSJT-X akan muncul dalam OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Mengkonfigurasi...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alfa", + "station.settings.rigBridge.cloudRelay.title": "Geganti Awan", + "station.settings.rigBridge.readme.body": "Rig Bridge memerlukan perisian tempatan dan konfigurasi yang teliti. Semak panduan persediaan penuh sebelum mengaktifkan:", + "station.settings.rigBridge.readme.heading": "Baca README sebelum persediaan", + "station.settings.rigBridge.readme.link": "README rig-bridge di GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Di bawah ufuk", diff --git a/src/lang/nl.json b/src/lang/nl.json index a8b69ec7..a89846bb 100644 --- a/src/lang/nl.json +++ b/src/lang/nl.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay geconfigureerd — WSJT-X decodeeringen verschijnen in OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configureren...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Cloud-relay", + "station.settings.rigBridge.readme.body": "Rig Bridge vereist lokale software en zorgvuldige configuratie. Lees de volledige installatiegids voordat u activeert:", + "station.settings.rigBridge.readme.heading": "Lees de README vóór de installatie", + "station.settings.rigBridge.readme.link": "rig-bridge README op GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Onder de horizon", diff --git a/src/lang/pt.json b/src/lang/pt.json index 4e3911c6..c33f5241 100644 --- a/src/lang/pt.json +++ b/src/lang/pt.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configurado — as decodificações WSJT-X aparecerão no OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "A configurar...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "Alpha", + "station.settings.rigBridge.cloudRelay.title": "Retransmissão em nuvem", + "station.settings.rigBridge.readme.body": "O Rig Bridge requer software local e configuração cuidadosa. Revise o guia de configuração completo antes de ativar:", + "station.settings.rigBridge.readme.heading": "Leia o README antes de configurar", + "station.settings.rigBridge.readme.link": "README do rig-bridge no GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Abaixo do horizonte", diff --git a/src/lang/ru.json b/src/lang/ru.json index 815178a5..46339835 100644 --- a/src/lang/ru.json +++ b/src/lang/ru.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Ретранслятор настроен — декодирования WSJT-X будут отображаться в OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Настройка...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Ретранслятор", + "station.settings.rigBridge.alpha": "Альфа", + "station.settings.rigBridge.cloudRelay.title": "Облачный ретранслятор", + "station.settings.rigBridge.readme.body": "Rig Bridge требует локального программного обеспечения и тщательной настройки. Ознакомьтесь с полным руководством по настройке перед включением:", + "station.settings.rigBridge.readme.heading": "Прочитайте README перед настройкой", + "station.settings.rigBridge.readme.link": "README rig-bridge на GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "За горизонтом", diff --git a/src/lang/sl.json b/src/lang/sl.json index 9fbe60e5..642af35b 100644 --- a/src/lang/sl.json +++ b/src/lang/sl.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Posredovanje nastavljeno — dekodiranja WSJT-X se bodo prikazala v OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Nastavljanje...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Posredovanje", + "station.settings.rigBridge.alpha": "Alfa", + "station.settings.rigBridge.cloudRelay.title": "Oblačno posredovanje", + "station.settings.rigBridge.readme.body": "Rig Bridge zahteva lokalno programsko opremo in skrbno konfiguracijo. Preglejte celoten vodič za namestitev pred aktivacijo:", + "station.settings.rigBridge.readme.heading": "Preberite README pred nastavitvijo", + "station.settings.rigBridge.readme.link": "README za rig-bridge na GitHub", "station.settings.satellites.altitude": "Altitude", "station.settings.satellites.azimuth_elevation": "Az/El", "station.settings.satellites.belowHorizon": "Pod obzorjem", diff --git a/src/lang/th.json b/src/lang/th.json index 27224e15..0620caf3 100644 --- a/src/lang/th.json +++ b/src/lang/th.json @@ -390,6 +390,11 @@ "station.settings.rigControl.wsjtxRelay.status.ok": "Relay configured — WSJT-X decodes will appear in OpenHamClock", "station.settings.rigControl.wsjtxRelay.status.pushing": "Configuring...", "station.settings.rigControl.wsjtxRelay.title": "WSJT-X Relay", + "station.settings.rigBridge.alpha": "อัลฟา", + "station.settings.rigBridge.cloudRelay.title": "คลาวด์รีเลย์", + "station.settings.rigBridge.readme.body": "Rig Bridge ต้องการซอฟต์แวร์ภายในเครื่องและการกำหนดค่าอย่างระมัดระวัง โปรดอ่านคู่มือการตั้งค่าฉบับสมบูรณ์ก่อนเปิดใช้งาน:", + "station.settings.rigBridge.readme.heading": "อ่าน README ก่อนตั้งค่า", + "station.settings.rigBridge.readme.link": "README ของ rig-bridge บน GitHub", "station.settings.satellites.altitude": "ความสูง", "station.settings.satellites.azimuth_elevation": "ทิศทาง/มุมเงย", "station.settings.satellites.belowHorizon": "ต่ำกว่าขอบฟ้า", From 5e8e565fbb1e9277814eb12e67bd2605de4a07a5 Mon Sep 17 00:00:00 2001 From: ceotjoe Date: Mon, 6 Apr 2026 10:38:30 +0200 Subject: [PATCH 03/14] Add Alpha/Beta maturity badges to rig-bridge plugin UI - PLUGIN_DEFS entries gain a maturity field: alpha for MSHV, JTDX, JS8Call, Rotator, Winlink, Cloud Relay; beta for APRS TNC - maturityBadge() helper renders an inline colored badge span (amber #f59e0b for Alpha, cyan #06b6d4 for Beta) consistent with the OHC settings UI accent colors - WSJT-X tab button gets an inline Beta badge matching the same style - renderPlugins() calls maturityBadge(plugin.maturity) in the card header Co-Authored-By: Claude Sonnet 4.6 --- rig-bridge/core/server.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/rig-bridge/core/server.js b/rig-bridge/core/server.js index b9f5dd51..899c8fcf 100644 --- a/rig-bridge/core/server.js +++ b/rig-bridge/core/server.js @@ -517,7 +517,7 @@ function buildSetupHtml(version, firstRunToken = null) {
- +
@@ -953,19 +953,19 @@ function buildSetupHtml(version, firstRunToken = null) { // ── Plugin Manager ──────────────────────────────────────────────────── const PLUGIN_DEFS = [ - { key: 'mshv', name: 'MSHV', desc: 'Multi-stream digital mode software (MSK144, Q65, etc.)', fields: [ + { key: 'mshv', name: 'MSHV', maturity: 'alpha', desc: 'Multi-stream digital mode software (MSK144, Q65, etc.)', fields: [ { id: 'udpPort', label: 'UDP Port', type: 'number', default: 2239 }, { id: 'verbose', label: 'Verbose logging', type: 'checkbox', default: false }, ]}, - { key: 'jtdx', name: 'JTDX', desc: 'Enhanced JT65/JT9/FT8 decoding (WSJT-X fork)', fields: [ + { key: 'jtdx', name: 'JTDX', maturity: 'alpha', desc: 'Enhanced JT65/JT9/FT8 decoding (WSJT-X fork)', fields: [ { id: 'udpPort', label: 'UDP Port', type: 'number', default: 2238 }, { id: 'verbose', label: 'Verbose logging', type: 'checkbox', default: false }, ]}, - { key: 'js8call', name: 'JS8Call', desc: 'JS8 messaging protocol for keyboard-to-keyboard QSOs', fields: [ + { key: 'js8call', name: 'JS8Call', maturity: 'alpha', desc: 'JS8 messaging protocol for keyboard-to-keyboard QSOs', fields: [ { id: 'udpPort', label: 'UDP Port', type: 'number', default: 2242 }, { id: 'verbose', label: 'Verbose logging', type: 'checkbox', default: false }, ]}, - { key: 'aprs', name: 'APRS TNC', desc: 'Local APRS via Direwolf or hardware TNC (KISS protocol)', fields: [ + { key: 'aprs', name: 'APRS TNC', maturity: 'beta', desc: 'Local APRS via Direwolf or hardware TNC (KISS protocol)', fields: [ { id: 'protocol', label: 'Protocol', type: 'select', options: ['kiss-tcp', 'kiss-serial'], default: 'kiss-tcp' }, { id: 'host', label: 'TNC Host', type: 'text', default: '127.0.0.1' }, { id: 'port', label: 'TNC Port', type: 'number', default: 8001 }, @@ -974,18 +974,18 @@ function buildSetupHtml(version, firstRunToken = null) { { id: 'beaconInterval', label: 'Beacon Interval (sec)', type: 'number', default: 600 }, { id: 'verbose', label: 'Verbose logging', type: 'checkbox', default: false }, ]}, - { key: 'rotator', name: 'Rotator (rotctld)', desc: 'Antenna rotator control via Hamlib rotctld', fields: [ + { key: 'rotator', name: 'Rotator (rotctld)', maturity: 'alpha', desc: 'Antenna rotator control via Hamlib rotctld', fields: [ { id: 'host', label: 'rotctld Host', type: 'text', default: '127.0.0.1' }, { id: 'port', label: 'rotctld Port', type: 'number', default: 4533 }, { id: 'pollInterval', label: 'Poll Interval (ms)', type: 'number', default: 1000 }, ]}, - { key: 'winlink', name: 'Winlink', desc: 'Gateway discovery + Pat client for Winlink messaging', fields: [ + { key: 'winlink', name: 'Winlink', maturity: 'alpha', desc: 'Gateway discovery + Pat client for Winlink messaging', fields: [ { id: 'apiKey', label: 'Winlink API Key', type: 'text', default: '' }, { id: 'pat.enabled', label: 'Enable Pat Client', type: 'checkbox', default: false }, { id: 'pat.host', label: 'Pat Host', type: 'text', default: '127.0.0.1' }, { id: 'pat.port', label: 'Pat Port', type: 'number', default: 8080 }, ]}, - { key: 'cloudRelay', name: 'Cloud Relay', desc: 'Proxy rig features to cloud-hosted OpenHamClock', fields: [ + { key: 'cloudRelay', name: 'Cloud Relay', maturity: 'alpha', desc: 'Proxy rig features to cloud-hosted OpenHamClock', fields: [ { id: 'url', label: 'OHC Server URL', type: 'text', default: '' }, { id: 'apiKey', label: 'Relay API Key', type: 'text', default: '' }, { id: 'session', label: 'Session ID', type: 'text', default: '' }, @@ -994,6 +994,16 @@ function buildSetupHtml(version, firstRunToken = null) { ]}, ]; + function maturityBadge(level) { + if (!level) return ''; + const color = level === 'alpha' ? '#f59e0b' : '#06b6d4'; + const label = level === 'alpha' ? 'Alpha' : 'Beta'; + return '' + + label + ''; + } + function renderPlugins(cfg) { const container = document.getElementById('pluginList'); container.innerHTML = ''; @@ -1007,7 +1017,7 @@ function buildSetupHtml(version, firstRunToken = null) { card.innerHTML = '
' + '
' + - '' + plugin.name + '' + + '' + plugin.name + maturityBadge(plugin.maturity) + '' + '
' + plugin.desc + '
' + '
' + '
@@ -1258,8 +1264,17 @@ function buildSetupHtml(version, firstRunToken = null) { } const overlay = document.getElementById('loginOverlay'); const logoutArea = document.getElementById('logoutArea'); + const headerTokenArea = document.getElementById('headerTokenArea'); + const headerToken = document.getElementById('headerToken'); if (overlay) overlay.style.display = 'none'; if (logoutArea) logoutArea.style.display = 'block'; + if (token && headerToken) { + headerToken.value = token; + headerToken.type = 'password'; + const toggle = document.getElementById('headerTokenToggle'); + if (toggle) toggle.textContent = 'Show'; + } + if (headerTokenArea) headerTokenArea.style.display = token ? 'flex' : 'none'; loadApp(); } @@ -1346,6 +1361,26 @@ function buildSetupHtml(version, firstRunToken = null) { showToast('✅ Token copied!', 'success'); } + function copyHeaderToken() { + const inp = document.getElementById('headerToken'); + if (!inp) return; + const prev = inp.type; + inp.type = 'text'; + inp.select(); + try { document.execCommand('copy'); } catch (e) {} + inp.type = prev; + showToast('✅ Token copied!', 'success'); + } + + function toggleHeaderToken() { + const inp = document.getElementById('headerToken'); + const btn = document.getElementById('headerTokenToggle'); + if (!inp) return; + const showing = inp.type === 'text'; + inp.type = showing ? 'password' : 'text'; + if (btn) btn.textContent = showing ? 'Show' : 'Hide'; + } + async function dismissBanner() { await fetch('/api/setup/token-seen', { method: 'POST', headers: authHeaders() }).catch(() => {}); const banner = document.getElementById('welcomeBanner'); From ff5f564ebad506a67e83a09f73c23115b30eb96c Mon Sep 17 00:00:00 2001 From: ceotjoe Date: Mon, 6 Apr 2026 10:43:19 +0200 Subject: [PATCH 05/14] Fix API token field width in rig-bridge header Replace fixed 160px width with flex:1 so the token input stretches to fill available space and the full 32-char hex token is visible. Co-Authored-By: Claude Sonnet 4.6 --- rig-bridge/core/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rig-bridge/core/server.js b/rig-bridge/core/server.js index ece922e0..878a5f21 100644 --- a/rig-bridge/core/server.js +++ b/rig-bridge/core/server.js @@ -503,7 +503,7 @@ function buildSetupHtml(version, firstRunToken = null) {