Skip to main content

Posts

Morse Code Data and Ham Radio

Ever tune across the HF bands and wonder just how many Morse code operators are on the air at that moment? Thanks to WW5TH’s ingenious setup that reads directly from the Reverse Beacon Network (RBN), you can see it in near real time. The RBN ’s worldwide network of “skimmers” automatically decodes CW signals, giving a fascinating snapshot of CW activity across the globe.  Pat wrote the code up here and you can find the latest data here . Here's an example from this morning. This quick visualization from W5WTH shows how data from the Reverse Beacon Network can reveal real-time CW activity. It’s a great way to see where the bands are hopping and how propagation changes minute by minute. Check out Pat’s GitHub for code details, and watch the data to spot when Morse action is hopping. Want to dive deeper? Try building your own CW dashboard from RBN data using Chat GPT , or explore similar projects in ReverseBeacon.net and Parks on the Air to see who...
Recent posts

TouCans QSO DB: Lab Book

 Project TouCans just got a major database upgrade! The QSO records that KO6BTY and I log from field activations can now be appended directly from our GitHub CSV files instead of regenerating the entire SQLite database. This new method—based on an approach I first saw in Simon Willison’s video—keeps local data editable while automatically merging in the latest contacts from the cloud.

OpenAI Apps SDK and ChatGPT Integration: Building the Ham Radio Practice Exam at Project TouCans

 Everything’s moving fast in AI again! Yesterday, OpenAI announced the ChatGPT Apps SDK, a framework that lets developers build full-featured web apps right inside ChatGPT. For Project TouCans, that’s a huge step forward. Just last month, I built two prototypes of the AI-enabled Ham Radio Practice Exam—one running Python inside GPT-5’s Code Interpreter, and another in a JavaScript canvas embedded within ChatGPT. Back then, those two couldn’t talk to each other. Now, with the new Apps SDK, they finally can—and that means real-time, interactive AI help during exams is finally within reach. You can try out the latest version of the extra class practice exam here (sans the Apps SKD so far.)

AI Help Enabled Ham Radio Extra Class Practice Test| FCC Element 4 Question Pool 2024–2028

  Extra Class Practice Exam Get ready for the FCC Extra Class license exam with this free online ham radio practice test. Our interactive exam tool uses the official FCC Element 4 Question Pool (valid July 2024–2028) and automatically tracks your performance. See your score history, review stacked bar charts of correct vs wrong answers by subelement, and drill down into specific group stats with a single click. This version of the exam is identical to the first release with a single exception. This version has an AI help facility. To see a demo of how to us it, please see this post and associated video. To use the AI features, you'll need to have your own OpenAI API key. You'll input that in a dialog that is not visible to anyone but your browser. One of the points of these exam practice pages was to demonstrate that they could be deployed without needing server-side code, and they don't. This is the first practice run of the free online ham radio practice exams. I fully e...

How I Cut GPT Input Costs 10× by Turning Off the Vector Store on the Ham Radio Practice Exams

I finally found out why my Extra Class AI Tutor was spending nearly ten times more on input than output tokens. It wasn’t the math, the cache, or the prompt—it was the vector store. Turning it off cut token usage from 17021 to 1743 in a single move.

Lab Notebook: GPT-5 Help Agent for Ham Radio Exams Debug

 Debug notes from getting the AI help feature of the free ham radio exams to work today. Grabbing a text answer from OpenAI still works: That's from this method async function retrieveTextWithFileSearch ({ system , user }) {   const vsId = localStorage . getItem ( 'vector_store_id' );   if (! vsId ) throw new Error ( 'No vector_store_id found.' );   answText = answText + " " + user ;   const resp = await openai ( '/responses' , {     body : {       model : 'gpt-4.1-mini' ,       input : [         { role : 'system' , content : system },         { role : 'user' ,   content : answText }       ],       tools : [{ type : 'file_search' , vector_store_ids : [ vsId ] }]     }   }); With the agent  flow, it doesn't work async function retrieveTextWithAgent ({ system , user }) {   // 0) Make sure we have ...