<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Blog Title</title>
  <subtitle>This is a longer description about your blog.</subtitle>
  <link href="https://example.com/feed/feed.xml" rel="self" />
  <link href="https://example.com/" />
  <updated>2026-09-12T00:00:00Z</updated>
  <id>https://example.com/</id>
  <author>
    <name>Your Name</name>
  </author>
  <entry>
    <title>SSCE</title>
    <link href="https://example.com/blog/SSCE/" />
    <updated>2026-09-12T00:00:00Z</updated>
    <id>https://example.com/blog/SSCE/</id>
    <content type="html">&lt;p&gt;An SSCE on JavaRanch (now known as CodeRanch) stands for Short, Self-Contained, Correct (or Compilable) Example. It is a highly effective troubleshooting standard used in programming forums to help others diagnose and fix your code quickly.&lt;/p&gt;
&lt;p&gt;The 4 Pillars of an SSCE&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Short: Remove all code that does not directly contribute to the problem.  Strip away unrelated logic, extra variables, and large UI layouts.&lt;/li&gt;
&lt;li&gt;Self-Contained: The code must be complete. Anyone who copies and pastes it into their IDE should be able to run it instantly without needing external files, databases, or proprietary libraries.&lt;/li&gt;
&lt;li&gt;Correct / Compilable: The code should compile. If the issue is a runtime bug or exception, the code must run and successfully reproduce that exact error.&lt;/li&gt;
&lt;li&gt;Example: It demonstrates the specific problem or concept you are asking about, rather than being your entire project.&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Reticulum</title>
    <link href="https://example.com/blog/Reticulum/reticulum/" />
    <updated>2026-09-11T00:00:00Z</updated>
    <id>https://example.com/blog/Reticulum/reticulum/</id>
    <content type="html">&lt;p&gt;Wow!  I really enjoyed &lt;a href=&quot;https://guy.dev/&quot;&gt;Guy Royse&lt;/a&gt;&#39;s &lt;a href=&quot;https://payne.github.io/kcdc2026/#/sessions/1152649&quot;&gt;talk&lt;/a&gt; about &lt;a href=&quot;https://reticulum.network/&quot;&gt;Reticulum&lt;/a&gt; at KCDC 2026.  He provides a &lt;a href=&quot;https://github.com/guyroyse/youve-probably-never-heard-of-the-reticulum-network&quot;&gt;github repo with his code and slides&lt;/a&gt;.  It&#39;s really worthwhile to read Guy&#39;s &lt;a href=&quot;https://github.com/guyroyse/youve-probably-never-heard-of-the-reticulum-network/blob/main/slides/reticulum-network.pdf&quot;&gt;slides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&#39;s some of the notes I took:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pip install rns&lt;/code&gt;  # Installs reticulum
&lt;ol&gt;
&lt;li&gt;Rust and JavaScript implementations also exist&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Reticulum protocol is public domain.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/markqvist/lxmf&quot;&gt;LXMF&lt;/a&gt; is a related to Reticulum and allows a message to be contained in a QR code!
&lt;ol&gt;
&lt;li&gt;The &lt;a href=&quot;https://reticulum.network/start.html&quot;&gt;start&lt;/a&gt; page says &amp;quot;LXMF is a distributed, delay and disruption tolerant message transfer protocol built on Reticulum.&amp;quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Links from Guy&#39;s repo&#39;s readme include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/liamcottle/reticulum-meshchat&quot;&gt;MeshChat&lt;/a&gt; — A chat client and NomadNet browser for Reticulum.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/guyroyse/rserver&quot;&gt;RServer&lt;/a&gt; — The webserver Guy wrote for Reticulum.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/guyroyse/mesh-browser&quot;&gt;Mesh Browser&lt;/a&gt; — The web browser Guy wrote for Reticulum.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It was great to see live demostrations of this during Guy&#39;s KCDC 2026 talk.&lt;/p&gt;
&lt;p&gt;When I google: Reticulum hello world&lt;/p&gt;
&lt;p&gt;Google&#39;s AI says, do the pip and then try these two python programs:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;server.py&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-python&quot; data-src=&quot;server.py&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; RNS
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; time

&lt;span class=&quot;token comment&quot;&gt;# Initialize Reticulum&lt;/span&gt;
rns &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Reticulum&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Define an application name and aspect&lt;/span&gt;
APP_NAME &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;helloworld&quot;&lt;/span&gt;
ASPECT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;echo&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Create a destination that others can find&lt;/span&gt;
    identity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Identity&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    destination &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        identity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;IN&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SINGLE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        APP_NAME&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
        ASPECT
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# Set up a callback to handle incoming data&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;packet_callback&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; packet&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;decode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Received message: &#39;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_packet_callback&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;packet_callback&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Announce this destination so clients can discover its identity&lt;/span&gt;
    destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;announce&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Server is running. Destination address: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;prettyhexrep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Announced destination. Waiting for messages... (Press Ctrl+C to exit)&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Re-announce periodically so clients started after the first&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# announce can still discover this destination&lt;/span&gt;
        destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;announce&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;client.py&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-python&quot; data-src=&quot;client.py&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; RNS
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; time

&lt;span class=&quot;token comment&quot;&gt;# Initialize Reticulum&lt;/span&gt;
rns &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Reticulum&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

APP_NAME &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;helloworld&quot;&lt;/span&gt;
ASPECT &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;echo&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Listens for announces from the server so we can learn its real identity&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ServerAnnounceHandler&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; aspect_filter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;aspect_filter &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; aspect_filter
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;identity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;destination_hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;received_announce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; destination_hash&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; announced_identity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; app_data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;identity &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; announced_identity
        self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;destination_hash &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; destination_hash

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Looking for server destination...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Wait for the server to announce itself so we learn its real identity.&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# A destination created with a random identity would have a different&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# hash than the server&#39;s and packets sent to it would go nowhere.&lt;/span&gt;
    handler &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; ServerAnnounceHandler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;aspect_filter&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;APP_NAME&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;ASPECT&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Transport&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;register_announce_handler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;handler&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; handler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;identity &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Server destination found.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    destination &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        handler&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;identity&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;OUT&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Destination&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;SINGLE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        APP_NAME&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        ASPECT
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Send the data packet&lt;/span&gt;
    message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World over Reticulum!&quot;&lt;/span&gt;
    packet &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; RNS&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Packet&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;destination&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; message&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;encode&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    packet_receipt &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; packet&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Sent: &#39;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&#39;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    
    &lt;span class=&quot;token comment&quot;&gt;# Confirm delivery if possible&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; packet_receipt&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Packet handed over to the network.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Failed to send packet.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Reticulum transmits asynchronously via a background thread, so give it&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# a moment before the process exits - otherwise the packet can be dropped&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# before it&#39;s actually written to the interface.&lt;/span&gt;
    time&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
</content>
  </entry>
  <entry>
    <title>LXMF references</title>
    <link href="https://example.com/blog/Reticulum/lxmf_references/" />
    <updated>2026-09-11T00:00:00Z</updated>
    <id>https://example.com/blog/Reticulum/lxmf_references/</id>
    <content type="html">&lt;h1 id=&quot;lxmf-references&quot;&gt;LXMF References&lt;/h1&gt;
&lt;p&gt;Reading list gathered while building &lt;code&gt;lxmf_qr.py&lt;/code&gt; / &lt;code&gt;qr_lxmf.py&lt;/code&gt;, with a focus on
how keys are managed in Reticulum/LXMF. All links below were confirmed from the
official project metadata bundled with the installed &lt;code&gt;rns&lt;/code&gt; and &lt;code&gt;lxmf&lt;/code&gt; pip packages
(&lt;code&gt;venv/lib/python3.11/site-packages/{rns,lxmf}-*.dist-info/METADATA&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&quot;official-sources&quot;&gt;Official sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reticulum manual&lt;/strong&gt; — https://markqvist.github.io/Reticulum/manual/ (mirrored at
https://reticulum.network/manual/). The canonical documentation for the whole
stack, including identities, cryptography, and interfaces.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://markqvist.github.io/Reticulum/manual/gettingstartedfast.html&quot;&gt;Getting Started Fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://markqvist.github.io/Reticulum/manual/using.html&quot;&gt;Using Reticulum&lt;/a&gt; —
includes the &amp;quot;Included Utility Programs&amp;quot; section covering &lt;code&gt;rnid&lt;/code&gt;, the identity
management/encryption CLI tool.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://markqvist.github.io/Reticulum/manual/interfaces.html&quot;&gt;Supported Interfaces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reticulum source (RNS)&lt;/strong&gt; — https://github.com/markqvist/Reticulum — see
&lt;code&gt;RNS/Identity.py&lt;/code&gt; for the actual key-handling code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LXMF source&lt;/strong&gt; — https://github.com/markqvist/lxmf — see &lt;code&gt;LXMF/LXMessage.py&lt;/code&gt;
and &lt;code&gt;LXMF/LXMRouter.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reticulum.network&lt;/strong&gt; — https://reticulum.network/ — project home page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAQ&lt;/strong&gt; — https://github.com/markqvist/Reticulum/wiki/Frequently-Asked-Questions&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;client-implementations-built-on-lxmf&quot;&gt;Client implementations built on LXMF&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Sideband — https://unsigned.io/sideband&lt;/li&gt;
&lt;li&gt;Nomad Network — https://unsigned.io/nomadnet&lt;/li&gt;
&lt;li&gt;MeshChat — https://github.com/liamcottle/reticulum-meshchat&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-keys-are-managed&quot;&gt;How keys are managed&lt;/h2&gt;
&lt;p&gt;This is the short version distilled from &lt;code&gt;RNS/Identity.py&lt;/code&gt; and &lt;code&gt;LXMF/LXMRouter.py&lt;/code&gt;
in the installed packages — read those files directly for the authoritative
details.&lt;/p&gt;
&lt;h3 id=&quot;the-identity-keyset&quot;&gt;The Identity keyset&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A Reticulum &lt;code&gt;Identity&lt;/code&gt; is a &lt;strong&gt;512-bit Curve25519 keyset&lt;/strong&gt;, made of two separate
256-bit keys (&lt;code&gt;RNS/Identity.py&lt;/code&gt;, &lt;code&gt;KEYSIZE&lt;/code&gt;/&lt;code&gt;CURVE&lt;/code&gt; constants):
&lt;ul&gt;
&lt;li&gt;an &lt;strong&gt;Ed25519&lt;/strong&gt; key, used for signing (proves who sent a message)&lt;/li&gt;
&lt;li&gt;an &lt;strong&gt;X25519&lt;/strong&gt; key, used for ECDH key exchange (used to derive per-message
encryption keys)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Your Reticulum/LXMF &lt;em&gt;address&lt;/em&gt; (the destination hash you give out, e.g. an LXMF
address) is a truncated hash derived from the identity&#39;s &lt;strong&gt;public&lt;/strong&gt; key. It&#39;s
not a secret and is safe to share; it&#39;s how others address messages to you.&lt;/li&gt;
&lt;li&gt;The private key is the only thing that can decrypt messages addressed to that
identity or produce valid signatures from it. There is no password/passphrase
wrapping it by default — whoever holds the key file &lt;em&gt;is&lt;/em&gt; that identity.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;saving-and-loading-identities&quot;&gt;Saving and loading identities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Identity.to_file(path)&lt;/code&gt; / &lt;code&gt;Identity.from_file(path)&lt;/code&gt; are the built-in
save/load calls (used by both &lt;code&gt;lxmf_qr.py&lt;/code&gt; and &lt;code&gt;qr_lxmf.py&lt;/code&gt; via
&lt;code&gt;.lxmf_identities/&lt;/code&gt;). The library&#39;s own docstring is blunt about the risk:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Saves the identity to a file. This will write the private key to disk, and
anyone with access to this file will be able to decrypt all communication
for the identity. Be very careful with this method.
— &lt;code&gt;RNS/Identity.py&lt;/code&gt;, &lt;code&gt;to_file()&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Practical takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Treat an identity file exactly like an SSH private key: don&#39;t commit it,
don&#39;t email it, restrict its file permissions. This is why
&lt;code&gt;.lxmf_identities/&lt;/code&gt; was added to &lt;code&gt;.gitignore&lt;/code&gt; in this repo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pub_to_file(path)&lt;/code&gt; exists separately for saving just the &lt;strong&gt;public&lt;/strong&gt; key,
e.g. to hand your address to someone else without exposing anything secret.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Identity.from_bytes(prv_bytes)&lt;/code&gt; / &lt;code&gt;load_private_key()&lt;/code&gt; exist for
lower-level cases, but the docstring explicitly warns never to feed them
random data to &amp;quot;generate&amp;quot; a key — always use &lt;code&gt;Identity()&lt;/code&gt; (with
&lt;code&gt;create_keys=True&lt;/code&gt;, the default) to actually generate new keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;forward-secrecy-via-ratchets&quot;&gt;Forward secrecy via ratchets&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A long-term Identity key by itself gives no forward secrecy — if it&#39;s ever
compromised, all past traffic encrypted to it could theoretically be
decrypted. Reticulum addresses this with &lt;strong&gt;ratchets&lt;/strong&gt;: short-lived X25519 keys
that rotate automatically and are used instead of the long-term key for actual
message encryption when available (&lt;code&gt;RNS/Identity.py&lt;/code&gt;, &lt;code&gt;RATCHETSIZE&lt;/code&gt;,
&lt;code&gt;RATCHET_EXPIRY&lt;/code&gt; — defaults to rotating and expiring ratchets after 30 days).&lt;/li&gt;
&lt;li&gt;Real LXMF delivery destinations turn this on via
&lt;code&gt;Destination.enable_ratchets(path)&lt;/code&gt;, called from
&lt;code&gt;LXMRouter.register_delivery_identity()&lt;/code&gt; in &lt;code&gt;LXMF/LXMRouter.py&lt;/code&gt; — ratchet keys
are persisted separately from the identity file, under the router&#39;s
&lt;code&gt;storagepath/ratchets/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note on our demo scripts&lt;/strong&gt;: &lt;code&gt;lxmf_qr.py&lt;/code&gt;/&lt;code&gt;qr_lxmf.py&lt;/code&gt; build a bare
&lt;code&gt;RNS.Destination&lt;/code&gt; directly (no &lt;code&gt;LXMRouter&lt;/code&gt;, no ratchets enabled), so the paper
message they produce is encrypted with the static identity key only, not a
ratchet. That&#39;s an accurate reflection of how LXMF paper messages actually work
(they&#39;re meant to be decryptable offline, so they can&#39;t depend on ratchet state
that only exists in a live router), but it&#39;s worth knowing that a normal,
online LXMF conversation gets an extra layer of forward secrecy that a
paper/QR message doesn&#39;t.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;key-management-tools&quot;&gt;Key management tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rnid&lt;/code&gt; — the command-line identity management and encryption utility that
ships with &lt;code&gt;rns&lt;/code&gt;. Run &lt;code&gt;rnid --help&lt;/code&gt; (after &lt;code&gt;pip install rns&lt;/code&gt;) to see its
options for generating, inspecting, and using identities from the shell. Covered in
the &amp;quot;Included Utility Programs&amp;quot; section of the manual link above.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;suggested-reading-order&quot;&gt;Suggested reading order&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Reticulum manual — &amp;quot;Getting Started Fast&amp;quot; (for the big picture).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RNS/Identity.py&lt;/code&gt; in this venv (&lt;code&gt;venv/lib/python3.11/site-packages/RNS/Identity.py&lt;/code&gt;) —
read &lt;code&gt;to_file&lt;/code&gt;, &lt;code&gt;from_file&lt;/code&gt;, &lt;code&gt;enable_ratchets&lt;/code&gt;-related code, and the class
docstring at the top.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LXMF/LXMRouter.py&lt;/code&gt;, &lt;code&gt;register_delivery_identity()&lt;/code&gt; — how a real LXMF app
(not just our paper-message demo) sets up its identity and ratchets.&lt;/li&gt;
&lt;li&gt;The Reticulum manual&#39;s cryptographic primitives section (bundled in the &lt;code&gt;rns&lt;/code&gt;
package&#39;s own README/METADATA) for the exact algorithms in use.&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>F4HWN Fusion Firmware on a $30 radio</title>
    <link href="https://example.com/blog/F4HWN/foxHunt1/" />
    <updated>2026-08-15T00:00:00Z</updated>
    <id>https://example.com/blog/F4HWN/foxHunt1/</id>
    <content type="html">&lt;p&gt;Last month &lt;a href=&quot;https://www.grothe.us/presentations/&quot;&gt;Aaron&lt;/a&gt; gave a talk on &lt;a href=&quot;https://www.grothe.us/presentations/aarc-202607-alt-firmwares.pdf&quot;&gt;Alternative Radio Firmwares&lt;/a&gt;. On Thursday, at the pub, I installed &lt;a href=&quot;https://github.com/armel/uv-k1-k5v3-firmware-custom&quot;&gt;F4HWN firmware port for the UV-K1 and UV-K5 V3 using the PY32F071 MCU&lt;/a&gt; which works with the &lt;a href=&quot;https://www.amazon.com/dp/B0CB8XXBH4&quot;&gt;QUANSHENG UV-K5 v3&lt;/a&gt; $28 hand held radio.  I&#39;m very excited and curious to try out &lt;a href=&quot;https://www.reddit.com/r/F4HWN/comments/1vdwzwn/fusion_580_fox_hunt/&quot;&gt;Fox Hunt Mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://example.com/blog/F4HWN/foxHunt1/eWjv4fuMq3-1080.avif 1080w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://example.com/blog/F4HWN/foxHunt1/eWjv4fuMq3-1080.webp 1080w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://example.com/blog/F4HWN/foxHunt1/eWjv4fuMq3-1080.png&quot; alt=&quot;screen grab from web viewer&quot; width=&quot;1080&quot; height=&quot;722&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;33-aioc-to-used-to-install&quot;&gt;&lt;a href=&quot;https://na6d.com/products/aioc-ham-radio-all-in-one-cable&quot;&gt;$33 AIOC&lt;/a&gt; to used to install&lt;/h3&gt;
&lt;p&gt;I&#39;m happy to meet with you and use my AIOC to install the firmware on your radio.&lt;/p&gt;
&lt;a href=&quot;https://youtube.com/shorts/AsyAZbgDQwo?is=Qw4caHD_xKpirFJ6&quot;&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://example.com/blog/F4HWN/foxHunt1/9uXGOGy9qh-176.avif 176w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://example.com/blog/F4HWN/foxHunt1/9uXGOGy9qh-176.webp 176w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://example.com/blog/F4HWN/foxHunt1/9uXGOGy9qh-176.png&quot; alt=&quot;AIOC install video thumbnail&quot; width=&quot;176&quot; height=&quot;108&quot;&gt;&lt;/picture&gt;&lt;/p&gt;&lt;/a&gt;&lt;p&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>What is in my radio log?</title>
    <link href="https://example.com/blog/RadioLog1/" />
    <updated>2026-08-13T00:00:00Z</updated>
    <id>https://example.com/blog/RadioLog1/</id>
    <content type="html">&lt;p&gt;Claude.ai created some easy to use python scripts that put my logs into SQLite. Once the contacts are in a real database, asking questions about them is just SQL instead of scrolling through a spreadsheet.&lt;/p&gt;
&lt;p&gt;One of the summaries that pleases me includes contacts outside of CONUS:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Confirmed QSOs outside the USA entity, by country (confirmation source: qsl_rcvd, lotw_qsl_rcvd, eqsl_qsl_rcvd, app_qrzlog_status)

Country               QSOs  Stations
------------------  ------  --------
Canada                  57        53
Japan                   25        24
France                   7         7
Netherlands              5         5
Angola                   4         1
Chile                    4         3
Dominican Republic       4         4
Germany                  4         4
Italy                    4         4
Puerto Rico              4         4
Spain                    4         4
Brazil                   3         3
Alaska                   2         2
Belize                   2         2
England                  2         2
Northern Ireland         2         2
Poland                   2         2
Switzerland              2         2
Argentina                1         1
Asiatic Russia           1         1
Belgium                  1         1
China                    1         1
Costa Rica               1         1
Cuba                     1         1
Czech Republic           1         1
Dodecanese               1         1
Ecuador                  1         1
El Salvador              1         1
European Russia          1         1
Greece                   1         1
Guam                     1         1
Hungary                  1         1
Indonesia                1         1
Lebanon                  1         1
Luxembourg               1         1
Norway                   1         1
Portugal                 1         1
Romania                  1         1
Sardinia                 1         1
Serbia                   1         1
Ukraine                  1         1
Wales                    1         1
------------------  ------  --------
TOTAL                  161  42 country(s)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;161 confirmed QSOs across 42 countries, with Canada and Japan leading the way. Angola sitting at 4 QSOs from a single station stands out too.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>How does VHF propagation get measured?</title>
    <link href="https://example.com/blog/VHFpropagation/" />
    <updated>2026-07-23T00:00:00Z</updated>
    <id>https://example.com/blog/VHFpropagation/</id>
    <content type="html">&lt;p&gt;Thanks to Jim KX0U for showing me &lt;a href=&quot;https://vhf.dxview.org/map?center=40.35,-95.23,7.0&quot;&gt;vhf.dxview.org&lt;/a&gt;. It&#39;s a live map that colors the country by how far VHF signals are getting out right now — greens and yellows where things are normal, oranges and reds where the band is open. That&#39;s a great picture, but it left me wondering: where does that data actually come from? Nobody is out there with a signal generator sweeping the whole country every hour.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://example.com/blog/VHFpropagation/0FWXNWWmHb-1806.avif 1806w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://example.com/blog/VHFpropagation/0FWXNWWmHb-1806.webp 1806w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://example.com/blog/VHFpropagation/0FWXNWWmHb-1806.png&quot; alt=&quot;alt text&quot; width=&quot;1806&quot; height=&quot;1010&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;the-trick-use-the-traffic-thats-already-there&quot;&gt;The trick: use the traffic that&#39;s already there&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://vhf.dxview.org/&quot;&gt;VHF map&lt;/a&gt; doesn&#39;t run its own beacons. Instead it listens to a network that&#39;s already broadcasting all day long — &lt;a href=&quot;https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System&quot;&gt;APRS&lt;/a&gt;, the Automatic Packet Reporting System.&lt;/p&gt;
&lt;p&gt;APRS stations sit on 144.390 MHz (here in North America) and send short packets: position beacons, weather data, messages, and digipeater IDs. Thousands of them are transmitting around the clock. Every one of those packets is a tiny, timestamped, geolocated propagation test that somebody already paid for.&lt;/p&gt;
&lt;h2 id=&quot;how-a-packet-becomes-a-data-point&quot;&gt;How a packet becomes a data point&lt;/h2&gt;
&lt;p&gt;Here&#39;s the chain:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;A station transmits a packet.&lt;/strong&gt; It contains the sender&#39;s callsign and, usually, its position (or a known fixed location).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Another station hears it and gates it to the internet.&lt;/strong&gt; These are &lt;a href=&quot;https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System&quot;&gt;I-gates&lt;/a&gt; (Internet gateways). When an I-gate copies a packet off the air, it forwards it to &lt;strong&gt;APRS-IS&lt;/strong&gt;, the internet backbone of the APRS network, and stamps it with &lt;em&gt;its own&lt;/em&gt; callsign and location.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Now you have two endpoints.&lt;/strong&gt; The packet knows where it came from (the sender) and where it was received (the I-gate). Both have known coordinates.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&#39;s the whole measurement. A packet that traveled from station A to I-gate B, received in the last hour, means 2 meters supported at least that A-to-B distance at that moment. Most hops are short and local. But when the band opens — tropospheric ducting, a temperature inversion, sporadic-E — I-gates start hearing stations from hundreds of miles away, and those long paths light up.&lt;/p&gt;
&lt;h2 id=&quot;from-dots-to-a-footprint&quot;&gt;From dots to a footprint&lt;/h2&gt;
&lt;p&gt;The map takes all those received paths from the past hour and smooths them into a color-coded footprint. If the longest paths being copied in your area are 50 miles, you&#39;re green. If I-gates near you are suddenly pulling in packets from 300 miles out, that region goes orange to red. It&#39;s not predicting propagation from solar numbers or a model — it&#39;s showing you what &lt;em&gt;actually got through&lt;/em&gt;, reverse-engineered from ordinary APRS traffic.&lt;/p&gt;
&lt;h2 id=&quot;why-this-is-clever&quot;&gt;Why this is clever&lt;/h2&gt;
&lt;p&gt;The same idea powers a lot of ham propagation tools, but with different source data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;HF sibling&lt;/strong&gt; at &lt;a href=&quot;https://hf.dxview.org/&quot;&gt;hf.dxview.org&lt;/a&gt; leans on the &lt;a href=&quot;https://www.reversebeacon.net/&quot;&gt;Reverse Beacon Network&lt;/a&gt; (automated CW and FT8 skimmers) and &lt;a href=&quot;https://pskreporter.info/&quot;&gt;PSK Reporter&lt;/a&gt; instead of APRS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pskreporter.info/&quot;&gt;PSK Reporter&lt;/a&gt; does the same trick for FT8/digital modes: every decoded signal is a spot with two known endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In each case the insight is the same — you don&#39;t need a dedicated beacon network if you&#39;re willing to treat the everyday traffic as your beacons. On VHF, APRS packets are perfect for it: short, frequent, geolocated, and already flooding the internet through I-gates.&lt;/p&gt;
&lt;p&gt;So the next time your position beacon gets gated by a station three states away, you weren&#39;t just showing off — you were a data point telling everyone the band was open.&lt;/p&gt;
&lt;h2 id=&quot;sources&quot;&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vhf.dxview.org/&quot;&gt;VHF Real Time Propagation — vhf.dxview.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hf.dxview.org/&quot;&gt;HF+ Real Time Propagation — hf.dxview.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pskreporter.info/&quot;&gt;PSK Reporter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reversebeacon.net/&quot;&gt;Reverse Beacon Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System&quot;&gt;APRS on Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>QUANSHENG UV-K5</title>
    <link href="https://example.com/blog/UVK5/" />
    <updated>2026-07-21T00:00:00Z</updated>
    <id>https://example.com/blog/UVK5/</id>
    <content type="html">&lt;p&gt;Aaron&#39;s talk about custom firmware inspired me to get a pair of UV-K5 version 3 radios and some AIOCs. Hoping to have fun learning digital modes at my QTH.&lt;/p&gt;
&lt;p&gt;Here&#39;s a long google AI response to the search &amp;quot;quansheng uv-k5 digipi aioc&amp;quot;&lt;/p&gt;
&lt;p&gt;Combining the Quansheng UV-K5, an AIOC (All-In-One Cable), and a DigiPi creates a powerful, budget-friendly portable digital amateur radio hotspot. The AIOC functions as a USB soundcard, serial adapter, and PTT controller, bridging the UV-K5 to the Raspberry Pi running DigiPi. [1, 2, 3, 4]&lt;/p&gt;
&lt;h3 id=&quot;the-components&quot;&gt;The Components&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Quansheng UV-K5: An incredibly versatile and inexpensive handheld transceiver (HT) covering VHF/UHF and airband, which can be modified via custom firmware.&lt;/li&gt;
&lt;li&gt;AIOC: An open-source interface board (also known as &amp;quot;Universal Radio Controller&amp;quot;) that connects to the radio&#39;s dual-pin K1 port on one end and the DigiPi via a single USB-C cable on the other. It handles both audio and PTT flawlessly.&lt;/li&gt;
&lt;li&gt;DigiPi: A project and specialized operating system for the Raspberry Pi (built by KM6LYW) that gives you a web-based portal to run data modes like APRS, Winlink, JS8Call, and FLdigi right from your phone or browser. [3, 12]&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;how-to-set-it-up&quot;&gt;How to Set It Up&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Radio Settings: On the Quansheng, set the volume to around 25% and ensure you have the correct squelch settings configured for digital data.&lt;/li&gt;
&lt;li&gt;AIOC to DigiPi: Connect the AIOC’s twin-prong connector to the radio. Connect the AIOC to the DigiPi’s USB port.&lt;/li&gt;
&lt;li&gt;Initialize DigiPi: Boot up your DigiPi and navigate to the web interface. On the Initialization page, choose your AIOC (typically listed as ) as the radio interface. Enter your callsign, grid square, and APRS settings.&lt;/li&gt;
&lt;li&gt;Firmware (Optional): Many users flash custom firmware (like IJV or DOCK firmware) to the UV-K5 to unlock better performance, like &#39;flat audio&#39; or direct rig control. [19, 20, 21, 22]&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;potential-challenges-to-watch-for&quot;&gt;Potential Challenges to Watch For&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;RF Interference (RFI): Because everything is highly portable, your HT&#39;s transmitted signal can easily feed back into the Raspberry Pi or the AIOC, causing the radio to get stuck in &amp;quot;transmit&amp;quot; mode.&lt;/li&gt;
&lt;li&gt;Fix: Users in the DigiPi forums recommend adding ferrite beads on both ends of your USB cable and physically keeping the radio&#39;s antenna at least 2 meters away from the DigiPi board.&lt;/li&gt;
&lt;li&gt;Audio Levels: Because HTs aren&#39;t strictly designed for continuous-duty digital data, you may need to fine-tune your audio input/output levels using the DigiPi web menu so your signal isn&#39;t over-deviated. [3, 24]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&#39;re building this setup, could you tell me which version of the Raspberry Pi you are using and which digital modes (like APRS, JS8Call, or Winlink) you plan to use? I can help you with your specific configuration files!&lt;/p&gt;
&lt;p&gt;AI responses may include mistakes.&lt;/p&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=nOHxzZ19w7A&quot;&gt;YouTube: APRS for the Quansheng UV-K5! Utilizing The AIOC / All in One Cable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://g1lro.uk/?p=85&quot;&gt;g1lro.uk — DigiPi build notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.patreon.com/posts/digipi-1-9-3-on-123412689&quot;&gt;Patreon — DigiPi 1.9.3 on Raspberry Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://craiger.org/digipi/&quot;&gt;craiger.org — DigiPi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/QUANSHENG-UV-K5-Handheld-Rechargeable-Survival/dp/B0CB8XXBH4&quot;&gt;Amazon — Quansheng UV-K5 handheld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hamimports.com/radio/quansheng-uv-k5/&quot;&gt;hamimports.com — Quansheng UV-K5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://baofengradio.co.uk/quansheng-uv-k5-multi-band-radio/&quot;&gt;baofengradio.co.uk — Quansheng UV-K5 multi-band radio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Quansheng/comments/1ko1v9w/aprs_with_the_uvk58_what_is_the_best_option/&quot;&gt;r/Quansheng — APRS with the UV-K5/8: best option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=hO8kx_4WTUw&quot;&gt;YouTube: AIOC - AUDIO &amp;amp; MICROPHONE SET UP - QUANSHENG DOCK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=rDNKQlGhIrY&quot;&gt;YouTube: LEARNING - AIOC -Universal Radio Controller - &amp;amp; DigiPi Under development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/g/digipi/c/1NfZeLpsT4M&quot;&gt;Google Groups — DigiPi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.facebook.com/groups/hamops/posts/10163083506498840/&quot;&gt;Facebook — HamOps group post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/g/digipi/c/LybQBGjJ37A&quot;&gt;Google Groups — DigiPi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tTx79CtOu_4&quot;&gt;YouTube: Quansheng UV-K5 - Upload Firmware -AIOC Universal Radio Controller Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=m1qb0s_MuMo&quot;&gt;YouTube: Easy &amp;amp; Effective APRS: Using the TOADS Digital Interface &amp;amp; AIOC with DigiPi for a Digipeater &amp;amp; iGate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6KAeJyEz8I8&quot;&gt;YouTube: Every Radio Data Mode on Your Phone!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://g1lro.uk/?p=63&quot;&gt;g1lro.uk — UV-K5 notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lB1puo2FwwU&quot;&gt;YouTube: Amateur Radio DATA HotSpot! Operate with Your Phone! Build &amp;amp; Demo.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tTx79CtOu_4&quot;&gt;YouTube: Quansheng UV-K5 - Upload Firmware -AIOC Universal Radio Controller Box&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=oMhtGjtORUk&quot;&gt;YouTube: Quansheng UV-K5/K6 on M17, DMR, NXDN,... Flat Audio Mod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hampager.de/dokuwiki/doku.php?id=uvk5&quot;&gt;hampager.de — UV-K5 wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=xuUrVQIeFrU&quot;&gt;YouTube: QUANSHENG UV-K5 weak CW/SSB signals improvement ( IJV 2.9 firmware )&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/g/digipi/c/wj50P_zgPR0&quot;&gt;Google Groups — DigiPi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6KAeJyEz8I8&quot;&gt;YouTube: Every Radio Data Mode on Your Phone!&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content>
  </entry>
  <entry>
    <title>Practical Electronics course on YouTube</title>
    <link href="https://example.com/blog/PracticalElectronics/" />
    <updated>2026-07-19T00:00:00Z</updated>
    <id>https://example.com/blog/PracticalElectronics/</id>
    <content type="html">&lt;p&gt;Thanks to the University of Colorado for putting 28 videos from their course on &lt;a href=&quot;https://www.youtube.com/playlist?list=PLNx89373hpKVb3tMPfRMUjmYNkkXohRv9&quot;&gt;Practical Electronics&lt;/a&gt; up. I am eager to learn.&lt;/p&gt;
&lt;p&gt;They also have a 26 lecture playlist from the class &lt;a href=&quot;https://www.youtube.com/playlist?list=PLNx89373hpKVvhoQ3_z_t2KHn-YxgrOYi&quot;&gt;Circuits &amp;amp; Electronics for Non-EEs&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Path Logger, Version 0.01</title>
    <link href="https://example.com/blog/PathLogger1/" />
    <updated>2026-07-18T00:00:00Z</updated>
    <id>https://example.com/blog/PathLogger1/</id>
    <content type="html">&lt;p&gt;&lt;a href=&quot;https://n3pay-2b69c-pl1.web.app/&quot;&gt;https://n3pay-2b69c-pl1.web.app/&lt;/a&gt; is the temporary URL&lt;/p&gt;
&lt;p&gt;Simplex is where the interesting radio happens. No repeater, no linked system, just two stations and whatever the terrain and the antennas will allow. The part I kept wanting to keep track of was not the contact itself but the &lt;em&gt;path&lt;/em&gt; — where I was, where the other station was, and whether that path worked again later.&lt;/p&gt;
&lt;p&gt;So I built Path Logger. Version 0.01 is deliberately small.&lt;/p&gt;
&lt;h2 id=&quot;what-it-does&quot;&gt;What it does&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logs the contact.&lt;/strong&gt; Callsign, date and time, frequency, mode, and signal reports, typed in on the spot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Captures location.&lt;/strong&gt; The browser&#39;s geolocation gives me my position, and I record the other station&#39;s grid or coordinates. That turns a log entry into two endpoints instead of one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maps the path.&lt;/strong&gt; Every logged contact draws a line between the two stations, so a night of simplex work becomes a picture of what actually got out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shares the log.&lt;/strong&gt; Multiple operators can sign in to the same project and see each other&#39;s entries. During a net or a group activation, everyone&#39;s contacts land in one map.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;why-firebase&quot;&gt;Why Firebase&lt;/h2&gt;
&lt;p&gt;I wanted to spend my time on the logging, not on hosting. The free tier covers everything version 1 needs: Firestore for the contact records, Authentication so operators sign in rather than sharing a password, and Hosting to serve the whole thing. No server to patch, no database to back up by hand, and the app is a URL I can open on a phone in the truck.&lt;/p&gt;
&lt;p&gt;The tradeoff is honest: this is somebody else&#39;s platform and somebody else&#39;s quota. For a hobby log of simplex contacts, that&#39;s a trade I&#39;m happy to make. If it outgrows the free tier, exporting Firestore documents to something self-hosted is not a hard problem.&lt;/p&gt;
&lt;h2 id=&quot;what-version-1-is-not&quot;&gt;What version 1 is not&lt;/h2&gt;
&lt;p&gt;It is not a general-purpose logger. There is no ADIF import, no LoTW or QRZ integration, no contest support. If you want a real log, use a real logger. Path Logger exists to answer one question: what paths have worked, from where, on simplex?&lt;/p&gt;
&lt;p&gt;Version 2 ideas, roughly in order of how much I want them: ADIF export, elevation profile along the path, and marking a contact as a repeat so I can see which paths are reliable versus lucky.&lt;/p&gt;
&lt;p&gt;The demo is live — try it and tell me what&#39;s missing.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>TIL from KF0UQM that VoxDMR exists</title>
    <link href="https://example.com/blog/VoxDMR/" />
    <updated>2026-07-10T00:00:00Z</updated>
    <id>https://example.com/blog/VoxDMR/</id>
    <content type="html">&lt;p&gt;It&#39;s great to chat with people you have not met before. Today I learned, from Joe, that &lt;a href=&quot;https://www.reddit.com/r/DMR/comments/1t7joei/voxdmr_a_new_brandmeister_dmr_app_for_windowslinux/&quot;&gt;VoxDMR&lt;/a&gt; exists.&lt;/p&gt;
</content>
  </entry>
</feed>