Index | Thread | Search

From:
openbsd@systemfailure.net
Subject:
Re: [update] py-rns-0.9.3, py-lxmf-0.6.3, nomadnet-0.6.1 -> py-rns-1.0.0, py-lxmf-0.8.0, nomadnet-0.8.0
To:
ports@openbsd.org,Stuart Henderson <stu@spacehopper.org>,Aaron Bieber <aaron@bolddaemon.com>
Date:
Fri, 18 Jul 2025 21:15:32 +0000

Download raw body.

Thread
  • openbsd@systemfailure.net:

    [update] py-rns-0.9.3, py-lxmf-0.6.3, nomadnet-0.6.1 -> py-rns-1.0.0, py-lxmf-0.8.0, nomadnet

Hi,

Thank you for this update. And BTW, nice to see the Reticulum stack finally reaching its first 1.0 release.

I tested quite thoroughly the changes you just committed. AFAICT, all features are working nicely, including Reticulum's I2PInterface, except RNode support (more on that below). This is unfortunate, because RNodes are probably one of the most common and interesting use cases of Reticulum, and the reason why this project is often compared to Meshtastic or Meshcore. In addition to that, information on how to access RNodes from OpenBSD is very difficult to find, since all the available documentation target other operating systems.

Moreover, changes to the Makefile are needed to run 'make test'.

Please find attached a patch for net/py3-rns which adds a README explaining how to connect to RNodes on OpenBSD, and a fix for 'make test'... A fix that was already sumbitted a couple months ago by Stuart on this list ;-)

One test is still failing, I don't know why, but at least it doesn't prevent the port from working.

For the record, I tried three different LoRa modules with 'rnodeconf' (the utility included in py3-rns to create and control RNodes), and here are the results:

- Heltec LoRa32 v3: I could update the firmware and use the device without problems. This is the only board with which I never had issues on OpenBSD.

- SeeedStudio Xiao ESP32S3: each time I tried to install the firmware, the installation process crashed unexpectedly at different stages and with different error messages. After I don't know how many attempts, it finally got through... But then the device never worked on OpenBSD: I could not query its parameters with 'rnodeconf' nor use it with rnsd. The very same device, with the very same firmware installed from OpenBSD, works like a charm on Linux, go figure.

- Lilygo T-Echo: unlike the two previous devices, this one is based on an nRF52 chip, so installing the firmware on it requires a special python module (https://pypi.org/project/adafruit-nrfutil/) that is not ported yet. But Stuart has submitted a tentative port for it last march: https://marc.info/?l=openbsd-ports&m=174223387022461&w=2. After installing the module with Stuart's port, I could install the firmware on my T-Echo... at least 'rnodeconf' said the installation was successful. Unfortunately, it didn't work and displayed error messages: at my first attempt the display said "Radio not found", and after the second one "Firmware Corrupt". I could re-flash a working firmware on Linux.

In these test, I only tried 'rnodeconf'. Since I was using a "headless" box, I didn't try the web flasher that works with Chromium-based browsers (https://liamcottle.github.io/rnode-flasher/). I don't know if it works on OpenBSD: not sure if Chromium's Web Serial API works on OpenBSD. Anyway, the README I'm submitting here is generic enough to be useful also for people who would want to try to flash RNodes with Chromium.

Best regards.


On 2025/07/15 14:51, Stuart Henderson wrote:
> On 2025/07/15 07:46, Aaron Bieber wrote:
> > Hi,
> > 
> > Here are some updates to the Reticulum network stack. rns and lxmf both
> > have license changes, I am not sure the marker is .. correct.
> 
> i would go with "custom, see LICENSE", otherwise ok
> 
> : - The Software shall not be used in any kind of system which includes amongst
> :   its functions the ability to purposefully do harm to human beings.
> : 
> : - The Software shall not be used, directly or indirectly, in the creation of
> :   an artificial intelligence, machine learning or language model training
> :   dataset, including but not limited to any use that contributes to the
> :   training or development of such a model or algorithm.
> 
> (nice sentiment but i think problematic to use in a license)
> 
> 
> > I am able to send / receive messages with nomadnet after updating everything.
> > 
> > OK?
> > 
> > https://deftly.net/patches/py3-rns-1.0.0.diff
> > https://deftly.net/patches/py3-lxmf-0.8.0.diff
> > https://deftly.net/patches/nomadnet-0.8.0.diff
> > 
> > https://github.com/openbsd/ports/compare/master...qbit:ports:rns-1.0.0.patch
> > 
> 
> > diff --git a/net/py-rns/Makefile b/net/py-rns/Makefile
> > index afa3e88a47b..12ef376d3a6 100644
> > --- a/net/py-rns/Makefile
> > +++ b/net/py-rns/Makefile
> > @@ -1,9 +1,8 @@
> >  COMMENT =		cryptography-based networking stack
> >  
> > -MODPY_DISTV =		0.9.3
> > +MODPY_DISTV =		1.0.0
> >  DISTNAME=		rns-${MODPY_DISTV}
> >  PKGNAME =		py-${DISTNAME}
> > -REVISION =		0
> >  
> >  CATEGORIES =		net devel
> >  
> > @@ -11,7 +10,7 @@ HOMEPAGE =		https://reticulum.network/
> >  
> >  MAINTAINER =		Aaron Bieber <abieber@openbsd.org>
> >  
> > -# MIT
> > +# MIT+anti AI
> >  PERMIT_PACKAGE =	Yes
> >  
> >  MODULES =		lang/python
> > diff --git a/net/py-rns/distinfo b/net/py-rns/distinfo
> > index 49fdc2edd1e..0c1cc25fe6b 100644
> > --- a/net/py-rns/distinfo
> > +++ b/net/py-rns/distinfo
> > @@ -1,2 +1,2 @@
> > -SHA256 (rns-0.9.3.tar.gz) = rmj6EE5i9eX/Q3iTozrgmrRm6cv5Z/gwifegAmcXMGE=
> > -SIZE (rns-0.9.3.tar.gz) = 17561041
> > +SHA256 (rns-1.0.0.tar.gz) = nxxZTk6r1k3qTBvVmtG5KR5qKLHYq1aJoZcI8TEAc1s=
> > +SIZE (rns-1.0.0.tar.gz) = 6695768
> > diff --git a/net/py-rns/pkg/PLIST b/net/py-rns/pkg/PLIST
> > index b5695a4578f..222835ac31b 100644
> > --- a/net/py-rns/pkg/PLIST
> > +++ b/net/py-rns/pkg/PLIST
> > @@ -61,12 +61,12 @@ lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/__init__.py
> >  ${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}/
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}utils.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}utils.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/aes.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/utils.py
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes128.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes128.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes256.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/${MODPY_PYCACHE}aes256.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/aes128.py
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/aes/aes256.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/pure25519/
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/pure25519/__init__.py
> >  ${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/RNS/Cryptography/pure25519/${MODPY_PYCACHE}/
> > @@ -103,6 +103,7 @@ lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/Android/${MODPY_PYCACHE}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/Android/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/Android/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/AutoInterface.py
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/BackboneInterface.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/I2PInterface.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/Interface.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/KISSInterface.py
> > @@ -119,6 +120,8 @@ lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}AX25KISS
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}AX25KISSInterface.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}AutoInterface.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}AutoInterface.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}BackboneInterface.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}BackboneInterface.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}I2PInterface.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}I2PInterface.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}Interface.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > @@ -141,6 +144,14 @@ lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}UDPInter
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}UDPInterface.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/__init__.py
> > +${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/${MODPY_PYCACHE}/
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/${MODPY_PYCACHE}netinfo.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/${MODPY_PYCACHE}netinfo.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/RNS/Interfaces/util/netinfo.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Link.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Packet.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/Resolver.py
> > @@ -215,8 +226,6 @@ lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}configobj.${
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}configobj.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}platformutils.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}platformutils.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}six.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}six.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}umsgpack.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/${MODPY_PYCACHE}umsgpack.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/configobj.py
> > @@ -246,32 +255,11 @@ lib/python${MODPY_VERSION}/site-packages/RNS/vendor/i2plib/log.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/i2plib/sam.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/i2plib/tunnel.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/i2plib/utils.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/__init__.py
> > -${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}/
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_posix.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_posix.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_shared.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_shared.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_win32.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}_win32.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}niwrapper.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/${MODPY_PYCACHE}niwrapper.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/_posix.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/_shared.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/_win32.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/niwrapper.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/ifaddr/py.typed
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/platformutils.py
> > -lib/python${MODPY_VERSION}/site-packages/RNS/vendor/six.py
> >  lib/python${MODPY_VERSION}/site-packages/RNS/vendor/umsgpack.py
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/METADATA
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/RECORD
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/WHEEL
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/entry_points.txt
> > -lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/licenses/
> > -lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/licenses/LICENSE
> >  lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/top_level.txt
> 
> > diff --git a/net/py-lxmf/Makefile b/net/py-lxmf/Makefile
> > index 8ba42f35209..9f058ce8660 100644
> > --- a/net/py-lxmf/Makefile
> > +++ b/net/py-lxmf/Makefile
> > @@ -1,9 +1,8 @@
> >  COMMENT =		lightweight extensible message format
> >  
> > -MODPY_DISTV =		0.6.3
> > +MODPY_DISTV =		0.8.0
> >  DISTNAME=		lxmf-${MODPY_DISTV}
> >  PKGNAME =		py-${DISTNAME}
> > -REVISION =		0
> >  
> >  CATEGORIES =		net devel
> >  
> > @@ -11,7 +10,7 @@ HOMEPAGE =		https://github.com/markqvist/LXMF
> >  
> >  MAINTAINER =		Aaron Bieber <abieber@openbsd.org>
> >  
> > -# MIT
> > +# MIT+anti AI
> >  PERMIT_PACKAGE =	Yes
> >  
> >  MODULES =		lang/python
> > diff --git a/net/py-lxmf/distinfo b/net/py-lxmf/distinfo
> > index 7c54a6c65fe..acb1b26403d 100644
> > --- a/net/py-lxmf/distinfo
> > +++ b/net/py-lxmf/distinfo
> > @@ -1,2 +1,2 @@
> > -SHA256 (lxmf-0.6.3.tar.gz) = 6UrubHw+6K2xeoboU8B7FjO54hw77/yPQpeRcZPsmTE=
> > -SIZE (lxmf-0.6.3.tar.gz) = 59700
> > +SHA256 (lxmf-0.8.0.tar.gz) = Elz26v5jFwY4XMKpCqqtvlZFVxQklee/GV3xFWqb7q4=
> > +SIZE (lxmf-0.8.0.tar.gz) = 60022
> > diff --git a/net/py-lxmf/pkg/PLIST b/net/py-lxmf/pkg/PLIST
> > index c6bcb695cf4..cecf6a60a63 100644
> > --- a/net/py-lxmf/pkg/PLIST
> > +++ b/net/py-lxmf/pkg/PLIST
> > @@ -35,6 +35,4 @@ lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/METADATA
> >  lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/RECORD
> >  lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/WHEEL
> >  lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/entry_points.txt
> > -lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/licenses/
> > -lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/licenses/LICENSE
> >  lib/python${MODPY_VERSION}/site-packages/lxmf-${MODPY_DISTV}.dist-info/top_level.txt
> 
> > diff --git a/net/nomadnet/Makefile b/net/nomadnet/Makefile
> > index 2b43b081f9b..d88a202f161 100644
> > --- a/net/nomadnet/Makefile
> > +++ b/net/nomadnet/Makefile
> > @@ -1,9 +1,8 @@
> >  COMMENT =		Reticulum based mesh communication
> >  
> > -MODPY_DISTV =		0.6.1
> > +MODPY_DISTV =		0.8.0
> >  DISTNAME=		nomadnet-${MODPY_DISTV}
> >  PKGNAME =		${DISTNAME}
> > -REVISION =		1
> >  
> >  CATEGORIES =		net
> >  
> > diff --git a/net/nomadnet/distinfo b/net/nomadnet/distinfo
> > index 1172e419c58..93a242c24c5 100644
> > --- a/net/nomadnet/distinfo
> > +++ b/net/nomadnet/distinfo
> > @@ -1,2 +1,2 @@
> > -SHA256 (nomadnet-0.6.1.tar.gz) = 5bNa8G1xGQntlLRGukh9CIbGZonvWOEjkTYx6xoHfYc=
> > -SIZE (nomadnet-0.6.1.tar.gz) = 500717
> > +SHA256 (nomadnet-0.8.0.tar.gz) = wQnt0klt+/aSuNEL5tipI3x/yxRyWw3piZA7IfMpeRw=
> > +SIZE (nomadnet-0.8.0.tar.gz) = 506664
> > diff --git a/net/nomadnet/patches/patch-nomadnet_vendor_Scrollable_py b/net/nomadnet/patches/patch-nomadnet_vendor_Scrollable_py
> > deleted file mode 100644
> > index eee8f85ed92..00000000000
> > --- a/net/nomadnet/patches/patch-nomadnet_vendor_Scrollable_py
> > +++ /dev/null
> > @@ -1,26 +0,0 @@
> > -From b9ac735308f697ff0d98f572fc94c3e8202095cc Mon Sep 17 00:00:00 2001
> > -From: Ivan <Sudo-Ivan@users.noreply.github.com>
> > -Date: Thu, 8 May 2025 18:40:04 -0500
> > -Subject: [PATCH] update to use super().__init__(widget)
> > -
> > -Index: nomadnet/vendor/Scrollable.py
> > ---- nomadnet/vendor/Scrollable.py.orig
> > -+++ nomadnet/vendor/Scrollable.py
> > -@@ -50,7 +50,7 @@ class Scrollable(urwid.WidgetDecoration):
> > -         self._old_cursor_coords = None
> > -         self._rows_max_cached = 0
> > -         self.force_forward_keypress = force_forward_keypress
> > --        self.__super.__init__(widget)
> > -+        super().__init__(widget)
> > - 
> > -     def render(self, size, focus=False):
> > -         maxcol, maxrow = size
> > -@@ -340,7 +340,7 @@ class ScrollBar(urwid.WidgetDecoration):
> > -         """
> > -         if BOX not in widget.sizing():
> > -             raise ValueError('Not a box widget: %r' % widget)
> > --        self.__super.__init__(widget)
> > -+        super().__init__(widget)
> > -         self._thumb_char = thumb_char
> > -         self._trough_char = trough_char
> > -         self.scrollbar_side = side
> > diff --git a/net/nomadnet/pkg/PLIST b/net/nomadnet/pkg/PLIST
> > index 4edd3a88477..b23651c74ce 100644
> > --- a/net/nomadnet/pkg/PLIST
> > +++ b/net/nomadnet/pkg/PLIST
> > @@ -65,6 +65,7 @@ lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Conversations.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Directory.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Extras.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Guide.py
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Interfaces.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Log.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Main.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/Map.py
> > @@ -84,6 +85,8 @@ lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Extr
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Extras.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Guide.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Guide.${MODPY_PYC_MAGIC_TAG}pyc
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Interfaces.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Interfaces.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Log.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Log.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Main.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > @@ -97,20 +100,24 @@ lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}Netw
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/ui/textui/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/AsciiChart.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/Scrollable.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/__init__.py
> >  ${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}/
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}AsciiChart.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}AsciiChart.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}Scrollable.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}Scrollable.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> > -lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}configobj.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > -lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}configobj.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}quotes.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/${MODPY_PYCACHE}quotes.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/FormWidgets.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/__init__.py
> >  ${MODPY_COMMENT}lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/${MODPY_PYCACHE}/
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/${MODPY_PYCACHE}FormWidgets.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> > +lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/${MODPY_PYCACHE}FormWidgets.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/${MODPY_PYCACHE}__init__.${MODPY_PYC_MAGIC_TAG}pyc
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/assisting_modules/
> > @@ -144,5 +151,4 @@ lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widget
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/widgets/integer_picker.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/widgets/message_dialog.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/additional_urwid_widgets/widgets/selectable_row.py
> > -lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/configobj.py
> >  lib/python${MODPY_VERSION}/site-packages/nomadnet/vendor/quotes.py
Index: Makefile
===================================================================
RCS file: /cvs/ports/net/py-rns/Makefile,v
diff -u -p -r1.4 Makefile
--- Makefile	17 Jul 2025 16:26:32 -0000	1.4
+++ Makefile	18 Jul 2025 15:50:02 -0000
@@ -3,6 +3,7 @@ COMMENT =		cryptography-based networking
 MODPY_DISTV =		1.0.0
 DISTNAME=		rns-${MODPY_DISTV}
 PKGNAME =		py-${DISTNAME}
+REVISION =		0
 
 CATEGORIES =		net devel
 
@@ -18,9 +19,14 @@ MODULES =		lang/python
 MODPY_PI =		Yes
 MODPY_PYBUILD =		setuptools
 
+# writes to $HOME if cython is installed
+PORTHOME =		${WRKDIR}
 MODPY_PYTEST_ARGS =	-v tests/all.py
 
 RUN_DEPENDS =		devel/py-serial \
 			security/py-cryptography
+
+pre-test:
+	ln -s ${MODPY_BIN} ${WRKDIR}/bin/python
 
 .include <bsd.port.mk>
Index: pkg/PLIST
===================================================================
RCS file: /cvs/ports/net/py-rns/pkg/PLIST,v
diff -u -p -r1.4 PLIST
--- pkg/PLIST	17 Jul 2025 16:26:32 -0000	1.4
+++ pkg/PLIST	18 Jul 2025 15:50:02 -0000
@@ -263,3 +263,4 @@ lib/python${MODPY_VERSION}/site-packages
 lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/WHEEL
 lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/entry_points.txt
 lib/python${MODPY_VERSION}/site-packages/rns-${MODPY_DISTV}.dist-info/top_level.txt
+share/doc/pkg-readmes/${PKGSTEM}
Index: pkg/README
===================================================================
RCS file: pkg/README
diff -N pkg/README
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ pkg/README	18 Jul 2025 15:50:02 -0000
@@ -0,0 +1,29 @@
++-----------------------------------------------------------------------
+| Running ${PKGSTEM} on OpenBSD
++-----------------------------------------------------------------------
+
+Connect to RNodes over USB
+==========================
+
+To access RNodes over an USB cable, the user must be in the dialer
+group:
+
+   usermod -G dialer <user>
+
+The corresponding virtual device will most often be /dev/cuaU0, or if
+you have multiple serial devices connected over USB, /dev/cuaU1,
+/dev/cuaU2, and so on. See cua(4) for explanations.
+
+For example, you could get info about your RNode with rnodeconf by
+running:
+
+   rnodeconf --info /dev/cuaU0
+
+In your RNS configuration file (usually ~/.reticulum/config), your RNode
+interface could be defined like this:
+
+  [[RNode LoRa Interface]]
+    type = RNodeInterface
+    enabled = yes
+    port = /dev/cuaU0
+    ...