PropMon – a Desktop Propagation Monitor

I’ve had a LilyGO T-Encoder Pro sitting on my desk for a while now, running FlightScnr — a slick little project by Yash Mulgaonkar that turns this small round display and knob into a flight tracker. It’s genuinely useful as a desk instrument, and it got me thinking: this hardware — a round AMOLED screen, a rotary encoder, Wi-Fi, all in a compact desk-friendly form factor — is a good general-purpose platform. Not just for flight tracking. I bought a second unit intending to build another FlightScnr, and then realized I really wanted something else on my desk: live HF propagation conditions, at a glance, without opening a laptop or pulling up a dashboard.

PropMon device in 3d printed stand (thanks to FlightScnr for the 3d model)

So I started what I’m calling the N4MI Desktop Instrument Series — a family of small purpose-built instruments on this same hardware. The first one is a Propagation Monitor, and as of this week I’m calling it done enough to call “v1.” The PropMon code was created with Claude, with design assistance from ChatGPT.

Where the data comes from

The interesting design decision here wasn’t really the display — it was figuring out where the propagation data should actually come from. I already had a propagation dashboard running on my ham computer, and the easy answer would have been to just add a small API endpoint to that existing server.

The problem is I stop that dashboard server all the time — there’s a Stream Deck button that kills it whenever I’m not actively using the shack computer for something. A desk instrument that goes dark every time I turn off an unrelated program isn’t really a desk instrument. The whole point is that it’s always there.

That ruled out the shack computer, and pointed me at the one machine in the house that’s genuinely always on: my NAS. So I built a small, dedicated backend service — I’m calling it PropMon — that runs there in Docker via Portainer, fetches propagation and weather data on a timer from HamQSL, NOAA, my WeatherFlow Tempest station, and NWS alerts, applies some rating logic, and serves it up as flat JSON. No UI, no database, just a small always-on service whose only job is to answer “how are the bands right now?” It’s a bit of duplicated logic between it and my existing dashboard, but decoupling the desk instrument from a machine I turn on and off all the time was worth that trade.

The instrument itself

The firmware cycles through four screens with a turn of the knob — an Overview with the headline band conditions, a full Bands screen showing all ten bands individually, a Solar screen with the full SFI/K-index/sunspot/X-ray picture, and an Alerts screen for anything from PropMon worth knowing about (a geomagnetic storm, a tower wind warning, that kind of thing). A short press forces a refresh, a longer hold pulls up a config screen showing connection status, and holding even longer than that drops you into Wi-Fi setup — more on that in a second.

Overview panel
Alert panel
Solar conditions panel
Bands panel
Configuration status panel

I also added an ambient alert system on top of all four screens: if something changes — a new alert, or an existing one getting worse — a banner pops up for a few seconds regardless of which screen you’re looking at, and a small badge sticks around as long as the condition is active. I wanted the thing to actually catch my eye if 40 mph wind gusts show up in the forecast, not just quietly update a number I’d have to notice on my own.

Alert for Special Weather Statement from NWS

A real bug worth telling

One of the more satisfying moments in this project happened once I finally had live data flowing end to end. I glanced at the Bands screen mid-evening and 160 meters was showing GOOD — during full daylight, when 160m should be essentially dead from D-layer absorption.

I pulled up the real HamQSL reference page at the same exact moment to rule out stale data — same solar flux, same K-index, everything matched, so it wasn’t a caching problem on my end. That sent the bug report over to the PropMon side of the project, and it turned into a nice bit of detective work: the time-of-day logic PropMon uses was built on a fixed year-round UTC clock — dusk was hard-coded as roughly 6 to 9 PM Eastern, no matter the season. For most bands that’s a forgivable approximation. But 160m and 80m are basically all-or-nothing — fully shut down by day, wide open once it’s genuinely dark — so a few hours of seasonal drift on a fixed clock was enough to produce a rating that was flatly impossible rather than just a little off.

The fix computes real civil dusk and dawn for my actual location instead of guessing from a fixed clock, and only for those two bands specifically. I checked the computed dusk times against my own years of on-air experience — 160m opening around 6 PM in winter, more like 9 PM in summer — and they lined up within about ten minutes at both extremes. A nice moment where the math and the years of just being on the radio agreed with each other.

Getting Wi-Fi credentials onto the thing without a laptop

The last big piece was making this something I could actually hand to another ham without them needing to edit source code and reflash it just to get on their own Wi-Fi. The device now opens its own temporary network for a few minutes when you hold the knob down — connect your phone, a page pops up automatically, pick your network from a scanned list, type your password, done. Credentials get stored on the device itself, and the setup network disappears once it’s connected.

Wi-Fi setup panel
Wifi login portal on my phone

Getting there took a couple of real, honest bugs — one where the device could report “connected!” without actually testing the password you’d just typed (found because I deliberately tried a wrong one and it worked anyway, which is exactly the kind of thing worth testing on purpose), and one where scanning for networks and running the setup hotspot at the same time turned out to be a genuine limitation of the ESP32’s radio, not something to just retry harder against. Both are fixed now and confirmed working end to end, wrong passwords included.

Where it stands

As of this week, it’s running live on my desk — real Wi-Fi, real data, correctly-rated bands, day or night. I’m calling this v1 and I’m going to let it run for a while in actual daily use before deciding what’s next. There’s a whole list of other instruments I want to build on this same platform — an APRS activity monitor, a DX cluster monitor, satellite pass alerts — but that’s future work for another post.

PropMon & FlightScnr on my desk

If you want to build one of these yourself, both halves of the project are public:

The firmware and backend service are in different repositories due to a shift in planning mid-project (my rookie mistake). Future instruments will have the firmware and backend service in the same repository. Both READMEs point at each other, so you can start from either one. Fair warning: you’ll want to already be comfortable standing up a Portainer stack before you dive in — that part’s on you.

What’s Next?

Now that the Propagation Monitor is running day-to-day, I’m turning my attention to the next instrument in the series: APRSMon, a desk display for local APRS activity — nearby stations, weather, and alerts. Same hardware, same one-glance philosophy, different question to answer. More on this as it takes shape.

73,
Dan — N4MI

HamShackFeed Pro — Upgrading My Newsroom

When I wrapped up the HamShackFeed post a few days ago, I called it version 1 and listed a few things on the future ideas list — podcast audio playback and a mobile-friendly layout. The podcast player made it into the HTML file shortly after that post went up. The other two are still in progress.

What I didn’t anticipate was a completely different set of problems surfacing through daily use — problems that the original “no server, no installation, just a file” approach couldn’t solve without a fundamental rethink. That rethink is HamShackFeed Pro.

HamShackFeed Pro dashboard showing 200 items across blog, podcast, and YouTube sources in a three-column card layout with source sidebar and filter buttons
HamShackFeed Pro loaded with 200 items across blogs, podcasts, and YouTube channels. The sidebar shows sources grouped by type with unread counts, and the card grid displays mixed content sorted newest-first.

What Broke in Daily Use

Part 4 presented HamShackFeed’s single-file design as a feature, and it is one — you can email it to another ham and they’re up and running immediately. But that same simplicity creates real friction once you’re actually relying on it every day.

The API key situation. HamShackFeed fetches RSS feeds through a free proxy service called rss2json.com, which handles a browser security restriction that prevents web pages from pulling in content from other domains. What the Part 4 post didn’t cover — because it wasn’t an issue at the time — is that the free tier of rss2json.com throttles unauthenticated requests to one every ten seconds. In practice, that means sources load in slow motion and the Add Source button fails almost every time. The fix is a free API key from rss2json.com, which raises the limit to 10,000 requests per day. But it’s a setup step that isn’t obvious, and it became the number one question after that post.

localStorage is fragile. Every source you add, every article you mark as read — all of it lives in your browser’s localStorage, which I mentioned in Part 4 as where “state” is stored. What I glossed over is that localStorage is tied to one specific browser on one specific machine. Clear your browser history and it’s gone. Open the file on a different computer and it doesn’t know who you are. That’s fine for a quick-access tool but not great for something you’re checking multiple times a day.

One computer only. I have a ham computer in the shack and an admin computer at my desk. Every time I moved between them, I was looking at a different feed with different read state. Keeping them in sync manually wasn’t going to happen.

The Upgrade: Adding a Server (on Purpose)

Part 4 made a point of saying HamShackFeed needed no server. HamShackFeed Pro adds one — and that’s a deliberate trade-off, not a regression.

The server is small, runs locally on your ham computer, and you start it the same way you start the propagation dashboard: one PowerShell script, one Stream Deck button. In exchange for that setup step, you get three things that a standalone file simply cannot provide.

No API key needed. When a server fetches RSS feeds, the browser security restriction that made rss2json.com necessary doesn’t apply. The server talks directly to DX World, Ham Radio Workbench, the ARRL — wherever — and delivers the content to your browser clean. No proxy, no rate limits, no account to create. The ARRL feed, which rss2json.com occasionally struggled with because it uses HTTP instead of HTTPS, just works.

Persistence that actually persists. Everything in HamShackFeed Pro is stored in a SQLite database on your ham computer — sources, read state, favorites. Clear your browser history, reboot the machine, use a different browser entirely. When you come back, your feed looks exactly the same. The database file lives in your Ham Scripts folder alongside everything else.

Any device, same feed. The server binds to your local network, not just localhost. Any device on your WiFi — phone, tablet, laptop at the other desk — can open http://192.168.x.x:8074 and see the same feed with the same read state. Mark something read on your phone and it’s read on the shack computer too. Everything lives in one place.

HamShackFeed Pro help modal showing the About Pro section with a callout stating No API key required — Pro fetches RSS feeds directly on the server with no rss2json.com proxy needed
The built-in help modal spells out what’s different about Pro — no API key required, read state stored server-side, accessible from any device on the network.

HamShackFeed vs HamShackFeed Pro

FeatureHamShackFeedHamShackFeed Pro
RSS proxy API keyRequiredNot needed
Source persistenceBrowser localStorageSQLite database
Read state persistenceBrowser localStorageSQLite database
Cross-device accessNoYes — local network
Background refreshNoEvery 30 minutes
Installation requiredNone — open a filePython + 4 packages
Portable / shareableYes — email it to anyoneLocal server only

What Stayed the Same

Intentionally, a lot. The visual design is identical — same dark navy theme, same card layout, same color coding for blogs (cyan), podcasts (gold), and YouTube (red). The sidebar, the favorites panel, the podcast player, the search bar, the filter buttons — all there, all working the same way.

The default source list, for the most part, carries over from Part 4. Two of the podcasts did not seem to be recently active and were replaced with Ham Radio Workbench and the ICQ Podcast, both active and worth following.

If you’ve been using HamShackFeed and have added your own sources, there’s a migration path. A short browser console command exports your custom sources as JSON, and a Python script imports them into Pro via the API. The whole process takes about two minutes.

Running Both

HamShackFeed and HamShackFeed Pro coexist without any conflict. The HTML version doesn’t use a port at all — it’s just a file. Pro runs on port 8074. If you want to keep the HTML version as a portable option to share with another ham, nothing changes. Pro is just the better daily driver when you’re at your own station.

My propagation dashboard runs on port 8073. Both it and HamShackFeed Pro can be open at the same time — I usually have both up when I’m in the shack.

The Stream Deck Button

Same setup as the other shack tools — Advanced Launcher plugin, pointed at PowerShell 7, with the Start In directory set to the hamshackfeed_pro folder so Flask can find its templates:

Executable:  pwsh.exe
Arguments:   -ExecutionPolicy Bypass -Command "cd 'C:\Ham Scripts\hamshackfeed_pro'; python server.py"
Start In:    C:\Ham Scripts\hamshackfeed_pro

The server opens in a minimized window and launches the browser automatically.

On the Future Ideas List From Part 4

The closing section of the HamShackFeed post listed three things: podcast audio playback, DXCC expedition alert integration, and a mobile-friendly layout.

The podcast player landed in the HTML version shortly after that post. HamShackFeed Pro carries it forward — podcast cards with audio links show a Play button, and a persistent player bar appears at the bottom of the screen with full controls.

HamShackFeed Pro podcast player bar at the bottom of the screen showing episode title, Ham Radio 2.0 source label, play/pause button, skip back 15 seconds, skip forward 30 seconds, and a seek bar
The persistent podcast player bar — clicking Play on any podcast card opens this at the bottom of the screen. It stays visible as you browse the rest of the feed.

The mobile layout question is partly answered by Pro’s cross-device access — any phone or tablet on the local network can open the feed in a browser and it renders fine. A purpose-built mobile layout is still a future idea, but day-to-day it works well enough as is.

Adapting This Project

This project was built specifically for my station, equipment, and workflows.

If you decide to try it yourself, you will likely need to adjust file locations, hardware settings, network addresses, APIs, or other configuration details to match your own environment.

Rather than viewing the project as a finished product, think of it as an example of what can be created and adapted for your own shack.

Modern AI tools can often help make those changes quickly, even if you have little or no programming experience.

Get It

All the files are in the GitHub repo at github.com/N4MI73/streamdeck-hamradio under the hamshackfeed_pro/ folder. Full setup instructions are in the README, including how to install the Python dependencies, configure the Stream Deck button, open the Windows Firewall port for cross-device access, and migrate your sources from the HTML version.

If you’ve been using HamShackFeed and running into the API key or localStorage issues, Pro is a straightforward upgrade. If you’re coming to this fresh, Pro is the version to start with.

Stream Deck for Ham Radio — Part 4: HamShackFeed — My Personal Ham Radio Newsroom

Ham radio has a surprisingly rich content ecosystem. There are blogs covering DX expeditions and technical topics, podcasts perfect for the commute, and YouTube channels with tutorials, reviews, and operating demonstrations. The problem isn’t that the content isn’t out there — it’s that it’s scattered across a dozen different sites, and keeping up with all of it means either spending half your operating time clicking through bookmarks or missing things entirely.

I’ve had the experience of finding out about a DX expedition after it was already over, or discovering a podcast episode that would have been useful before a contest two weeks after it aired. A folder of bookmarks you mean to check regularly is not the same as actually checking them regularly. What I wanted was one place where everything shows up automatically — blogs, podcasts, and videos — without any clicking around.

The result is HamShackFeed — a single HTML file that aggregates RSS feeds from ham radio blogs, podcasts, and YouTube channels into one clean, searchable dashboard. No installation. No server. No account. No subscription fee. Just open the file in Chrome and your content is there.

HamShackFeed dashboard showing ham radio blog, podcast, and YouTube content cards in a three-column layout with source sidebar and filter buttons
HamShackFeed loaded with 104 items across 17 sources — blogs, podcasts, and YouTube channels all in one view. The ZD8KX Ascension Island DX expedition announcement and a new WSJT-X 3.0 release notice are visible alongside YouTube thumbnails from Ham Radio Crash Course.

What Is RSS?

RSS (Really Simple Syndication) has been around since the early days of the internet and remains the most reliable, algorithm-free way to follow content. Almost every blog, podcast, and YouTube channel publishes an RSS feed — a structured list of their latest content that any reader can consume. There’s no feed curation, no promoted posts, no engagement-based sorting. Just the actual content from the sources you choose, in chronological order. Most people don’t know it’s there, but it’s been quietly powering podcast apps and news readers for decades.

The Sources

HamShackFeed comes pre-configured with 17 sources across three content types, all color coded — cyan for blogs, gold for podcasts, red for YouTube.

Blogs — DX World, On All Bands, KB6NU’s Ham Radio Blog, DX Zone, DX News, AR Newsline, and This Week in Amateur Radio. Between them these cover DX expedition announcements, operating tips, propagation news, technical articles, and the weekly ham radio news cycle.

Podcasts — Ham Radio Crash Course (Josh KD9FRQ), ARRL Roundtable, 100 Watts and a Wire, and Ham Radio 2.0 (Jason KC5HWB). All fetched directly via RSS — no podcast app required.

YouTube — Ham Radio Crash Course, Ham Radio Concepts, Ham Radio 2.0, KM4ACK, Dave Casler (KE0OG), and Ham Nation. YouTube publishes an RSS feed for every channel, so new video titles, descriptions, and thumbnails appear in the dashboard automatically — no YouTube API key needed.

Features

Each piece of content appears as a card showing the source, content type, publication date in human-readable form (Today, Yesterday, 3d ago), title, description excerpt, and thumbnail when available. Four filter buttons at the top — All, Blog, Podcast, Video — narrow the view instantly. The source sidebar on the left lists all sources grouped by type, each with an unread count badge, and clicking any source filters the feed to show only that source’s content.

Read tracking is built in — each card has a Mark Read button, and once marked, cards dim but stay visible. An Unread Only toggle hides everything already read so you can focus on fresh content. Mark All Read clears the queue in one click. All read state is stored in your browser’s local storage and persists between sessions.

The search bar at the top filters feed items in real time as you type. Longer queries also trigger a DuckDuckGo web search filtered to ham radio content, with results appearing below the main feed — a quick way to find content beyond what’s in your current source list.

Adding a new source is straightforward — paste any blog URL, podcast URL, or YouTube channel URL into the Add Source modal and the dashboard detects the feed automatically. Paste a YouTube channel URL and it extracts the channel ID and constructs the RSS feed URL without any manual steps. Added sources persist in local storage and survive page refreshes.

HamShackFeed Add Content Source modal showing URL field, optional label field, and auto-detect type dropdown
The Add Content Source modal — paste any blog, podcast, or YouTube channel URL and the dashboard auto-detects the feed type and label. No manual RSS URL hunting required.
HamShackFeed showing YouTube video thumbnail cards from Ham Radio Concepts and Ham Radio 2.0 alongside DX World blog cards for active DX expeditions
YouTube cards display full thumbnails alongside blog content — three active DX expeditions (A52EA Bhutan, 3G0Z Juan Fernández Islands, ZL7IO Chatham Islands) visible alongside EME and digital mode video content from Ham Radio Concepts and Ham Radio 2.0.

How It Works

HamShackFeed is a completely self-contained HTML file. Unlike the propagation dashboard from Part 2 of this series, it doesn’t need a local Python server — it works by opening the file directly in Chrome. Feed fetching uses the free rss2json.com API, which handles the browser’s cross-origin restrictions (CORS) by fetching feeds server-side and returning them as clean JSON. All state — read items, added sources, removed sources — is stored in browser localStorage. Nothing is sent to any server except the feed fetch requests themselves.

Getting Started

Requirements: Google Chrome (or any modern browser) and an internet connection. That’s it — no Python, no PowerShell, no installation of any kind.

  • Download HamShackFeed.html from the project’s GitHub repository: github.com/N4MI73/streamdeck-hamradio
  • Save it anywhere on your PC — C:\Ham Scripts\ works well if you have the Stream Deck setup from the rest of this series
  • Open it in Chrome — double-click it in File Explorer or drag it into a Chrome window
  • Feeds load automatically — give it 10–20 seconds for all sources to fetch
  • Click Unread Only to focus on fresh content, use the filter buttons to narrow by type, and add or remove sources to match your interests

Bookmark the local file path in Chrome for easy access: file:///C:/Ham%20Scripts/HamShackFeed.html

Adding It to Your Stream Deck

If you’re following this series and already have a Stream Deck set up, adding HamShackFeed takes about 30 seconds. Use the Advanced Launcher plugin with Chrome as the application and the file path as the argument:

--profile-directory="Profile 1" "C:\Ham Scripts\HamShackFeed.html"

A matching Stream Deck icon is available in the icons folder of the GitHub repository.

Sharing With Other Hams

Because HamShackFeed is a single self-contained file with no dependencies, sharing it is as simple as sharing any file — email it, put it on a club website, or link it from GitHub. Anyone can download and use it immediately. The default source list is pre-configured with all 17 sources, and each operator’s customizations (added sources, read state) are stored locally in their own browser — sharing the file with another ham gives them a clean slate with the default sources, not your personal configuration.

There’s also an interesting club application here. A club could maintain a version pre-configured with their own newsletter RSS feed, local repeater club news, and regional content alongside the general ham radio sources — then share it at a club meeting as a single-file download.

Closing Thoughts

The ham radio content community is larger and more active than many operators realize. HamShackFeed makes it practical to follow all of it without spending time hunting for updates. RSS is older than most social media platforms but remains the best way to follow content on your own terms — no algorithm deciding what you see, no promoted posts, just the content from the sources you choose in the order it was published.

This is version 1. Future ideas on the list include audio playback for podcasts directly in the dashboard, DXCC expedition alert integration to cross-reference DX World announcements with your most wanted list, and a mobile-friendly layout for tablet use at the operating position.

Download HamShackFeed from the project repository at github.com/N4MI73/streamdeck-hamradio.

Signed up for World Radio League

My preferred logging software is N3FJP’s Amateur Contact Log. It is easy to use, and integrates well with my IC-7610, and with WSJT-x/JTAlert. It can also automatically upload contacts to several online logging/QSL platforms (LoTW, QRZ, CLubLog, and eQSL). I have been very happy with this workflow, and it covers my logging and verification needs.

At the recommendation of a trusted friend, I decided to check out World Radio League (WRL). It is a cloud-based application that is sort of a mashup of a logbook and social networking for ham radio operators. The team that designed and built the application also created Ham Radio Prep, which is a web-based application that prepares hams for license exams.

WRL is available as a web application, as well as apps for Android and Apple phones and tablets. You can sign up for WRL for free, with limited features. There are also three paid levels (Basic, Premium, and VIP) that offer more features and capabilities. I chose the Premium level for $60/year.

I have only started to explore the options in the WRL web application. I was able to create a profile with my station information, and uploaded an ADIF file (from ACLog) with all of my contacts. Those two processes went smoothly.

Here are a few screenshots showing some of the key pages and features in the WRL web app:

This is the home screen that is displayed after logging in to WRL.
This is the logbook page in the web app.
The logbook page includes a map depicting the logged contacts.
The Analytics page displays all of the countries and states I have worked. It appears that the confirmations only include those from within WRL.
The Activities page shows a map or list of POTA, SOTA, IOTA, and WWF sites.
The Spotting page includes a very customizable map and list of live spots.
The Contests page is very interesting. The app can create logbooks for various contests. The page shows current and upcoming contests, and allows you to “enroll” to create a logbook for the contest.
The Integrations page is for setting up and configuring integration with QRZ.com and LoTW sites, WSJT-X, N1MM, and N3FJP.
The Find Members Near Me page shows locations (not exact) of other WRL members.

Each of the pages on the web app have a multitude of configurations and display options. There are also several other functions that I haven’t explored yet. I also need to check out the app on my tablet and phone. Time will tell whether WRL will replace any of the other applications in my workflow, or supplement them. I’ll post an update after digging deeper into WRL.

AI Generated Ham Radio Images

I have been learning about how to use ChatGPT and some other AI models to enhance my participation in the Amateur Radio hobby. I am also starting to learn how to code in Python, to hopefully create some code that will be useful to me in the hobby. ChatGPT is especially helpful for learning Python and optimizing code.

Just for fun, I started using the image generation models in Dall-E to make some interesting pictures featuring my Louisiana Catahoula Leopard Dog sidekick Luke. Here are a couple that turned out really well. They don’t look exactly like Luke, but they are amazingly good for pictures created only with word prompts.