Welcome to the FlexRadio Community! Please review the new Community Rules and other important new Community information on the Message Board.
How to Receive Technical Support::
If you are needing assistance with FlexRadio products, please refer to the product documentation or check the Help Center for known solutions. Need technical support from FlexRadio? It's as simple as creating a HelpDesk ticket.

SolidSDR: Web-based FlexRadio client (open source, cross-platform)

daveisadork
daveisadork Member
edited May 12 in Third-Party Software
Hey folks!

For about the past year, I've been working on a cross-platform FlexRadio client that runs in a web browser that I'm calling SolidSDR. My goal was to be able to use my radio from basically any device that can run a web browser. I'm shooting for as close as I can get to feature parity with SmartSDR, and I've made some great progress, especially so far this year. Although it's far from complete, I've been enjoying using it for several months and decided it was time to get some other people testing it.

I'm providing builds for Mac/Linux/Windows, and the server can run on just about anything, the resource requirements are very low, it just needs a good network connection. The easiest way to try it out is to go to the GitHub page, download the build your platform, run the server and just navigate to http://localhost:8080. There are more detailed instructions on the GitHub page.

Many, many things are working today, including DAX of a sort... you can pass DAX streams through any audio devices that are visible to your web browser. Latency is surprisingly good, and I've been very successful using FT8/FT4/FT2 this way with VB Audio Cable on an M1 Mac.

The usual warnings apply, of course. I've only been able to test this with my radio, so you may run into some problems that I haven't been able to anticipate. If you do, please let me know. I can't promise it will work on firmwares other than the 4.x series. There are some... caveats due to this not being a "native" app, but I'll discuss more of those in a follow-up post, along with some more information about the project.

GitHub: https://github.com/daveisadork/solid-sdr

Comments

  • daveisadork
    daveisadork Member
    SolidSDR works as a server which bridges the connection to the radio over WebRTC (the same technology that powers things like Google Meet), and a web application that uses that to talk to the radio. As it turns out, WebRTC works *extremely* well for the type of network communication one needs to have with a FlexRadio, but it's not without drawbacks. The biggest one is that it requires HTTPS. If you're running solid-sdr-server on the same machine you're using to connect to it (i.e. you're accessing it through http://localhost:8080), then you'll be able to use it no problem.

    However, if you want to access it from a different computer, or over the internet, then you'll have to find a way to make that connection happen over HTTPS. Hopefully in the future I can find a way to make setting that up relatively painless, but for now the best advice I can give you is to try something that can do automatic HTTPS like Caddy (https://caddyserver.com/docs/automatic-https). If you want to access it over the internet, you'll also need to forward UDP port 50313 to solid-sdr-server for the WebRTC connection.

    The other annoying drawback of browser security is that with the current model, there's no way to implement support for SmartLink. But, it wouldn't really make sense to use it with something like SolidSDR anyway... you'd run the solid-sdr-server on the same network as your radio, and then connect to it over the internet directly rather than using SmartLink. The big exception would be if your ISP uses CGNAT or something that prevents you from opening ports up to the internet.

    While we're on the subject of limitations, the other big one is that there isn't a way to do CAT or VSP through just a web browser. We may have a way to work around some of these things in the future by packaging SolidSDR up as a desktop app, but I don't have any immediate plans for that yet.

    Most of the command/control, configuration, audio, etc is working today. Some of the remaining things that aren't yet implemented but should be possible include:

    - FlexControl. I don't have one so I can't really test it... we do have *excellent* support for MIDI controllers, though.
    - DAX IQ. I just haven't found a use-case to be able to test it. I suspect it'll be finicky due to the high sample rates involved and the lack of direct control over audio hardware we get with a web browser, but it might work.
    - TGXL/PGXL/etc there shouldn't be any reason these can't be supported, I just don't have access to units to develop against
    - CWX and DVK I just haven't got around to yet
    - Same with USB cables
    - Waveform/WFP, RapidM, etc I haven't looked at yet. I don't even know if my radio supports them.
    - Multiple panadapters technically works, but the UX is not great. If you are someone that makes heavy use of that feature, I'd be interested to hear how you use it.
  • daveisadork
    daveisadork Member
    v0.1.1 is out with a waveform manager, better handling of FDV modes, and a new modal for viewing all available meters.
  • daveisadork
    daveisadork Member
    edited May 14
    SolidSDR v0.1.2 is out!

    https://github.com/daveisadork/solid-sdr/releases/tag/v0.1.2

    - Adds a new Profile Manager Dialog

    - Adds a new Profiles section in the panafall context menu for saving, creating, or selecting global profiles. The panafall context menu is accessed by right clicking (or long-pressing on touch devices) in the panadapter or waterfall.

    - Adds dropdown menus next to the TX and Mic profile selections in the radio sidebar for profile management, along with a new indicator when a profile has unsaved changes.
  • Gord-VA7GP
    Gord-VA7GP Member ✭✭✭

    Thank you for your effort on this, Dave (?). I've often thought that FlexRadios ought to have implemented and included a web-interface for operating, in addition to the API. My printers have had this feature (web-management-interface) for decades 😁

    I've got a lot on my plate right now, but I'm keeping a close eye on your GitHub, and also reading here.

    At this moment, my basic idea (for August time-frame) is to spin up a Debian virtual-machine (alongside the 7 others on my Gentoo host), just to host your solid-sdr. This'll make sure things are as un-complicated and de-coupled as possible. For remote access, I already have an HTTPS proxy/reverse proxy (using Apache), with both LDAP-backed authentication / authourization. . . so I am comfortable that I have a great foundation for secure webRTC interaction with my Flex 6400.

  • daveisadork
    daveisadork Member
    That was my thinking as well :D I chose the MIT license intentionally in case someone ever felt like including this or something like it in the radio firmware (wink wink, nudge nudge).

    >I already have an HTTPS proxy/reverse proxy (using Apache), with both LDAP-backed authentication / authourization. . . so I am comfortable that I have a great foundation for secure webRTC interaction with my Flex 6400.

    Yeah, that will work great. I'm doing something similar (Docker+nginx for TLS termination). When you set up your port forwarding, you need 8080 or whatever you use for the HTTP server as well as UDP 50313 for WebRTC. Let me know how it goes when you try it out!
  • tickly
    tickly Member ✭✭

    Hi Dave, thanks for producing this program. I've always wanted to be able to operate my Flex radio via a web browser on my local network.

    I've successfully used it on the local machine running SolidSDR. The next task is to get it working over my local network. I've downloaded Caddy, and started reading up on its tutorial. From what I can understand, I just need to create a file called Caddyfile and add the IP address of the machine I'm running SolidSDR on. I think that's all I need to do?

    I'll let you know how I get on.

    Regards,

    Ian G4ZJH.

  • daveisadork
    daveisadork Member
    edited 12:22AM
    Yeah, ideally you'd just run Caddy on the same machine as the server. You just need the hostname/domain name you'll use to access it. For example, my laptop's hostname is "MacBook-Pro" and other machines on my network can access it as "macbook-pro.local" so all that's needed in the Caddyfile is something like this:

    macbook-pro.local {
    reverse_proxy localhost:8080
    }

    Then other machines can go to https://macbook-pro.local which will probably give you a warning about the self-signed certificate, but if you continue on everything should work.

    Good luck!

    Dave KF0SMY
  • tickly
    tickly Member ✭✭

    I think i'm nearly there… Installed both SolidSDR and Caddy on my Debian machine. Caddy seems to run fine, but on another pc's web browser I don't get the radio display. I think the server isn't running properly. This is its output when I run it:

    ian@debian:~/Desktop/solid-sdr-server_0.1.2_linux_amd64$ ./solid-sdr-server  
    2026/05/15 11:54:15 [config] http=:8080 static="" ice=50313..50313 api-log="messages.txt" file=""
    2026/05/15 11:54:15 [rtc] failed to create UDP mux on port 50313: listen udp 192.168.1.136:50313: bind: address already in use

    I think Caddy is running, as on another pc, when I enter debian.local:8080 I get a black web page with a test box in the middle stating its 'initializing' - Websocket is established, but for WebRTC the connection state: is connecting. The web page title says 'SolidSDR'.

    I'm sure my issue is a typo, or that I just don't know enough Linux to see where the problem is!

    The server must be running as I can see the radio display on the web browser of the machine running the server when I just type in localhost:8080.

    Maybe I'll just wait until this issue of serving the webpage via https is resolved in a later release - as for my use case, I would like to access the radio on machines other than the local one.

    Anyway, thanks again for bringing this to fruition - I'm sure I will solve this issue eventually!

    Regards,

    Ian G4ZJH.

  • tickly
    tickly Member ✭✭

    This is a screen shot of the web page I see on other PC's on my local network:

    Ian G4ZJH.

    Screenshot 2026-05-15 at 12.16.54.png
  • daveisadork
    daveisadork Member
    edited 2:52PM
    It sounds like you already have an instance of solid-sdr-server running (otherwise you wouldn't get anything from http://debian.local:8080), and it's just failing to start up a second copy because the port is already being used. If you have Caddy running, you should be able to get to it at https://debian.local (without the :8080, as that will just hit solid-sdr-server directly and not go through Caddy).
  • daveisadork
    daveisadork Member
    SolidSDR v0.1.3 is released!

    https://github.com/daveisadork/solid-sdr/releases/tag/v0.1.3

    New in this release is the import/export dialog for backing up and restoring radio data.
  • tickly
    tickly Member ✭✭
    edited 3:17PM

    Right, I've rebooted my Debian box, and checked both caddy and Solid SDR are running without errors.

    On this same machine I can access the radio going to localhost:8080.

    Typing in http://debian.local:8080 on another pc gives me this result:

    Screenshot 2026-05-15 at 16.05.25.png

    Typing in https://debian.local:8080 returns this screen:

    Screenshot 2026-05-15 at 16.07.08.png

    https://debian.local also returns the same screen as above.

    I'm at a loss to know what to do next, so unless I discover my error, I'll just have to accept this won't be working for me until you add a way to make serving the page as a https:// built-in, unless anyone out there has managed to get this working for them….I would love to know how you did it!

    Regards,

    Ian G4ZJH.

  • daveisadork
    daveisadork Member
    Don't use the :8080, just https://debian.local
  • tickly
    tickly Member ✭✭

    unfortunately typing in https://debian.local still returns the same message as https://debian.local:8080

    Like I said, I’ll just wait until you have come up with a built-in solution to make this work, or someone else who has made this work, might share their knowledge on this forum.

    Ian G4ZJH

  • daveisadork
    daveisadork Member
    Sorry, I missed that you tried that in your last message. I think you’re close, is caddy running on your Debian machine? Can you share your caddyfile and the terminal output when you run caddy?
  • tickly
    tickly Member ✭✭

    Caddy is running on my debian pc, along with Solid SDR.

    The caddyfile I'm using is:

    debian.local {

    reverse_proxy localhost:8080

    }

    The terminal output when I start caddy is:

    ian@debian:~$ caddy start
    2026/05/15 15:48:52.342 INFO    maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined
    2026/05/15 15:48:52.342 INFO    GOMEMLIMIT is updated   {"GOMEMLIMIT": 26274926592, "previous": 92233720368547
    75807}
    2026/05/15 15:48:52.343 INFO    admin   admin endpoint started  {"address": "localhost:2019", "enforce_origin"
    : false, "origins": ["//localhost:2019", "//[::1]:2019", "//127.0.0.1:2019"]}
    2026/05/15 15:48:52.343 INFO    serving initial configuration
    Successfully started Caddy (pid=37238) - Caddy is running in the background
    ian@debian:~$

    Ian G4ZJH.

  • daveisadork
    daveisadork Member
    Your caddyfile looks correct, but I think caddy isn’t using it. You may need to explicitly give it the path with:

    caddy start --config /path/to/caddyfile
  • tickly
    tickly Member ✭✭

    Oh dear…

    Now caddy exits with error:

    an@debian:~$ caddy start --config /etc/caddy/Caddyfile
    2026/05/15 18:19:21.201 INFO    maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined
    2026/05/15 18:19:21.201 INFO    GOMEMLIMIT is updated   {"GOMEMLIMIT": 26274926592, "previous": 9223372036854775807}
    2026/05/15 18:19:21.201 INFO    using config from file  {"file": "/etc/caddy/Caddyfile"}
    2026/05/15 18:19:21.201 INFO    adapted config to JSON  {"adapter": "caddyfile"}
    2026/05/15 18:19:21.201 WARN    Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies  {"adapter": "caddyfile", "file": "/etc/caddy/Ca
    ddyfile", "line": 12}
    2026/05/15 18:19:21.202 INFO    admin   admin endpoint started  {"address": "localhost:2019", "enforce_origin": false, "origins": ["//[::1]:2019", "//127.0.0.1:2019"
    , "//localhost:2019"]}
    2026/05/15 18:19:21.202 INFO    http.auto_https server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS       {"serve
    r_name": "srv0", "https_port": 443}
    2026/05/15 18:19:21.202 INFO    http.auto_https enabling automatic HTTP->HTTPS redirects        {"server_name": "srv0"}
    2026/05/15 18:19:21.203 INFO    tls.cache.maintenance   started background certificate maintenance      {"cache": "0x2ac184121c00"}
    2026/05/15 18:19:21.227 WARN    pki.ca.local    installing root certificate (you might be prompted for password)      {"path": "storage:pki/authorities/local/root.cr
    t"}
    2026/05/15 18:19:21.227 INFO    warning: "certutil" is not available, install "certutil" with "apt install libnss3-tools" or "yum install nss-tools" and try again
    2026/05/15 18:19:21.227 INFO    define JAVA_HOME environment variable to use the Java trust
    [sudo] password for ian:  
    2026/05/15 18:19:39.458 INFO    certificate installed properly in linux trusts
    2026/05/15 18:19:39.460 INFO    http    servers shutting down with eternal grace period
    2026/05/15 18:19:39.460 INFO    tls.cache.maintenance   stopped background certificate maintenance      {"cache": "0x2ac184121c00"}
    Error: loading initial config: loading new config: http app module: start: listening on :443: listen tcp :443: bind: permission denied
    Error: caddy process exited with error: exit status 1
    ian@debian:~$

    This seems to be going from bad to worse!

    Where does caddy reside on my machine? Perhaps I should copy the Caddyfile to that location.

  • daveisadork
    daveisadork Member
    That looks better! You may just need to run with sudo:

    sudo caddy start --config /etc/caddy/Caddyfile
  • tickly
    tickly Member ✭✭

    Caddy now runs using sudo at the start:

    ian@debian:~$ sudo caddy start --config /etc/caddy/Caddyfile
    [sudo] password for ian:  
    2026/05/15 18:55:01.709 INFO    maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined
    2026/05/15 18:55:01.709 INFO    GOMEMLIMIT is updated   {"GOMEMLIMIT": 26274926592, "previous": 9223372036854775807}
    2026/05/15 18:55:01.709 INFO    using config from file  {"file": "/etc/caddy/Caddyfile"}
    2026/05/15 18:55:01.709 INFO    adapted config to JSON  {"adapter": "caddyfile"}
    2026/05/15 18:55:01.709 WARN    Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies    {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 12}
    2026/05/15 18:55:01.710 INFO    admin   admin endpoint started  {"address": "localhost:2019", "enforce_origin": false, "origins": ["//localhost:2019", "//[::1]:2019", "//127.0.0.1:2019"]}
    2026/05/15 18:55:01.710 INFO    http.auto_https server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {"server_name": "srv0", "https_port": 443}
    2026/05/15 18:55:01.710 INFO    http.auto_https enabling automatic HTTP->HTTPS redirects        {"server_name": "srv0"}
    2026/05/15 18:55:01.710 INFO    tls.cache.maintenance   started background certificate maintenance      {"cache": "0x1bae0fd96d80"}
    2026/05/15 18:55:01.733 WARN    pki.ca.local    installing root certificate (you might be prompted for password)        {"path": "storage:pki/authorities/local/root.crt"}
    2026/05/15 18:55:01.733 INFO    warning: "certutil" is not available, install "certutil" with "apt install libnss3-tools" or "yum install nss-tools" and try again
    2026/05/15 18:55:01.733 INFO    define JAVA_HOME environment variable to use the Java trust
    2026/05/15 18:55:02.905 INFO    certificate installed properly in linux trusts
    2026/05/15 18:55:02.905 INFO    http    enabling HTTP/3 listener        {"addr": ":443"}
    2026/05/15 18:55:02.905 INFO    http.log        server running  {"name": "srv0", "protocols": ["h1", "h2", "h3"]}
    2026/05/15 18:55:02.905 WARN    http    HTTP/2 skipped because it requires TLS  {"network": "tcp", "addr": ":80"}
    2026/05/15 18:55:02.905 WARN    http    HTTP/3 skipped because it requires TLS  {"network": "tcp", "addr": ":80"}
    2026/05/15 18:55:02.905 INFO    http.log        server running  {"name": "remaining_auto_https_redirects", "protocols": ["h1", "h2", "h3"]}
    2026/05/15 18:55:02.905 INFO    http    enabling automatic TLS certificate management   {"domains": ["debian.local"]}
    2026/05/15 18:55:02.905 INFO    autosaved config (load with --resume flag)      {"file": "/root/.config/caddy/autosave.json"}
    2026/05/15 18:55:02.905 INFO    serving initial configuration
    Successfully started Caddy (pid=86637) - Caddy is running in the background
    2026/05/15 18:55:02.907 INFO    tls.obtain      acquiring lock  {"identifier": "debian.local"}
    ian@debian:~$

    However the web browser on another pc now reports it can't reach the page, saying debian.local server IP address cannot be found. (ERR_NAME_NOT_RESOLVED).

    I've also tried installing both SolidSDR and Caddy on a windows pc with very similar results, so it must be be doing something wrong. I wish I understood this program Caddy, and the whole concept of configuring it to turn your webservice into a https:// site.

    Its been much appreciated Dave you helping me on this, but I feel I'm taking up too much of your time when you could be improving the program, so I'll understand if you want to finish helping me - like i've already said, I can wait until this issue of providing a https:// webpage is made easier, as I'm sure when it is a lot more people will want to use it.

    73 Ian G4ZJH.

Leave a Comment

Rich Text Editor. To edit a paragraph's style, hit tab to get to the paragraph menu. From there you will be able to pick one style. Nothing defaults to paragraph. An inline formatting menu will show up when you select text. Hit tab to get into that menu. Some elements, such as rich link embeds, images, loading indicators, and error messages may get inserted into the editor. You may navigate to these using the arrow keys inside of the editor and delete them with the delete or backspace key.