SmartUnlinkPro icon

# SmartUnlinkPro Make remote FlexRadios discoverable over a routed VPN, with installers for macOS, Windows and Linux. SmartUnlinkPro checks each configured radio and advertises it on your local network only while it is reachable. Install it on the computer that connects to your VPN. It runs in the background after you close its window. This project is a fork of [Brian Bruff’s SmartUnlink](https://github.com/brianbruff/SmartUnlink). It retains compatibility with SmartUnlink configuration files and adds live radio identity checks, background startup and native macOS / Qt desktop interfaces. The original Electron application is preserved in [legacy](legacy), along with its Git history. ## Download version 1.0.0 Download an installer from [Releases](https://github.com/debods/SmartUnlinkPro/releases/latest). | Platform | Installer | Requirements | | --- | --- | --- | | macOS | `SmartUnlinkPro-1.0.0-macOS-signed.pkg` | Apple Silicon; macOS 13 or later | | Windows | `SmartUnlinkPro-1.0.0-Windows11-x64.msi` | Windows 11; x64 application runtime | | Linux | `SmartUnlinkPro-1.0.0-Trixie-all.deb` | Debian 13 (Trixie), graphical desktop and systemd user session | The Linux package is architecture-independent and uses Debian's Python/Qt packages. It has been tested on x86-64 Trixie; ARM Linux has not been tested. Windows testing used a Windows 11 Parallels VM on Apple Silicon. macOS testing used Apple Silicon. Club testing used FLEX-6400 and FLEX-6600 radios, SmartSDR, AetherSDR and a Maestro; this is not a compatibility guarantee for every model or client version. The macOS installer is Developer ID signed and notarized by Apple. The Windows installer is not Microsoft Authenticode signed and may display an unverified-publisher warning. Verify the download source and use the release's SHA256SUMS.txt if needed. ## Before installation You need a working VPN connection and the radio's **private IP address**. The VPN must permit communication with the radio, including its TCP control connection on port 4992 and the UDP traffic used by your SDR client. Finding a radio and connecting to it are separate steps. SmartUnlinkPro supplies local discovery announcements; it does **not** create a VPN, configure routing, forward radio traffic or share a computer's VPN with other devices. A Maestro or another computer on your LAN must have its own working route to the radio addresses. Seeing a radio in its list does not, by itself, prove that route exists. Stop the original SmartUnlink broadcaster if you are replacing it, to avoid duplicate announcements. ## Installation ### macOS 1. Download and open `SmartUnlinkPro-1.0.0-macOS-signed.pkg`. 2. Follow the installer prompts. An administrator password may be required to install into Applications. 3. Open **SmartUnlinkPro** from **Applications** or Spotlight. 4. Connect your VPN, then follow **Add radios and enable discovery** below. No Node.js, npm, Python installation or Automator launcher is needed. ### Windows 11 1. Download `SmartUnlinkPro-1.0.0-Windows11-x64.msi` to Windows. 2. Double-click it and let Windows Installer complete. 3. Open **SmartUnlinkPro** from the **Start menu**. 4. Connect your VPN, then follow **Add radios and enable discovery** below. The app installs for your Windows account and includes its runtime. A separate Python installation is not needed. If Windows Firewall asks about network access, use the network profile appropriate to your trusted LAN. ### Debian 13 (Trixie) 1. Download `SmartUnlinkPro-1.0.0-Trixie-all.deb`. 2. Open a terminal in the download folder and run: ```sh sudo apt install ./SmartUnlinkPro-1.0.0-Trixie-all.deb ``` APT installs the required Python, PySide6 and psutil packages. 3. Open **SmartUnlinkPro** from your applications menu, or run `SmartUnlinkPro` in a terminal. 4. Connect your VPN, then follow the steps below. ## Add radios and enable discovery 1. Connect the VPN **on the computer running SmartUnlinkPro**. 2. Click **Add Radio**, enter the radio's private IP address and confirm. The app queries the radio for its model, serial number, callsign and firmware version. The radio must be reachable for this step. 3. Repeat for each radio. Alternatively, click **Import** and select an existing SmartUnlink `config.json`. 4. Select a radio to review its details. **Include in discovery** controls whether that radio is checked and announced. 5. Click **Enable**. This starts the background service and configures it to start when you log in. 6. Open your SDR client and look in its local radio list, such as **On This Network** in AetherSDR. Connect normally. **Enable is unavailable until at least one radio is configured.** It does not require the VPN to remain connected just to enable the service; unreachable radios are not advertised. Each radio needs its real, unique serial number. Do not assign the same placeholder serial to several radios. Changes save automatically. There is no separate Save button. ## Everyday use - **Enabled:** click to stop the service and disable automatic startup. - **Include in discovery:** include or exclude the selected radio without deleting its configuration. - **Remove Radio:** remove the selected radio from the saved configuration. - **Import:** load a SmartUnlink-format configuration. Back up your configuration before replacing it. - **Delete Config:** clear the configured radios after confirmation; takes effect immediately. - **Reload:** reload the saved configuration. - **Show Files:** open the configuration and log folder. - **Close the window:** leave the enabled service running in the background. The service queries radio information about once per second. It retries failed connections after up to about two seconds and withdraws advertisements after about three seconds without valid replies. The SDR client controls how long an old entry remains in its own list. Announcement frequency uses `broadcastIntervalMs` from your configuration, normally 3000 ms. Live client information is used where supported. SmartUnlinkPro does not reserve a radio or guarantee an available operating slot; the SDR client and radio determine whether a connection can be made. ## Updates and removal Install a newer package over the existing version. Radio configuration is stored separately from the application. Back it up using **Show Files** before an update. Use **Uninstall** in SmartUnlinkPro for complete removal. It stops the background service, removes startup registration and the app, and deletes the current user's configuration, backups and logs. This cannot be undone without your own backup. macOS or Linux may request administrator authorization. On Windows, removal is delegated to Windows Installer; the app is also listed in **Settings → Apps → Installed apps**. The service runs as the logged-in user, not as a privileged machine-wide service. ## Troubleshooting **Enable is greyed out:** add or import at least one radio first. **Add Radio cannot find the radio:** check the private IP address, VPN connection, VPN routes and firewall. Make sure your home LAN does not overlap the club's radio subnet. A working SmartLink connection uses a different discovery path and does not prove the VPN route is working. **Radios appear but cannot connect:** check routing from the actual SDR device. A VPN on a laptop does not automatically give a Maestro or another PC access through that VPN. **No local discovery:** check the service status, **Include in discovery**, and the log in **Show Files**. Local UDP broadcasts use port 4992. Guest Wi-Fi isolation, separate VLANs or host firewall rules can prevent reception. SmartUnlinkPro and the receiving client must be on a LAN where those announcements can reach the client. **A disconnected radio remains listed briefly:** allow for the service's reachability check and the SDR client's own discovery timeout. **Several network adapters:** Windows and Linux choose active IPv4 LAN adapters automatically and exclude common VPN interfaces. The macOS package defaults to `en0`. Advanced users can edit `service.json` in the data folder and restart the service: ```json {"interfaces": ["en0"], "staleSeconds": 3} ``` Use the adapter name for your system (`en0`, `Ethernet`, `enp6s0`, etc.). An empty interface list requests automatic selection. ## Configuration and logs | Platform | Data folder | Background startup | | --- | --- | --- | | macOS | `~/Library/Application Support/SmartUnlinkPro` | launchd agent `org.hamclub.SmartUnlinkPro` | | Windows | `%LOCALAPPDATA%\SmartUnlinkPro` | Current-user startup registration | | Linux | `~/.config/SmartUnlinkPro` (or `$XDG_CONFIG_HOME/SmartUnlinkPro`) | systemd user unit `SmartUnlinkPro.service` | `config.json` retains the SmartUnlink schema: `broadcastIntervalMs` and a `radios` array. Radio entries contain `name`, `ipAddress`, `model`, `serialNumber`, `callsign`, `version`, `id` and `enabled`. Unknown imported fields are retained. Use **Add Radio** to retrieve real identity values rather than inventing them. ## Source and development - `src/`: Windows/Linux Python service and Qt application. - `macos/`: native Swift application and service. - `packaging/`: installer build scripts. - `tests/`: automated tests for the shared implementation. - `legacy/`: original SmartUnlink Electron source and documentation. See [BUILDING.md](BUILDING.md) for build instructions. Installers are release assets, not committed binaries. Local radio configurations, SSH keys, credentials and service logs are not included. ## Credits and license Original SmartUnlink by [brianbruff](https://github.com/brianbruff/SmartUnlink), whose README and package metadata declare the MIT license. SmartUnlinkPro modifications are also provided under the [MIT license](LICENSE). The original attribution and source are retained in `legacy/` and Git history. Python, Qt for Python/PySide6, shiboken6 and psutil have their own licenses. Windows bundles their runtime files and notices; Debian uses system-managed packages. See [THIRD_PARTY.md](THIRD_PARTY.md). SmartUnlinkPro is not affiliated with or endorsed by FlexRadio Systems or Ubiquiti.