Pro-Grade Ham Radio Displays: Integrating OpenHamClock into PiSignage

758 words, 4 minutes read time.

A Helping Hand Needed for a Fellow Programmer

I’m reaching out to see if you can lend a hand to a talented software developer who’s currently on the job hunt. With over 30 years of experience in C#, .NET (Core/6–8), REST APIs, SQL Server, Angular/Razor, Kubernetes, and cloud CI/CD, he’s a seasoned pro with a proven track record of leading modernization projects and delivering production systems.

Some of his notable accomplishments include DB2 to SQL migrations, building real-time SignalR apps, and developing full-stack API and frontend projects. Based in Southeast Michigan, he’s looking for senior engineering, architecture, or technical lead roles that will challenge him and utilize his skills.

If you’re in a position to help, you can check out his resume and portfolio at http://charles.friasteam.com.

Let’s all look out for each other – if you know of any opportunities that might be a good fit, could you please consider passing this along to your network?

If you are a ham radio operator, you know that a HamClock is the ultimate shack companion. But what if you want to move beyond a dedicated small screen and integrate that data-rich display into a professional digital signage environment?

By using PiSignage, you can rotate your HamClock with other station metrics, weather, or club announcements. However, getting a clean, secure, and “pop-up free” experience requires a few tricks.

In this post, I’ll show you how to deploy OpenHamClock using Docker and how to strip away the UI clutter for a seamless kiosk experience.

The Setup

To follow along, you will need a PiSignage server instance. I personally run mine as a Docker container, which keeps the server stack isolated and easy to back up.

1. The Docker Compose Configuration

PiSignage and modern browsers often require secure contexts (HTTPS) for certain features. Since the standard HamClock output is HTTP, we’ll use a two-service setup: the clock itself and a lightweight SSL-wrap sidecar using socat and openssl.

docker-componse.yml

services: openhamclock: image: ghcr.io/accius/openhamclock:latest container_name: openhamclock expose: - "3000" environment: - CALLSIGN=<CALL SIGN> - LOCATOR=<Grid Square Locator> - THEME=dark - UNITS=imperial restart: unless-stopped ssl-wrap: image: alpine container_name: hamclock-ssl ports: - "3000:3000" command: > sh -c "apk add --no-cache socat openssl && openssl req -x509 -newkey rsa:2048 -keyout /tmp/key.pem -out /tmp/cert.pem -days 365 -nodes -subj '/CN=localhost' && cat /tmp/cert.pem /tmp/key.pem > /tmp/combined.pem && socat OPENSSL-LISTEN:3000,cert=/tmp/combined.pem,verify=0,fork,reuseaddr TCP:openhamclock:3000" restart: unless-stopped

2. Silencing the “What’s New” Pop-ups

When using HamClock as a signage element, you want it to be “set and forget.” The “What’s New” slide-ins are helpful for desktop users but ruin a clean kiosk display.

While there is a formal change request pending for a toggle, you can currently “force” these elements to stay hidden by injecting a bit of CSS directly into the distribution files. Run this command within your app environment:

find /app/dist -name "*.css" -exec sh -c 'echo "div[style*=\"whatsNewSlideIn\"], div[style*=\"backdrop-filter\"] { display: none !important; }" >> {}' \;

3. Setting Up the Slide in PiSignage

Once your containers are humming along, you need to tell PiSignage how to display the clock.

Create the Weblink Asset

  • Log in to your PiSignage Admin Panel.
  • Navigate to Assets > Add > Weblink.
  • Fill in the details:
    • Name: OpenHamClock
    • Link Address: https://<YOUR-HOSTNAME>:3000/?kiosk=true
  • Click Save.
  • Pro Tip: The ?kiosk=true suffix is critical. It tells HamClock to hide its own internal menus and headers, giving you a dedicated, high-contrast dashboard perfect for a wall-mounted display.

    Deploy to Your Player

  • Go to Playlists and add your new “OpenHamClock” asset.
  • Set the Duration: Set this to 0 for a permanent display, or a high number (like 300 for 5 minutes) if it’s part of a rotation.
  • Go to Groups, select your player, and deploy the playlist.
  • Your screen should refresh and show a beautiful, clean HamClock interface within seconds!

    Running PiSignage in Docker?

    For those of you looking to keep your entire server stack contained, running the PiSignage central server in Docker is the way to go. It keeps your host OS clean and makes management a breeze.

    If you’d like me to discuss how to set up a dockerized PiSignage server, please comment below!

    — 73 —

    Call to Action

    Getting this stack to play nice wasn’t a “one-and-done” install. It was a hard-fought process that took multiple attempts to finally crack the code on bypassing those “What’s New” screens and forcing a clean kiosk display. But the victory is in the uptime.

    Don’t just lurk. If you’ve got the guts to show how you’re rebuilding your station on the wreckage of the old ways, drop a comment below. How are you occupying the victory today?

    SUPPORTSUBSCRIBECONTACT ME

    D. Bryan King

    Sources

    Disclaimer:

    I love sharing what I’m learning, but please keep in mind that everything I write here—including this post—is just my personal take. These are my own opinions based on my research and my understanding of things at the time I’m writing them. Since life moves way too fast and things change quickly, please use your own best judgment and consult the experts for your specific situations!

    #AlpineLinux #AmateurRadioDashboard #amateurRadioTechnology #Automation #containerization #CSSInjection #CustomCSS #DetroitHamRadio #devops #DigitalDashboard #DigitalSignage #DisplaySolutions #Docker #DockerCompose #DXCluster #EN82le #GHCR #gridSquare #hamRadio #HamRadioKiosk #hamRadioSoftware #hamRadioTools #HamClock #HomeLab #HTTPSWrapper #KioskMode #KioskSetup #KioskTrue #Linux #MaidenheadLocator #networkSecurity #OpenSource #OpenHamClock #OpenSSL #piSignage #PiSignageDocker #PiSignageTips #RadioStationDisplay #RaspberryPi #RaspberryPiProjects #realTimeData #RemoteMonitoring #ScreenRotation #SelfHosted #ServerManagement #ShackClock #SignalTracking #SmartShack #Socat #SoftwareWorkaround #SolarData #SSLWrap #StationIntegration #TechGuide #TechnicalTutorial #UITweaks #W8DBK #WebDevelopment #WebLinkAsset

    Wie ich letzte Woche geschrieben habe, wurde mir ja meine öffentliche #IPv4 genommen, weil mein Provider jetzt #CGNAT macht. Jetzt wollte ich aber weiterhin aus #IPv4only Netzen zumindest mein Wireshark VPN starten können.

    Meine Lösung hat angefangen mit einer einfachen #socat Zeile auf einem VPS. Da ist dann in den letzten Tagen immer mehr dazu gekommen: automatischer Start, automatischer Restart, DynDNS Handling, konfigurierbare Weiterleitungen. Das ganze läuft jetzt auf einem separaten 1€ VPS.

    Solche Lösungen sind nicht neu, aber ich habe das alles mal zusammengefasst und auf GitLab gepackt:
    https://gitlab.com/EinPhysiker/fritzbox-port-forwarder

    Vielleicht findet das ja jemand als Inspiration nützlich.

    EinPhysiker / FritzBox Port Forwarder · GitLab

    GitLab.com

    GitLab

    I've re-modified my fork of #openhamclock from v15.1.7 & have set up a #socat thing to grab WSJT-X UDP messages & rebroadcast them to all hosts on my (tiny) network.

    So the web browser GUI display on Rasp-pi gets every decode quickly, & the map display looks like slow motion fireworks.

    I've got the eye-candy factor turned up to 11.
    #HamRadio

    NF.sec – Bezpieczeństwo systemu Linux - Zabawy z Socket Cat i TCP/IP Gender Changer

    S Ocket CAT, czyli socat to uniwersalne narzędzie dla systemów *nix służące do dwukierunkowego transferu danych pomiędzy dwoma niezależnymi kanałami danych. Tymi kanałami mogą być: pliki, potoki, urządzenia, gniazda (SSL, Unix, IPv4, IPv6, surowe, UDP, TCP), proxy, deskryptory plików (standardowe wejścia, wyjścia itp.). Można go używać jako potężniejszy odpowiednik netcat, umożliwiający przekierowywanie portów, tworzenie i […]

    I am #selfhosting a #Gitea instance (with plans to change to #Forgejo soon), which permanently gets attacked by web scrapers. All the senseless scraping of each commit and each `git blame` makes my VPS sweat quite a bit.

    Simply blocking these scrapers by user agent or IP addresses does not work: Today's 19k requests came from over 17k unique IP addresses, and most had faked UAs.

    With Gitea listening on a local port, and Apache sitting in front of it as a reverse proxy, I put another layer in between. As a prototype, I built a monstrosity with #socat and #Perl which receives each proxied HTTP request, checks for the X-Forwarded-For: header, and if the IP address is new, it aborts the process. If it was already seen before, it will be remembered for 10 minutes, and all subsequent requests will be served as usual.

    This adds a little inconvenience for legitimate users who will get their first request denied, but it took a huge load off my server. I will improve the concept to enable permanently allowing certain blocks of IP addresses, and maybe replace the socattery with a single program, or figure out if this can somehow be done natively with Apache...

    Just setting up some automated tests, where i need to connect some virtual serial ports of #qemu processes.

    I noticed that my #socat skills have become quite rusty.

    A sign that it's time for some #ctf fun and to pop some shells. Any suggestion? Where do you play these days? Is #hackthebox still a place go?

    I am trying to transfer a 30G Database from one server to another using mariabackup, mbstream and #socat. The transfer rate is pretty bad when I start the whole thing with #ansible, but it seems like I'm getting okayisch transfer rates if I copy the commands from the ansible files and run them by hand. Is there an explanation for that that doesn't involve occultism?
    #3DPrinting folks, I am trying to see if I can run OctoPrint and make it work via a vertual serial port connection on my #Mac, here's the issue though, if I run #socat, I can't also then run #OctoPrint in the same terminal window because only the commands for that particular program work, is there a way to fix it so that I can run both Socat and OctoPrint at the same time?