Merge pull request #106 from thetechprepper/debrand

Debrand
This commit is contained in:
thetechprepper
2026-07-02 12:10:15 -07:00
committed by GitHub
45 changed files with 2070 additions and 19 deletions
+12 -2
View File
@@ -1,7 +1,7 @@
# ETC Regression Tests
- **Build**: ETC R7 Build 1
- **Date**: 16 April 2026
- **Build**: ETC R7 Build 5
- **Date**: 14 June 2026
## Desktop/Launcher Icons
@@ -83,6 +83,7 @@
* [ ] Select RMS gateway => VFO updated
* [ ] Connect
* [ ] wwv
* [ ] reticulum
## Bluetooth TNC
@@ -141,3 +142,12 @@
* [ ] `offline` folder on Desktop
* [ ] Check `nets` folder for `amrron` and `ghostnet`
* [ ] Test gpg signature verifcation (see gpg crypto doc)
## LoRa
* [ ] LoRa listed in Conky
* [ ] Heltec v4 PnP
* [ ] et-reticulum
* [ ] All blueprints
* [ ] All permutations of radios and LoRa connected/disconnected
+19
View File
@@ -0,0 +1,19 @@
# To-Do
* [ ] Add Reticulum
* [ ] Add solution for handling first start
* [ ] et-user-backup
* [ ] ~/.reticulum/storage/identities
* [ ] ~/.nomadnetwork/storage
* [ ] Add PnP support for LoRa devices
* [ ] Add support for Bluetooth devices (et-uv-pro)
* [ ] et-mail
* [ ] et-debug
* [ ] et-index
* [ ] See email: "Found on Discord GPS issue"
* [ ] Fix dial frequency
* [ ] Update rmslist.csv (et-data-winlink)
* Add radio support
* [ ] TX500MP + LINK500MP
* [ ] IC-7300 MkII
* [ ] Thunderbird (Optional)
+2
View File
@@ -3,6 +3,8 @@
# Updated : 16 April 2026
# Description : bash profile
export PATH="$HOME/.local/bin:$PATH"
# All user accounts should be in the 'et-data' group to allow data sharing with
# EmComm Tools. A umask of 002 is required to allow users and the system to
# read and write shared data files.
@@ -0,0 +1,21 @@
# Author : Gaston Gonzalez
# Date : 28 June 2026
# Updated : 30 June 2026
# Purpose : User systemd unit file for EmComm Tools that starts modem73
# : in a default configuration.
#
# Usage:
# Check status : systemctl --user status et-service-modem73-default
# Start service : systemctl --user start et-service-modem73-default
# Stop service : systemctl --user stop et-service-modem73-default
# Reload this config : systemctl --user daemon-reload
[Unit]
Description=EmComm Tools modem73 default service for balanced performance
[Service]
ExecStart=/opt/emcomm-tools/bin/et-modem73 balanced --headless
Restart=no
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,20 @@
# Author : Gaston Gonzalez
# Date : 30 June 2026
# Purpose : User systemd unit file for EmComm Tools that starts modem73
# : in a fast configuration.
#
# Usage:
# Check status : systemctl --user status et-service-modem73-fast
# Start service : systemctl --user start et-service-modem73-fast
# Stop service : systemctl --user stop et-service-modem73-fast
# Reload this config : systemctl --user daemon-reload
[Unit]
Description=EmComm Tools modem73 service for fast performance
[Service]
ExecStart=/opt/emcomm-tools/bin/et-modem73 fast --headless
Restart=no
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,20 @@
# Author : Gaston Gonzalez
# Date : 30 June 2026
# Purpose : User systemd unit file for EmComm Tools that starts modem73
# : in a faster configuration.
#
# Usage:
# Check status : systemctl --user status et-service-modem73-faster
# Start service : systemctl --user start et-service-modem73-faster
# Stop service : systemctl --user stop et-service-modem73-faster
# Reload this config : systemctl --user daemon-reload
[Unit]
Description=EmComm Tools modem73 service for faster performance
[Service]
ExecStart=/opt/emcomm-tools/bin/et-modem73 faster --headless
Restart=no
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,20 @@
# Author : Gaston Gonzalez
# Date : 30 June 2026
# Purpose : User systemd unit file for EmComm Tools that starts modem73
# : in a fastest configuration.
#
# Usage:
# Check status : systemctl --user status et-service-modem73-fastest
# Start service : systemctl --user start et-service-modem73-fastest
# Stop service : systemctl --user stop et-service-modem73-fastest
# Reload this config : systemctl --user daemon-reload
[Unit]
Description=EmComm Tools modem73 service for fastest performance
[Service]
ExecStart=/opt/emcomm-tools/bin/et-modem73 fastest --headless
Restart=no
[Install]
WantedBy=multi-user.target
@@ -0,0 +1,20 @@
# Author : Gaston Gonzalez
# Date : 30 June 2026
# Purpose : User systemd unit file for EmComm Tools that starts modem73
# : in a reliability configuration.
#
# Usage:
# Check status : systemctl --user status et-service-modem73-reliability
# Start service : systemctl --user start et-service-modem73-reliability
# Stop service : systemctl --user stop et-service-modem73-reliability
# Reload this config : systemctl --user daemon-reload
[Unit]
Description=EmComm Tools modem73 service for reliable performance
[Service]
ExecStart=/opt/emcomm-tools/bin/et-modem73 reliability --headless
Restart=no
[Install]
WantedBy=multi-user.target
+9 -8
View File
@@ -18,33 +18,34 @@ conky.config = {
conky.text = [[
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}DATE/TIME
${font DejaVu Sans Mono:size=11}${color yellow}${alignc}${time %A, %B %d %Y}
${font DejaVu Sans Mono:size=10}${color yellow}${alignc}${time %A, %B %d %Y}
Local: ${alignr}${time %H:%M:%S}
UTC: ${alignr}${tztime UTC %H:%M:%S}
GPS Time: ${alignr}${execpi 30 et-system-info et-time}
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}SYSTEM
${font DejaVu Sans Mono:size=11}${color yellow}Uptime : ${uptime}
${font DejaVu Sans Mono:size=10}${color yellow}Uptime : ${uptime}
CPU Util : ${cpu}%
Disk Free: ${fs_free /}
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}NETWORK
${font DejaVu Sans Mono:size=11}${color yellow}IP: ${execpi 60 /opt/emcomm-tools/bin/et-system-info ip}
${font DejaVu Sans Mono:size=10}${color yellow}IP: ${execpi 60 /opt/emcomm-tools/bin/et-system-info ip}
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}INTERFACES
${font DejaVu Sans Mono:size=11}${color yellow}Radio: ${execpi 10 et-system-info active-radio}
${font DejaVu Sans Mono:size=10}${color yellow}Radio: ${execpi 10 et-system-info active-radio}
CAT : ${execpi 10 et-system-info et-cat}
GPS : ${execpi 10 et-system-info et-gps}
Audio: ${execpi 10 et-system-info et-audio}
${if_existing /dev/et-sdr}SDR : ${execpi 10 et-system-info et-sdr}${endif}
SDR : ${execpi 10 et-system-info et-sdr}
LoRa : ${execpi 10 et-system-info et-lora}
${font DejaVu Sans:bold:size=10}${color #8d5133}${alignc}OPERATOR
${font DejaVu Sans Mono:size=11}${color yellow}Callsign: ${execpi 10 et-system-info callsign}
${font DejaVu Sans Mono:size=10}${color yellow}Callsign: ${execpi 10 et-system-info callsign}
Grid : ${execpi 10 et-system-info grid}
${font DejaVu Sans:bold:size=10}${color white}${alignc}MODE
${font DejaVu Sans:bold:size=11}${color red}${alignc}${execpi 10 et-system-info et-mode}
${font DejaVu Sans:bold:size=10}${color red}${alignc}${execpi 10 et-system-info et-mode}
${font DejaVu Sans:bold:size=9}${color grey}${alignc}${execp /opt/emcomm-tools/bin/et-system-info release}
${font DejaVu Sans:bold:size=8}${color grey}${alignc}${execp /opt/emcomm-tools/bin/et-system-info release}
]];
+334
View File
@@ -0,0 +1,334 @@
# This is the default Nomad Network config file.
# You should probably edit it to suit your needs and use-case,
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
destination = file
[client]
enable_client = yes
user_interface = text
downloads_path = ~/Downloads
notify_on_new_message = yes
# By default, the peer is announced at startup
# to let other peers reach it immediately.
announce_at_start = yes
# By default, the client will try to deliver a
# message via the LXMF propagation network, if
# a direct delivery to the recipient is not
# possible.
try_propagation_on_send_fail = yes
# Nomadnet will periodically sync messages from
# LXMF propagation nodes by default, if any are
# present. You can disable this if you want to
# only sync when manually initiated.
periodic_lxmf_sync = yes
# The sync interval in minutes. This value is
# equal to 6 hours (360 minutes) by default.
lxmf_sync_interval = 360
# By default, automatic LXMF syncs will only
# download 8 messages at a time. You can change
# this number, or set the option to 0 to disable
# the limit, and download everything every time.
lxmf_sync_limit = 8
# You can specify a required stamp cost for
# inbound messages to be accepted. Specifying
# a stamp cost will require untrusted senders
# that message you to include a cryptographic
# stamp in their messages. Performing this
# operation takes the sender an amount of time
# proportional to the stamp cost. As a rough
# estimate, a stamp cost of 8 will take less
# than a second to compute, and a stamp cost
# of 20 could take several minutes, even on
# a fast computer.
required_stamp_cost = None
# You can signal stamp requirements to senders,
# but still accept messages with invalid stamps
# by setting this option to True.
accept_invalid_stamps = False
# The maximum accepted unpacked size for mes-
# sages received directly from other peers,
# specified in kilobytes. Messages larger than
# this will be rejected before the transfer
# begins.
max_accepted_size = 500
# The announce stream will only show one entry
# per destination or node by default. You can
# change this to show as many announces as have
# been received, for every destination.
compact_announce_stream = yes
[textui]
# Amount of time to show intro screen
intro_time = 1
# You can specify the display theme.
# theme = light
theme = dark
# Specify the number of colors to use
# valid colormodes are:
# monochrome, 16, 88, 256 and 24bit
#
# The default is a conservative 256 colors.
# If your terminal does not support this,
# you can lower it. Some terminals support
# 24 bit color.
# colormode = monochrome
# colormode = 16
# colormode = 88
colormode = 256
# colormode = 24bit
# By default, unicode glyphs are used. If
# you have a Nerd Font installed, you can
# enable this for a better user interface.
# You can also enable plain text glyphs if
# your terminal doesn't support unicode.
# glyphs = plain
glyphs = unicode
# glyphs = nerdfont
# You can specify whether mouse events
# should be considered as input to the
# application. On by default.
mouse_enabled = True
# What editor to use for editing text.
editor = nano
# If you don't want the Guide section to
# show up in the menu, you can disable it.
hide_guide = no
[node]
# Whether to enable node hosting
enable_node = no
# The node name will be visible to other
# peers on the network, and included in
# announces.
node_name = None
# Automatic announce interval in minutes.
# 6 hours by default.
announce_interval = 360
# Whether to announce when the node starts.
announce_at_start = Yes
# When Nomad Network is hosting a page-serving
# node, it can also act as an LXMF propagation
# node. This is a convenient feature that lets
# you easily set up and run a propagation node
# on the network, but it is not as fully
# featured as using the lxmd program to host a
# propagation node. For complete control and
# flexibility, use lxmd to run a PN. For a
# small local system or network, the built-in
# PN functionality will suffice for most cases.
#
# If there is already a large amount of
# propagation nodes on the network, or you
# simply want to run a pageserving-only node,
# you should disable running a propagation node.
# Due to lots of propagation nodes being
# available, this is currently the default.
disable_propagation = Yes
# For clients and other propagation nodes
# delivering messages via this node, you can
# configure the minimum required propagation
# stamp costs. All messages delivered to the
# propagation node network must have a valid
# propagation stamp, or they will be rejected.
# Clients automatically detect the stamp cost
# for the node they are delivering to, and
# compute a corresponding stamp before trying
# to deliver the message to the propagation
# node.
#
# Propagation stamps are easier to verify in
# large batches, and therefore also somewhat
# easier to compute for the senders. As such,
# a reasonable propagation stamp cost should
# be a bit higher than the normal peer-to-peer
# stamp costs.
#
# Propagation stamps does not incur any extra
# load for propagation nodes processing them,
# since they are only required to verify that
# they are correct, and only the generation
# is computationally costly. Setting a sensible
# propagation stamp cost (and periodically
# checking the average network consensus) helps
# keep spam and misuse out of the propagation
# node network.
propagation_cost = 16
# The maximum amount of storage to use for
# the LXMF Propagation Node message store,
# specified in megabytes. When this limit
# is reached, LXMF will periodically remove
# messages in its message store. By default,
# LXMF prioritises keeping messages that are
# new and small. Large and old messages will
# be removed first. This setting is optional
# and defaults to 2 gigabytes.
# message_storage_limit = 2000
# The maximum accepted transfer size per in-
# coming propagation message, in kilobytes.
# This sets the upper limit for the size of
# single messages accepted onto this node.
max_transfer_size = 256
# The maximum accepted transfer size per in-
# coming propagation node sync.
#
# If a node wants to propagate a larger number
# of messages to this node, than what can fit
# within this limit, it will prioritise sending
# the smallest messages first, and try again
# with any remaining messages at a later point.
max_sync_size = 10240
# You can tell the LXMF message router to
# prioritise storage for one or more
# destinations. If the message store reaches
# the specified limit, LXMF will prioritise
# keeping messages for destinations specified
# with this option. This setting is optional,
# and generally you do not need to use it.
# prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf
# You can configure the maximum number of other
# propagation nodes that this node will peer
# with automatically. The default is 20.
# max_peers = 20
# You can configure a list of static propagation
# node peers, that this node will always be
# peered with, by specifying a list of
# destination hashes.
# static_peers = e17f833c4ddf8890dd3a79a6fea8161d, 5a2d0029b6e5ec87020abaea0d746da4
# You can specify the interval in minutes for
# rescanning the hosted pages path. By default,
# this option is disabled, and the pages path
# will only be scanned on startup.
# page_refresh_interval = 0
# You can specify the interval in minutes for
# rescanning the hosted files path. By default,
# this option is disabled, and the files path
# will only be scanned on startup.
# file_refresh_interval = 0
[printing]
# You can configure Nomad Network to print
# various kinds of information and messages.
# Printing messages is disabled by default
print_messages = No
# You can configure a custom template for
# message printing. If you uncomment this
# option, set a path to the template and
# restart Nomad Network, a default template
# will be created that you can edit.
# message_template = ~/.nomadnetwork/print_template_msg.txt
# You can configure Nomad Network to only
# print messages from trusted destinations.
# print_from = trusted
# Or specify the source LXMF addresses that
# will automatically have messages printed
# on arrival.
# print_from = 76fe5751a56067d1e84eef3e88eab85b, 0e70b5848eb57c13154154feaeeb89b7
# Or allow printing from anywhere, if you
# are feeling brave and adventurous.
# print_from = everywhere
# You can configure the printing command.
# This will use the default CUPS printer on
# your system.
print_command = lp
# You can specify what printer to use
# print_command = lp -d [PRINTER_NAME]
# Or specify more advanced options. This
# example works well for small thermal-
# roll printers:
# print_command = lp -d [PRINTER_NAME] -o cpi=16 -o lpi=8
# This one is more suitable for full-sheet
# printers. It will print a QR code at the center of any media
# your printer will accept, print in portrait mode, and move the message to
# the top of the print queue:
# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=Custom.75x75mm -o orientation-requested=3
# But you can modify the size to fit your needs.
# The custom media option accepts millimeters, centimeters, and
# inches in a width by length format like so:
# -o media=Custom.[WIDTH]x[LENGTH][mm,cm,in]
#
# The job priority option accepts 1-100, though you can remove it
# entirely if you aren't concerned with a print queue:
# -o job-priority=[1-100]
#
# Finally, the orientation option allows for 90 degree rotations beginning with 3, so:
# -o orientation-requested=4 (landscape, 90 degrees)
# -o orientation-requested=5 (reverse portrait, 180 degrees)
#
# Here is the full command with the recommended customizable variables:
# print_command = lp -d [PRINTER_NAME] -o job-priority=[N] -o media=[MEDIA_SIZE] -o orientation-requested=[N] -o sides=one-sided
# For example, here's a configuration for USB thermal printer that uses the POS-58 PPD driver
# with rolls 47.98x209.9mm in size:
# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=custom_47.98x209.9mm_47.98x209.9mm -o sides=one-sided
+44
View File
@@ -0,0 +1,44 @@
# Emcomm Tools Configuration for Reticulum
EmComms Tools provides plug-and-play support to reduce the barrier to
entry for non-technical users. Reticulum is a very powerful tool for
building user-defined networks. This has the effect of allowing for
users to create sophisticated, end-to-end encrypted networks that can
leverage many different transport mediums. While this is powerful, it
has the potential for introducing complexity for new users.
This document describes the approach that EmComm Tools takes for
supporting plug-and-play support with near-zero configuration.
## Blueprint Configuration Files
EmComm Tools uses a _blueprint_ approach for defining a set of reference
network configurations to help new users get started.
config.blueprint.permanent-transport-node
## Replacement Tokens
Replacement tokens are defined by `{{TOKEN}}` where `TOKEN` is one of
the supported tokens below.
```
ET_CALLSIGN
ET_RETICULUM_INTERFACE_AUTO_ENABLED
ET_RETICULUM_INTERFACE_AX25KISS_ENABLED
ET_RETICULUM_INTERFACE_MODEM73_ENABLED
ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH
ET_RETICULUM_INTERFACE_RNODE_CODINGRATE
ET_RETICULUM_INTERFACE_RNODE_ENABLED
ET_RETICULUM_INTERFACE_RNODE_FREQUENCY
ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR
ET_RETICULUM_INTERFACE_RNODE_TXPOWER
...
```
* Valid characters are capitalized letters (`A-Z`) and underscores (`_`).
* Start with the prefix: `ET_`.
* Reticulum specific tokens start with the prefix: `ET_RETICULUM_`.
@@ -0,0 +1,125 @@
# Author : Gaston Gonzalez
# Date : 18 June 2026
# Blueprint : Internet client only
# Purpose : This configuration is a blueprint for running a node that
# connects to a gateway node over the Internet using the
# TCPClientInterface.
[reticulum]
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# This should only be done for systems that are suited to
# act as transport nodes, ie. if they are stationary and
# always-on. This directive is optional and can be removed
# for brevity.
enable_transport = False
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify different
# instance names for each. On platforms supporting domain
# sockets, this can be done with the instance_name option:
instance_name = default
# Some platforms don't support domain sockets, and if that
# is the case, you can isolate different instances by
# specifying a unique set of ports for each:
# shared_instance_port = 37428
# instance_control_port = 37429
# If you want to explicitly use TCP for shared instance
# communication, instead of domain sockets, this is also
# possible, by using the following option:
# shared_instance_type = tcp
# You can configure whether Reticulum should discover
# available interfaces from other Transport Instances over
# the network. If this option is enabled, Reticulum will
# collect interface information discovered from the network.
# discover_interfaces = No
# You can configure Reticulum to panic and forcibly close
# if an unrecoverable interface error occurs, such as the
# hardware device for an interface disappearing. This is
# an optional directive, and can be left out for brevity.
# This behaviour is disabled by default.
# panic_on_interface_error = No
# If you're connecting to a large external network, you
# can use one or more external blackhole list to block
# spammy and excessive announces onto your network. This
# funtionality is especially useful if you're hosting public
# entrypoints or gateways. The list source below provides a
# functional example, but better, more timely maintained
# lists probably exist in the community.
# blackhole_sources = 521c87a83afb8f29e4455e77930b973b
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
# The interfaces section defines the physical and virtual
# interfaces Reticulum will use to communicate on. This
# section will contain examples for a variety of interface
# types. You can modify these or use them as a basis for
# your own config, or simply remove the unused ones.
[interfaces]
# This interface enables communication with other
# link-local Reticulum nodes over UDP. It does not
# need any functional IP infrastructure like routers
# or DHCP servers, but will require that at least link-
# local IPv6 is enabled in your operating system, which
# should be enabled by default in almost any OS. See
# the Reticulum Manual for more configuration options.
[[Default Interface]]
type = AutoInterface
enabled = no
[[TCP Client to TTP Gateway]]
type = TCPClientInterface
mode = boundary
enabled = yes
target_host = rns.thetechprepper.com
target_port = 11312
network_name = ttp_internal
passphrase = resistance202606
@@ -0,0 +1,115 @@
# Author : Gaston Gonzalez
# Date : 14 June 2026
# Blueprint : Local network only
# Purpose : This configuration is a blueprint for running a node that
# only interacts with other nodes on the local Ethernet or
# Wi-Fi.
[reticulum]
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# This should only be done for systems that are suited to
# act as transport nodes, ie. if they are stationary and
# always-on. This directive is optional and can be removed
# for brevity.
enable_transport = False
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify different
# instance names for each. On platforms supporting domain
# sockets, this can be done with the instance_name option:
instance_name = default
# Some platforms don't support domain sockets, and if that
# is the case, you can isolate different instances by
# specifying a unique set of ports for each:
# shared_instance_port = 37428
# instance_control_port = 37429
# If you want to explicitly use TCP for shared instance
# communication, instead of domain sockets, this is also
# possible, by using the following option:
# shared_instance_type = tcp
# You can configure whether Reticulum should discover
# available interfaces from other Transport Instances over
# the network. If this option is enabled, Reticulum will
# collect interface information discovered from the network.
# discover_interfaces = No
# You can configure Reticulum to panic and forcibly close
# if an unrecoverable interface error occurs, such as the
# hardware device for an interface disappearing. This is
# an optional directive, and can be left out for brevity.
# This behaviour is disabled by default.
# panic_on_interface_error = No
# If you're connecting to a large external network, you
# can use one or more external blackhole list to block
# spammy and excessive announces onto your network. This
# funtionality is especially useful if you're hosting public
# entrypoints or gateways. The list source below provides a
# functional example, but better, more timely maintained
# lists probably exist in the community.
# blackhole_sources = 521c87a83afb8f29e4455e77930b973b
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
# The interfaces section defines the physical and virtual
# interfaces Reticulum will use to communicate on. This
# section will contain examples for a variety of interface
# types. You can modify these or use them as a basis for
# your own config, or simply remove the unused ones.
[interfaces]
# This interface enables communication with other
# link-local Reticulum nodes over UDP. It does not
# need any functional IP infrastructure like routers
# or DHCP servers, but will require that at least link-
# local IPv6 is enabled in your operating system, which
# should be enabled by default in almost any OS. See
# the Reticulum Manual for more configuration options.
[[Default Interface]]
type = AutoInterface
enabled = Yes
@@ -0,0 +1,136 @@
# Author : Gaston Gonzalez
# Date : 28 June 2026
# Blueprint : Radio-Only Node, transport disabled
# Purpose : This confguration is a blueprint for a radio-only node.
# It uses modem73 as the radio interface. If a supported
# et-lora device is detected, it will be enabled, too.
[reticulum]
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# This should only be done for systems that are suited to
# act as transport nodes, ie. if they are stationary and
# always-on. This directive is optional and can be removed
# for brevity.
enable_transport = False
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify different
# instance names for each. On platforms supporting domain
# sockets, this can be done with the instance_name option:
instance_name = default
# You can configure whether Reticulum should discover
# available interfaces from other Transport Instances over
# the network. If this option is enabled, Reticulum will
# collect interface information discovered from the network.
# discover_interfaces = No
# You can configure Reticulum to panic and forcibly close
# if an unrecoverable interface error occurs, such as the
# hardware device for an interface disappearing. This is
# an optional directive, and can be left out for brevity.
# This behaviour is disabled by default.
# panic_on_interface_error = No
# If you're connecting to a large external network, you
# can use one or more external blackhole list to block
# spammy and excessive announces onto your network. This
# funtionality is especially useful if you're hosting public
# entrypoints or gateways. The list source below provides a
# functional example, but better, more timely maintained
# lists probably exist in the community.
# blackhole_sources = 521c87a83afb8f29e4455e77930b973b
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
[interfaces]
[[Default Interface]]
type = AutoInterface
enabled = No
[[RNode LoRa Interface]]
type = RNodeInterface
mode = roaming
enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}}
port = /dev/et-lora
# Set frequency to 915 MHz
frequency = 915000000
#frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}}
# Set LoRa bandwidth to 125 KHz
bandwidth = 125000
#bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}}
# Set TX power in dBm
#
# 7 dBm = 5 mW
# 10 dBm = 10 mW
# 14 dBm = 25 mW
# 17 dBm = 50 mW
# 20 dBm = 100 mW
# 22 dBm = 158 mW
# 24 dBm = 251 mW
# 27 dBm = 501 mW
# 28 dBm = 631 mW
# 30 dBm = 1000 mW (1 W)
txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}}
# Select spreading factor 8. Valid
# range is 7 through 12, with 7
# being the fastest and 12 having
# the longest range.
spreadingfactor = 9
#spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}}
# Select coding rate 5. Valid range
# is 5 throough 8, with 5 being the
# fastest, and 8 the longest range.
codingrate = 5
#codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}}
[[modem73]]
type = Modem73Interface
mode = roaming
enabled = {{ET_RETICULUM_INTERFACE_MODEM73_ENABLED}}
target_host = 127.0.0.1
target_port = 8001
control_host = 127.0.0.1
control_port = 8073
@@ -0,0 +1,140 @@
# Author : Gaston Gonzalez
# Date : 7 June 2026
# Updated : 28 June 2026
# Blueprint : Radio-Only Node, transport disabled
# Purpose : This confguration is a blueprint for a radio-only node.
# It uses an AX.25 KISS radio interface. If a supported
# et-lora device is detected, it will be enabled, too.
[reticulum]
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# This should only be done for systems that are suited to
# act as transport nodes, ie. if they are stationary and
# always-on. This directive is optional and can be removed
# for brevity.
enable_transport = False
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify different
# instance names for each. On platforms supporting domain
# sockets, this can be done with the instance_name option:
instance_name = default
# You can configure whether Reticulum should discover
# available interfaces from other Transport Instances over
# the network. If this option is enabled, Reticulum will
# collect interface information discovered from the network.
# discover_interfaces = No
# You can configure Reticulum to panic and forcibly close
# if an unrecoverable interface error occurs, such as the
# hardware device for an interface disappearing. This is
# an optional directive, and can be left out for brevity.
# This behaviour is disabled by default.
# panic_on_interface_error = No
# If you're connecting to a large external network, you
# can use one or more external blackhole list to block
# spammy and excessive announces onto your network. This
# funtionality is especially useful if you're hosting public
# entrypoints or gateways. The list source below provides a
# functional example, but better, more timely maintained
# lists probably exist in the community.
# blackhole_sources = 521c87a83afb8f29e4455e77930b973b
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
[interfaces]
[[Default Interface]]
type = AutoInterface
enabled = No
[[Packet Radio AX.25 KISS]]
type = AX25KISSInterface
mode = roaming
enabled = {{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}}
callsign = {{ET_CALLSIGN}}
ssid = 1
port = /tmp/kisstnc
mtu = 256
[[RNode LoRa Interface]]
type = RNodeInterface
mode = roaming
enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}}
port = /dev/et-lora
# Set frequency to 915 MHz
frequency = 915000000
#frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}}
# Set LoRa bandwidth to 125 KHz
bandwidth = 125000
#bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}}
# Set TX power in dBm
#
# 7 dBm = 5 mW
# 10 dBm = 10 mW
# 14 dBm = 25 mW
# 17 dBm = 50 mW
# 20 dBm = 100 mW
# 22 dBm = 158 mW
# 24 dBm = 251 mW
# 27 dBm = 501 mW
# 28 dBm = 631 mW
# 30 dBm = 1000 mW (1 W)
txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}}
# Select spreading factor 8. Valid
# range is 7 through 12, with 7
# being the fastest and 12 having
# the longest range.
spreadingfactor = 9
#spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}}
# Select coding rate 5. Valid range
# is 5 throough 8, with 5 being the
# fastest, and 8 the longest range.
codingrate = 5
#codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}}
@@ -0,0 +1,155 @@
# Author : Gaston Gonzalez
# Date : 7 June 2026
# Updated : 15 June 2026
# Blueprint : Permament Transport Node
# Purpose : This configuration is a blueprint for running a
# node that runs as a 24x7 transport node with
# multiple interfaces.
[reticulum]
# If you enable Transport, your system will route traffic
# for other peers, pass announces and serve path requests.
# This should only be done for systems that are suited to
# act as transport nodes, ie. if they are stationary and
# always-on. This directive is optional and can be removed
# for brevity.
enable_transport = True
# By default, the first program to launch the Reticulum
# Network Stack will create a shared instance, that other
# programs can communicate with. Only the shared instance
# opens all the configured interfaces directly, and other
# local programs communicate with the shared instance over
# a local socket. This is completely transparent to the
# user, and should generally be turned on. This directive
# is optional and can be removed for brevity.
share_instance = Yes
# If you want to run multiple *different* shared instances
# on the same system, you will need to specify different
# instance names for each. On platforms supporting domain
# sockets, this can be done with the instance_name option:
instance_name = default
# You can configure whether Reticulum should discover
# available interfaces from other Transport Instances over
# the network. If this option is enabled, Reticulum will
# collect interface information discovered from the network.
# discover_interfaces = No
# You can configure Reticulum to panic and forcibly close
# if an unrecoverable interface error occurs, such as the
# hardware device for an interface disappearing. This is
# an optional directive, and can be left out for brevity.
# This behaviour is disabled by default.
# panic_on_interface_error = No
# If you're connecting to a large external network, you
# can use one or more external blackhole list to block
# spammy and excessive announces onto your network. This
# funtionality is especially useful if you're hosting public
# entrypoints or gateways. The list source below provides a
# functional example, but better, more timely maintained
# lists probably exist in the community.
# blackhole_sources = 521c87a83afb8f29e4455e77930b973b
[logging]
# Valid log levels are 0 through 7:
# 0: Log only critical information
# 1: Log errors and lower log levels
# 2: Log warnings and lower log levels
# 3: Log notices and lower log levels
# 4: Log info and lower (this is the default)
# 5: Verbose logging
# 6: Debug logging
# 7: Extreme logging
loglevel = 4
[interfaces]
[[Default Interface]]
type = AutoInterface
enabled = Yes
[[Packet Radio AX.25 KISS]]
type = AX25KISSInterface
mode = ap
enabled = {{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}}
callsign = {{ET_CALLSIGN}}
ssid = 1
port = /tmp/kisstnc
mtu = 256
[[RNode LoRa Interface]]
type = RNodeInterface
mode = ap
enabled = {{ET_RETICULUM_INTERFACE_RNODE_ENABLED}}
port = /dev/et-lora
#port = tcp://192.168.8.200
# Set frequency to 915 MHz
frequency = 915000000
#frequency = {{ET_RETICULUM_INTERFACE_RNODE_FREQUENCY}}
# Set LoRa bandwidth to 125 KHz
bandwidth = 125000
#bandwidth = {{ET_RETICULUM_INTERFACE_RNODE_BANDWIDTH}}
# Set TX power in dBm
#
# 7 dBm = 5 mW
# 10 dBm = 10 mW
# 14 dBm = 25 mW
# 17 dBm = 50 mW
# 20 dBm = 100 mW
# 22 dBm = 158 mW
# 24 dBm = 251 mW
# 27 dBm = 501 mW
# 28 dBm = 631 mW
# 30 dBm = 1000 mW (1 W)
txpower = {{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}}
# Select spreading factor 8. Valid
# range is 7 through 12, with 7
# being the fastest and 12 having
# the longest range.
spreadingfactor = 9
#spreadingfactor = {{ET_RETICULUM_INTERFACE_RNODE_SPREADINGFACTOR}}
# Select coding rate 5. Valid range
# is 5 throough 8, with 5 being the
# fastest, and 8 the longest range.
codingrate = 5
#codingrate = {{ET_RETICULUM_INTERFACE_RNODE_CODINGRATE}}
# EmComm Tools is designed to be an offline platform, so the
# TCP Client interface is left as an example that user must
# configure.
# [[TCP Client]]
# type = TCPClientInterface
# enabled = Yes
# mode = boundary
# # Set the IP address to the remote TCP Server
# target_host = IP_ADDRESS_HERE
# target_port = 4242
# # If the remote TCP Server uses IFAC (Interface Access Codes),
# # set the network_name and passphrase.
# #network_name = NETWORK_NAME_HERE
# #passphrase = PASSPHRASE_HERE
@@ -122,7 +122,8 @@ standard that provides strong security and works well for radio use
due to smaller key sizes.
1. Create a primary key for signing using ECC. Replace FIRSTNAME,
LASTNAME, and EMAIL (keep the < and > characters).
LASTNAME, and EMAIL. NOTE: You MUST keep `<` and `>` characters around
your EMAIL. For example: `John Doe <john.doe@email.com>`.
gpg --quick-generate-key "FIRSTNAME LASTNAME <EMAIL>" ed25519 sign 0
@@ -0,0 +1,102 @@
---
title: Reticulum Setup Notes
date: 2026-02-13
updated: 2026-05-11
author: [The Tech Prepper]
categories: [reticulum]
tags: [reticulum]
---
The following are my personal notes while workthrough an initial evaluation
of Reticulum for use over packet radio.
1. Install Python 3.
```
sudo apt install \
python3 \
python3-pip \
-y
```
2. Add `~/.local/bin` to your PATH.
3. Install Reticulum as a non-priveleged user.
```
python3 -m pip install --user rns
```
4. Verify that the Reticulum daemon is installed correctly.
```
which rnsd
```
4. Start Reticulum. This will start the service and create an initial
configuration file under `.reticulum/config`.
```
rnsd
```
5. Stop the service with `<CTRL>+C`.
6. Edit `~/.reticulum/config` and enable the AX.25 interface by
adding the KISS section below.
```
[interfaces]
# This interface enables communication with other
# link-local Reticulum nodes over UDP. It does not
# need any functional IP infrastructure like routers
# or DHCP servers, but will require that at least link-
# local IPv6 is enabled in your operating system, which
# should be enabled by default in almost any OS. See
# the Reticulum Manual for more configuration options.
# Default local LAN interface (keep this enabled for testing)
[[Default Interface]]
type = AutoInterface
enabled = No
[[Packet Radio AX25 KISS]]
type = AX25KISSInterface
enabled = Yes
callsign = KT7RUN
ssid = 2
port = /tmp/kisstnc
mtu = 256
```
7. Start Dire Wolf. In EmComm Tools, run `et-mode` and select
`bbs-client`.
8. In another terminal, start Reticulum.
```
rnsd
```
If successful, you should see something like the following:
```
$ rnsd
[2026-02-14 12:59:02] [Notice] Serial port /tmp/kisstnc is now open
[2026-02-14 12:59:02] [Notice] Configuring KISS interface parameters...
[2026-02-14 12:59:02] [Notice] KISS interface configured
[2026-02-14 12:59:02] [Notice] Started rnsd version 1.1.3
```
## Install a Message App
1. Install NomadNet.
```
python3 -m pip install --user nomadnet
```
2. Start NomadNet.
```
nomadnet
```
## Add Identity
TODO
+29
View File
@@ -0,0 +1,29 @@
# Author : Gaston Gonzalez
# Date : 14 June 2026
# Purpose : udev rules for supported LoRa devices
#
# Supported Devices
# 1. Heltec v4
# 2. Heltec v3 (disabled due to collection with et-radio devices)
# 3. LilyGO TTGO v2.1
#
# Preconditions:
# 1. LoRa device connected via USB cable
#
# Postconditions:
# 1. /dev/et-lora created
# Heltec v4
SUBSYSTEM=="tty", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", ENV{ET_LORA_DEVICE}=="" \
ACTION=="add", \
ENV{ET_LORA_DEVICE}="Heltec v4" GROUP="dialout", MODE="0660", SYMLINK+="et-lora"
# Heltec v3
# Uses the CP210x so this will collide with radios already supported by et-radio
#SUBSYSTEM=="usb", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", \
# GROUP="dialout", MODE="0660", SYMLINK+="et-lora"
# LilyGO TTGO v2.1
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ENV{ET_LORA_DEVICE}=="" \
ACTION=="add", \
ENV{ET_LORA_DEVICE}="LillyGO TTGO v2.1" GROUP="dialout", MODE="0660", SYMLINK+="et-lora"
+2 -1
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 1 February 2025
# Updated : 16 April 2026
# Updated : 15 June 2026
# Purpose : Common environment variables and functions
# Standardized device paths for supported hardware
@@ -9,6 +9,7 @@ export ET_DEVICE_AUDIO="/dev/et-audio"
export ET_DEVICE_CAT="/dev/et-cat"
export ET_DEVICE_GPS="/dev/et-gps"
export ET_DEVICE_SDR="/dev/et-sdr"
export ET_DEVICE_LORA="/dev/et-lora"
# Standardized configuration locations and files
export ET_HOME="/opt/emcomm-tools"
+8 -3
View File
@@ -2,9 +2,9 @@
#
# Author : Gaston Gonzalez
# Date : 12 November 2024
# Updated : 2 October 2025
# Purpose : Stops all EmComm Tools sound-based services (i.e. modems) and
# amatuer radio applications to ensure a clean start for the next mode.
# Updated : 29 June 2026
# Purpose : Stops all EmComm Tools soundcard-based services (i.e. modems)
# and radio applications to ensure a clean start for the next mode.
stop_pat() {
PS_OUT=$(ps -ef | grep "[p]at http")
@@ -28,6 +28,11 @@ stop_all_services() {
systemctl --user stop et-service-direwolf-aprs-digipeater
systemctl --user stop et-service-direwolf-packet-digipeater
# Stop modem73 with a sledge hammer (belt and suspenders) as the current
# 1.0.7 version can hang on exit.
systemctl --user stop et-service-modem73-default
pkill -9 modem73
# Stop VARA with a sledge hammer
pkill et-winlink
pkill et-vara
+1 -1
View File
@@ -2,7 +2,7 @@
#
# Author : Gaston Gonzalez
# Date : 6 November 2024
# Updated : 16 March 2026
# Updated : 14 June 2026
# Purpose : Configures the system for a specific mode of operation
# Use a simple text file to save the state of the last mode selected
+158
View File
@@ -0,0 +1,158 @@
#!/bin/bash
#
# Author : Gaston Gonzalez
# Date : 30 June 2026
# Purpose : Wrapper script for starting modem73 with PnP support
#
# Preconditions:
# 1. Supported radio and audio interface are connected and properly detected
#
# Postconditions:
# 1. modem73 started with sane defaults
#
# Notes:
#
# modem73 supports many modulation types and configuration options. To
# keep usage simple, only five modulation settings have been configured
# that map to a combination of reliability and speed for most general
# purpose applications.
#
# In all cases, normal frames and 1/2 coding rate is used.
#
# There are faster speeds, but EmComm Tools has the design goal of
# getting the message through and favoring delivery over speed..
MODEM73_CONF_FILE="${HOME}/.config/modem73/settings"
usage() {
echo "usage: $(basename $0) <mode> [options]"
echo " <mode>"
echo " reliability - Max reliability (Slower Speed) [BPSK]"
echo " balanced - Balanced (Reliability and Speed) [QPSK] RECOMMENDED"
echo " fast - Fast (Low Reliability) [8PSK]"
echo " faster - Faster (Lower Reliability) [QAM16]"
echo " fastest - Fastest (Lowest Reliability) [QAM64]"
echo ""
echo " [options]"
echo " --headless - Run modem73 headless"
}
HEADLESS=""
MODE=""
MODE_ARGS=""
CALLSIGN="N0CALL"
for arg in "$@"; do
case "$arg" in
--headless)
HEADLESS="--headless"
;;
reliability|balanced|fast|faster|fastest)
if [[ -n "${MODE}" ]]; then
et-log "Only one mode may be specified."
usage
exit 1
fi
MODE="$arg"
;;
*)
echo "Unknown argument: $arg"
usage
exit 1
;;
esac
done
if [[ -z "${MODE}" ]]; then
et-log "Can't started modem73. Mode not specified."
usage
exit 1
fi
case "${MODE}" in
reliability)
MODE_ARGS="--modulation BPSK --normal --rate 1/2"
;;
balanced)
MODE_ARGS="--modulation QPSK --normal --rate 1/2"
;;
fast)
MODE_ARGS="--modulation 8PSK --normal --rate 1/2"
;;
faster)
MODE_ARGS="--modulation QAM16 --normal --rate 1/2"
;;
fastest)
MODE_ARGS="--modulation QAM64 --normal --rate 1/2"
;;
esac
[[ -z ${ET_LOG_DIR} ]] && ET_LOG_DIR="${HOME}/.local/share/emcomm-tools"
[[ ! -e ${ET_LOG_DIR} ]] && mkdir -p ${ET_LOG_DIR}
start() {
update_config
if [[ $? -eq 0 ]]; then
systemctl is-active --quiet rigctld
if [[ $? -ne 0 ]]; then
et-log "Can't start modem73. rigctld not running. Ensure radio is selected."
notify_user "Can't start modem73. rigctld not running."
exit 1
fi
ALSA_DEVICE=$(et-system-info et-audio-card)
INPUT_AUDIO=$(modem73 --list-audio | grep input | grep $ALSA_DEVICE | cut -d":" -f3)
OUTPUT_AUDIO=$(modem73 --list-audio | grep output| grep $ALSA_DEVICE | cut -d":" -f3)
CMD="modem73 --input-device ${INPUT_AUDIO} --output-device ${OUTPUT_AUDIO} --ptt rigctl --callsign ${CALLSIGN} ${MODE_ARGS} ${HEADLESS}"
et-log "Starting modem73 in mode ${MODE} with: '${CMD}'"
echo
${CMD}
else
et-log "Error configurating modem. Can't start modem73"
exit 1
fi
}
update_config () {
# The modem73 configuration file causes issues when using it in combination with
# command line arguments during manual runs. It is best to remove it before each
# run and drive the modem using only command line arguments.
if [[ -e "${MODEM73_CONF_FILE}" ]]; then
et-log "Removing previous configuration file: ${MODEM73_CONF_FILE}"
rm -v ${MODEM73_CONF_FILE}
fi
et-log "Attempting to start modem73 in mode: '${MODE}'"
[[ -z "$ET_USER_CONFIG" ]] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json"
CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign)
# 1. Check if the symlink was created by the udev rules
if [[ -e /dev/et-audio ]]; then
# 2. Check that this device was properly tagged with the ET_AUDIO env variable with a udev rule
APLAY_OUT=$(arecord -l | grep ET_AUDIO)
if [[ $? -eq 0 ]]; then
# Configure ALSA settings for sound card
/opt/emcomm-tools/bin/et-audio update-config
else
et-log "No ET_AUDIO device detected."
notify_user "Can't start modem73. No ET_AUDIO device detected."
exit 1
fi
else
et-log "No ET_AUDIO device plugged in."
notify_user "Can't start modem73. No supported audio device plugged in."
exit 1
fi
}
start
+229
View File
@@ -0,0 +1,229 @@
#!/bin/bash
#
# Author : Gaston Gonzalez
# Date : 12 May 2026
# Updated : 30 June 2026
# Purpose : Wrapper script for starting Reticulum with PnP support
#
# Preconditions:
# 1. Supported radio and audio interface are connected and properly detected
#
# Postconditions:
# 1. Reticulum configuration updated
# 2. Optional modem started
# 3. Reticulum started
# The current version of modem73 does not alway exit.
cleanup() {
pkill -9 modem73 2>/dev/null || true
}
trap cleanup EXIT INT TERM
. /opt/emcomm-tools/bin/et-common
# Ensure that no other modes are running
et-kill-all
APP="Reticulum"
RETICULUM_CONF_DIR="${HOME}/.reticulum"
RETICULUM_CONF_FILE="${RETICULUM_CONF_DIR}/config"
INTERFACE_RNODE_TXPOWER_DEFAULT=17
options=()
files=()
index=1
while IFS= read -r file; do
name=$(basename "$file")
files[$index]="$name"
options+=("$index" "$name")
((index++))
done < <(find "${HOME}/.reticulum" -type f -name 'config.blueprint.*' | sort)
choice=$(dialog \
--title "Reticulum Configuration" \
--menu "Choose a blueprint:" \
15 60 10 \
"${options[@]}" \
2>&1 >/dev/tty)
EXIT_STATUS=$?
tput sgr0 && clear
if [[ ${EXIT_STATUS} -ne 0 ]]; then
et-log "No blueprint configuration selected"
exit ${EXIT_STATUS}
fi
SELECTED_CONF="${files[$choice]}"
if [[ ! -e "${RETICULUM_CONF_DIR}" ]]; then
et-log "Creating missing configuration directory: ${RETICULUM_CONF_DIR}"
mkdir -p "${RETICULUM_CONF_DIR}"
fi
ACTIVE_CONF_FILE="${RETICULUM_CONF_DIR}/${SELECTED_CONF}"
if [[ ! -e ${ACTIVE_CONF_FILE} ]]; then
et-log "${ACTIVE_CONF_FILE} does not exist."
exit 1
fi
et-log "Using ${ACTIVE_CONF_FILE}"
if [[ -e "${RETICULUM_CONF_FILE}" ]]; then
et-log "Removing previous Reticulum configuration: ${RETICULUM_CONF_FILE}"
rm "${RETICULUM_CONF_FILE}"
fi
et-log "Linking new configuration..."
ln -v -s "${ACTIVE_CONF_FILE}" "${RETICULUM_CONF_FILE}"
############################################################
# Optionally, launch a modem if a radio is connected
############################################################
# If a supported radio is plugged in and detected, it will have the
# rigctld process running automatically.
IS_RADIO_CONNECTED=`ps -ef | grep [r]igctld`
if [[ $? -eq 0 ]]; then
et-log "Radio connected and detected."
modem_options=()
HAS_PACKET_CONFIG=`grep AX25KISSInterface ~/.reticulum/config`
if [[ $? -eq 0 ]]; then
modem_options+=("1200-packet" "1200 baud packet (VHF/UHF)")
modem_options+=("300-packet" "300 baud packet (HF)")
fi
HAS_MODEM73_CONFIG=`grep Modem73Interface ~/.reticulum/config`
if [[ $? -eq 0 ]]; then
modem_options+=("modem73-reliability" "Max reliability (Slower Speed) [BPSK]")
modem_options+=("modem73-balanced" "Balanced (Reliability and Speed) [QPSK] RECOMENDED")
modem_options+=("modem73-fast" "Fast (Low Reliability) [8PSK]")
modem_options+=("modem73-faster" "Faster (Lower Reliability) [QAM16]")
modem_options+=("modem73-fastest" "Fastest (Lowest Reliability) [QAM64]")
fi
modem_choice=$(dialog \
--clear \
--title "Reticulum Configuration" \
--menu "Select a modem" \
13 70 10 \
"${modem_options[@]}" \
2>&1 >/dev/tty)
dialog \
--title "Note on Reticulum" \
--yesno "Reticulum uses end-to-end encryption. Check your local laws and regulations and ensure that you can legally run this mode! Are you sure that you want to run this?" \
0 0
EXIT_STATUS=$?
tput sgr 0 && clear
if [[ ${EXIT_STATUS} -ne 0 ]]; then
et-log "User canceled modem selection. Packet modem will not be started and interface will not be enabled."
else
case ${modem_choice} in
300-packet)
et-log "Starting 300 baud packet modem"
start_and_wait_for_service et-service-direwolf-300
;;
1200-packet)
et-log "Starting 1200 baud packet modem"
start_and_wait_for_service et-service-direwolf-simple
;;
modem73-reliability)
et-log "Starting modem73 in reliability mode"
start_and_wait_for_service et-service-modem73-reliability
;;
modem73-balanced)
et-log "Starting modem73 in balanced mode"
start_and_wait_for_service et-service-modem73-default
;;
modem73-fast)
et-log "Starting modem73 in fast mode"
start_and_wait_for_service et-service-modem73-fast
;;
modem73-faster)
et-log "Starting modem73 in faster mode"
start_and_wait_for_service et-service-modem73-faster
;;
modem73-fastest)
et-log "Starting modem73 in fastest mode"
start_and_wait_for_service et-service-modem73-fastest
;;
*)
et-log "No modem specified"
;;
esac
fi
fi
et-log "Updating configuration for this session..."
############################################################
# MODEM73 interface updates
############################################################
# Enable/disable intereface based on PnP device detection
IS_MODEM73_RUNNING=`ps -ef | grep [m]odem73`
if [[ $? -eq 0 ]]; then
INTERFACE_MODEM73_ENABLED="yes"
else
INTERFACE_MODEM73_ENABLED="no"
fi
sed -i "s|{{ET_RETICULUM_INTERFACE_MODEM73_ENABLED}}|${INTERFACE_MODEM73_ENABLED}|g" ${RETICULUM_CONF_FILE}
############################################################
# AX.25 KISS (Packet Radio) interface updates
############################################################
# Enable/disable intereface based on PnP device detection
if [[ -e /tmp/kisstnc ]]; then
INTERFACE_AX25KISS_ENABLED="yes"
else
INTERFACE_AX25KISS_ENABLED="no"
fi
sed -i "s|{{ET_RETICULUM_INTERFACE_AX25KISS_ENABLED}}|${INTERFACE_AX25KISS_ENABLED}|g" ${RETICULUM_CONF_FILE}
# Update callsign
[[ -z "$ET_USER_CONFIG" ]] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json"
CALLSIGN=$(cat ${ET_USER_CONFIG} | jq -r .callsign)
sed -i "s|{{ET_CALLSIGN}}|${CALLSIGN}|g" ${RETICULUM_CONF_FILE}
############################################################
# RNode (LoRA) interface updates
############################################################
# Enable/disable intereface based on PnP device detection
if [[ -e "${ET_DEVICE_LORA}" ]]; then
INTERFACE_RNODE_ENABLED="yes"
# Determine max power settings
et-log "Connecting to device to determine max power..."
INTERFACE_RNODE_TXPOWER=`rnodeconf -i ${ET_DEVICE_LORA} | awk -F': ' '/Max TX power/ {print $2}' | awk '{print $1}'`
if [[ $? -ne 0 ]]; then
INTERFACE_RNODE_TXPOWER=${INTERFACE_RNODE_TXPOWER_DEFAULT}
et-log "Can't determine max power. Using defaulting ${INTERFACE_RNODE_TXPOWER}."
fi
et-log "Setting max power to ${INTERFACE_RNODE_TXPOWER} dBm."
sed -i "s|{{ET_RETICULUM_INTERFACE_RNODE_TXPOWER}}|${INTERFACE_RNODE_TXPOWER}|g" ${RETICULUM_CONF_FILE}
else
INTERFACE_RNODE_ENABLED="no"
fi
sed -i "s|{{ET_RETICULUM_INTERFACE_RNODE_ENABLED}}|${INTERFACE_RNODE_ENABLED}|g" ${RETICULUM_CONF_FILE}
CMD="rnsd"
et-log "Starting Reticulum: ${CMD}"
${CMD}
+11 -1
View File
@@ -3,7 +3,7 @@
# Author : Gaston Gonzalez
# Author : William McKeehan
# Date : 6 October 2024
# Updated : 5 September 2025
# Updated : 14 June 2025
# Purpose : Utility script for dumping system information
function usage() {
@@ -13,6 +13,7 @@ function usage() {
echo " et-audio - Show state of audio interface"
echo " et-audio-card - Display audio card and device: <card>,<device>"
echo " et-cat - Show state of CAT control interface"
echo " et-lora - Show state of LoRa interface"
echo " et-gps - Show state of GPS interface"
echo " et-time - Show if time is synched via GPS"
echo " et-mode - Show current mode"
@@ -143,6 +144,15 @@ case $1 in
fi
;;
et-lora)
# 1. Check if the symlink was created by the udev rules
if [ -e /dev/et-lora ]; then
echo "Connected";
else
echo "Not connected";
fi
;;
et-sdr)
# 1. Check if the symlink was created by the udev rules
if [ -e /dev/et-sdr ]; then
@@ -0,0 +1,11 @@
[Desktop Entry]
Version=1.0
Name=MeshChat
Comment=MeshChat
Exec=/opt/emcomm-tools/bin/et-meshchat
Icon=/opt/ReticulumMeshChat/logo-chat-bubble.png
Terminal=false
X-MultipleArgs=false
Type=Application
Categories=Radio;
StartupNotify=true
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,15 @@
<div class="header"><h1 class="slidetitle">Offline Aircraft Tracking</h1></div>
<div class="main">
<div class="text">
<div>
<p>et-aircraft provides offline aircraft tracking using supported SDRs like the RTL-SDR. There is no need for an Internet connection. Just plug in your SDR and click the airplane icon on the desktop.</p>
</div>
</div>
<img class="screenshot" src="screenshots/et-aircraft.png" />
</div>
@@ -0,0 +1,15 @@
<div class="header"><h1 class="slidetitle">Radio Email</h1></div>
<div class="main">
<div class="text">
<div>
<p>et-mail provides a streamlined experience for radio based email by taking the guesswork out of which Winlink stations to connect to by incorporating real-time, offline HF prediction. It supports switching transport modes (AX.25, ardop, VARA) with zero configuration and without leaving the application.</p>
</div>
</div>
<img class="screenshot" src="screenshots/et-mail.png" />
</div>
@@ -0,0 +1,15 @@
<div class="header"><h1 class="slidetitle">Offline HF Prediction</h1></div>
<div class="main">
<div class="text">
<div>
<p>et-predict provides offline HF propagation prediction powered by VOACAP, helping operators take the guesswork out of establishing targeted contacts.</p>
</div>
</div>
<img class="screenshot" src="screenshots/et-predict.png" />
</div>
@@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>ubiquity-slideshow-ubuntu</title>
<link href="link/base.css" rel="stylesheet" type="text/css" />
<base target="_blank" />
<script type="text/javascript" src="link-core/jquery.js"></script>
<script type="text/javascript" src="link-core/jquery.cycle.all.js"></script>
<script type="text/javascript" src="link-core/base.js"></script>
<script type="text/javascript">
SLIDESHOW_OPTIONS = {
timeout:50000,
speed:600,
}
</script>
<script type="text/javascript" src="link-core/slideshow.js"></script>
</head>
<body>
<div id="wrapper">
<div id="slideshow">
<div><a href="welcome.html"></a></div>
<div><a href="et-predict.html"></a></div>
<div><a href="et-mail.html"></a></div>
<div><a href="et-aircraft.html"></a></div>
</div>
<div id="controls">
<a class="control-arrow" id="prev-slide" style="display:none;"></a>
<a class="control-arrow" id="next-slide"></a>
<input type="hidden" id="current-slide" />
</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

@@ -0,0 +1,15 @@
<div class="header"><h1 class="slidetitle">Welcome to EmComm Tools</h1></div>
<div class="main wide">
<div class="text">
<div>
<p>Built for off-grid communications and field operations, EmComm Tools provides a ready-to-use environment focused on radio, preparedness, and resilient computing. Here are just a few of the tools and capabilities included in this release.</p>
</div>
</div>
<img class="background" src="links/background.png" />
</div>
+34
View File
@@ -0,0 +1,34 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 7 May 2026
# Updated : 12 May 2026
# Purpose : Debrand Ubuntu
#
# Post Conditions:
# 1. EmComm Tools splash screen displays on Live USB boot
# 2. Installer shows EmComm Tools slideshow
et-log "Debranding Ubuntu..."
et-log "Customizing Installer..."
apt install \
ubiquity-slideshow-ubuntu \
-y
cp -v -r ../overlay/usr/share/ubiquity-slideshow/* /usr/share/ubiquity-slideshow
et-log "Customizing boot screen..."
cp -v -r ../overlay/usr/share/plymouth/* /usr/share/plymouth
# A new kernel is required as the initramfs that Cubic uses is
# based on the base ISO by default.
et-log "Installing latest kernel..."
apt install \
--reinstall \
linux-headers-generic \
linux-image-generic \
-y
# Note: Ensure you select the new kernel on the "Options" screen
# within your Cubic session.
et-log "Rebuilding initramfs..."
update-initramfs -uk all
+55
View File
@@ -0,0 +1,55 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 13 May 2026
# Updated : 23 June 2026
# Purpose : Install MeshChat for Reticulum
set -e
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR
. ./env.sh
. ../overlay/opt/emcomm-tools/bin/et-common
APP=ReticulumMeshChat
VERSION="2.3.0-R7B7"
INSTALL_DIR="/opt/${APP}-${VERSION}"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
LINK_PATH="/opt/${APP}"
DOWNLOAD_FILE="${APP}-v${VERSION}-linux.AppImage"
URL="https://github.com/thetechprepper/reticulum-meshchat/releases/download/${VERSION}/ReticulumMeshChat-v${VERSION}-linux.AppImage"
et-log "Installing ${APP} ${VERSION}..."
if [[ ! -e ${DOWNLOAD_FILE} ]]; then
download_with_retries ${URL} ${DOWNLOAD_FILE}
fi
chmod -v 755 ${DOWNLOAD_FILE}
[[ ! -e "${INSTALL_BIN_DIR}" ]] && mkdir -v -p "${INSTALL_BIN_DIR}"
mv ${DOWNLOAD_FILE} ${INSTALL_BIN_DIR}
ET_WRAPPER_SCRIPT="${ET_HOME}/bin/et-meshchat"
et-log "Creating wrapper script: ${ET_WRAPPER_SCRIPT}"
cat <<EOF > ${ET_WRAPPER_SCRIPT}
#!/bin/bash
${INSTALL_BIN_DIR}/${DOWNLOAD_FILE}
EOF
chmod -v 755 ${ET_WRAPPER_SCRIPT}
ICON=logo-chat-bubble.png
ICON_URL="https://raw.githubusercontent.com/thetechprepper/reticulum-meshchat/master/logo/${ICON}"
download_with_retries ${ICON_URL} ${ICON}
mv ${ICON} ${INSTALL_DIR}
cp ../overlay/usr/share/applications/meshchat.desktop /usr/share/applications
[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH}
ln -s ${INSTALL_DIR} ${LINK_PATH}
stow -v -d /opt ${APP} -t /usr/local
+57
View File
@@ -0,0 +1,57 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 28 June 2026
# Purpose : Installs modem73
set -e
trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG
trap 'et-log "\"${last_command}\" command failed with exit code $?."' ERR
. ./env.sh
. ../overlay/opt/emcomm-tools/bin/et-common
APP="modem73"
VERSION="1.0.7"
APP_AND_VERSION="${APP}-${VERSION}"
GIT_URL="https://github.com/thetechprepper/modem73.git"
GIT_WORKSPACE="modem73"
INSTALL_DIR="/opt/${APP_AND_VERSION}"
INSTALL_BIN_DIR="${INSTALL_DIR}/bin"
LINK_PATH="/opt/${APP}"
et-log "Installing ${APP} dependencies..."
apt install \
libncurses-dev \
-y
et-log "Installing ${APP} ${VERSION}"
CWD_DIR=`pwd`
cd ${ET_SRC_DIR}
[[ ! -e ${GIT_WORKSPACE} ]] && git clone --branch emcomm-tools --single-branch ${GIT_URL}
cd ${GIT_WORKSPACE}
make
[[ ! -e "${INSTALL_BIN_DIR}" ]] && mkdir -v -p "${INSTALL_BIN_DIR}"
[[ -e "${APP}" ]] && cp ${APP} "${INSTALL_BIN_DIR}"
[[ -e ${LINK_PATH} ]] && rm ${LINK_PATH}
ln -v -s ${INSTALL_DIR} ${LINK_PATH}
stow -v -d /opt ${APP} -t /usr/local
cd ${CWD}
et-log "Enabling modem73 interface..."
INTERFACE_FILE=Modem73Interface.py
INTERFACE_DIR=/etc/skel/.reticulum/interfaces
download_with_retries https://raw.githubusercontent.com/thetechprepper/modem73interface/refs/heads/master/Modem73Interface.py ${INTERFACE_FILE}
[[ ! -e ${INTERFACE_DIR} ]] && mkdir -v -p ${INTERFACE_DIR}
mv -v ${INTERFACE_FILE} /etc/skel/.reticulum/interfaces
+20
View File
@@ -9,6 +9,16 @@
"file": "bpq-user-and-sysop-commands.pdf",
"dir": "bbs/bpq"
},
{
"url": "https://resource.heltec.cn/download/WiFi_LoRa_32_V3/HTIT-WB32LA_V3.2.pdf",
"file": "HTIT-WB32LA_V3.2.pdf",
"dir": "lora/heltec"
},
{
"url": "https://resource.heltec.cn/download/WiFi_LoRa_32_V4/datasheet/WiFi_LoRa_32_V4.2.0.pdf",
"file": "WiFi_LoRa_32_V4.2.0.pdf",
"dir": "lora/heltec"
},
{
"url": "https://www.icomamerica.com/api/download.php?page_id=171&fl=JTJGdXBsb2FkcyUyRlVTQV9CYW5kX1BsYW4lMkZCYW5kX1BsYW5fTWFwJTJGQW1hdHVlckdyaWRTcXVhcmVNYXBfVVNBJTVCMTMlNUQucGRm",
"file": "icom-us-grid.pdf",
@@ -38,5 +48,15 @@
"url": "https://www.swpc.noaa.gov/sites/default/files/images/NOAAscales.pdf",
"file": "NOAAscales.pdf",
"dir": "space-weather"
},
{
"url": "https://reticulum.betweentheborders.com/primer.pdf",
"file": "primer.pdf",
"dir": "reticulum"
},
{
"url": "https://github.com/markqvist/Reticulum/releases/download/1.2.5/Reticulum.Manual.pdf",
"file": "Reticulum.Manual.pdf",
"dir": "reticulum"
}
]
+2 -1
View File
@@ -1,6 +1,7 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 27 March 2026
# Updated : 15 June 2026
# Purpose : Install Paranoia File & Text Encryption
set -e
@@ -18,7 +19,7 @@ et-log "Installing ${APP} ${VERSION}..."
if [[ ! -e ${ET_DIST_DIR}/${DOWNLOAD_FILE} ]]; then
URL="https://paranoiaworks.mobi/download/files/${DOWNLOAD_FILE}"
URL="https://paranoiaworks.com/download/pfte_15.0.8-1_amd64.deb"
download_with_retries ${URL} ${DOWNLOAD_FILE}
mv ${DOWNLOAD_FILE} ${ET_DIST_DIR}
+28
View File
@@ -0,0 +1,28 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 13 February 2026
# Updated : 23 June 2026
# Purpose : Install Reticulum
RNS_VERSION=1.3.5
et-log "Installing Python3..."
apt install \
python3 \
python3-pip \
-y
et-log "Downloading rns ${RNS_VERSION} for offline install..."
python3 -m pip download -d wheelhouse rns==${RNS_VERSION}
#et-log "Downloading nomadnet for offline install..."
#python3 -m pip download -d wheelhouse
et-log "Installing Reticulum for single user use..."
PYTHONUSERBASE=/etc/skel/.local \
python3 -m pip install --user \
--no-index --find-links=wheelhouse \
rns==${RNS_VERSION}
#et-log "Removing wheelhouse to save space..."
#[[ -e wheelhouse ]] && rm -vrf wheelhouse
+9 -1
View File
@@ -2,7 +2,7 @@
#
# Author : Gaston Gonzalez
# Date : 16 March 2024
# Updated : 2 May 2026
# Updated : 28 June 2026
# Purpose : Main installer for EmComm Tools Community (ETC)
. ./env.sh
@@ -118,3 +118,11 @@ exitIfNotRoot
# Security Patches
./patch-copy-fail.sh
# Install Reticulum and related applications
./install-reticulum.sh
./install-meshchat.sh
./install-modem73.sh
# Debrand Ubuntu
./debrand.sh
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 28 June 2026
# Purpose : Test modem73 installation
OUT=$(which modem73)
exit $?
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
# Author : Gaston Gonzalez
# Date : 11 April 2025
# Purpose : Test Reticulum installation
OUT=$(PYTHONUSERBASE=/etc/skel/.local /etc/skel/.local/bin/rnsd --version)
exit $?