From 5ae4c10212cb99a363cc2024aefeb7870ec280f5 Mon Sep 17 00:00:00 2001 From: "@dev.mako" <95612413+devkyato@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:24:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=EF=BB=BFAdd=20opennet=20doctor=20and=20fix?= =?UTF-8?q?=20stale=20Linux=20bundle=20docs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ship a local readiness check and align the packaged Linux README with the 0.2.2 release assets. Co-authored-by: Cursor --- CHANGELOG.md | 8 ++++++++ packaging/linux/README.md | 8 ++++---- python/src/opennet/cli.py | 31 ++++++++++++++++++++++++++++++- python/tests/test_cli.py | 2 +- 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d944e7c..fad8e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes are documented here. OpenNet follows ## [Unreleased] +### Added + +- Add `opennet doctor` for local version, default endpoint, and TLS readiness checks. + +### Fixed + +- Align the Linux service bundle README with the 0.2.2 archive name and documentation tags. + ## [0.2.2] - 2026-08-09 ### Changed diff --git a/packaging/linux/README.md b/packaging/linux/README.md index 29c6bcd..d1e8afb 100644 --- a/packaging/linux/README.md +++ b/packaging/linux/README.md @@ -4,15 +4,15 @@ This bundle installs a dedicated, unprivileged `opennet` service under `/opt/opennet` and keeps its settings in `/etc/opennet/opennet.env`. ```sh -tar -xzf OpenNet-linux-0.2.0.tar.gz -cd OpenNet-linux-0.2.0 +tar -xzf OpenNet-linux-0.2.2.tar.gz +cd OpenNet-linux-0.2.2 sudo ./install.sh ``` The default listener is loopback-only. Read the -[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.0/docs/security.md) +[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/security.md) before exposing it to a network. The complete -[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.0/docs/linux-service.md) +[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/linux-service.md) shows a hardened remote setup. Use `sudo ./install.sh --no-start` to inspect or customize the unit before it starts. diff --git a/python/src/opennet/cli.py b/python/src/opennet/cli.py index 9aab117..0efe6bb 100644 --- a/python/src/opennet/cli.py +++ b/python/src/opennet/cli.py @@ -49,7 +49,7 @@ def _add_connection_options(parser: argparse.ArgumentParser) -> None: def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser( prog="opennet", - description="Send, serve, diagnose, and benchmark ONP/1 connections", + description="Send, serve, doctor, and benchmark ONP/1 connections", ) parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}") commands = parser.add_subparsers(dest="command", required=True) @@ -116,6 +116,11 @@ def build_parser() -> argparse.ArgumentParser: benchmark.add_argument("--retries", type=int, default=1) benchmark.add_argument("--json", action="store_true", dest="json_output") + commands.add_parser( + "doctor", + help="report local OpenNet version, defaults, and TLS readiness", + ) + return parser @@ -367,6 +372,28 @@ async def _benchmark(args: argparse.Namespace) -> None: print(f"{key}: {value}") +def _doctor() -> None: + failures: list[str] = [] + print(f"OpenNet version: {__version__}") + print(f"Python: {sys.version.split()[0]}") + print(f"Default host: {DEFAULT_HOST}") + print(f"Default port: {DEFAULT_PORT}") + print(f"Default max payload: {DEFAULT_MAX_PAYLOAD}") + print(f"TLS module: {ssl.OPENSSL_VERSION}") + if not _is_loopback(DEFAULT_HOST): + print( + "Default host is not loopback; plaintext listeners require " + "--allow-plaintext or TLS" + ) + else: + print("Default host is loopback [ok for local plaintext]") + if sys.version_info < (3, 9): + failures.append("Python 3.9 or newer is required") + if failures: + raise ValueError("; ".join(failures)) + print("Doctor checks passed") + + async def run(args: argparse.Namespace) -> None: if args.command == "serve": await _serve(args) @@ -376,6 +403,8 @@ async def run(args: argparse.Namespace) -> None: await _ping(args) elif args.command == "benchmark": await _benchmark(args) + elif args.command == "doctor": + _doctor() else: raise AssertionError(f"unknown command {args.command}") diff --git a/python/tests/test_cli.py b/python/tests/test_cli.py index 0b4d45d..a462732 100644 --- a/python/tests/test_cli.py +++ b/python/tests/test_cli.py @@ -31,7 +31,7 @@ def test_cli_value_conversion(kind, text, expected): def test_cli_has_operational_subcommands(): parser = build_parser() - for command in ("serve", "send", "ping", "benchmark"): + for command in ("serve", "send", "ping", "benchmark", "doctor"): with pytest.raises(SystemExit) as result: parser.parse_args((command, "--help")) assert result.value.code == 0 From 79fdcc2966ca85defc6d99b1da4788a0cf1a17c8 Mon Sep 17 00:00:00 2001 From: devkyato <95612413+devkyato@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:39:26 +0800 Subject: [PATCH 2/2] Release OpenNet 0.2.3 Co-authored-by: Cursor --- .zenodo.json | 4 ++-- CHANGELOG.md | 2 ++ CITATION.cff | 8 ++++---- README.md | 14 +++++++------- docs/getting-started.md | 4 ++-- docs/linux-service.md | 6 +++--- docs/release.md | 10 +++++----- docs/releases/v0.2.3.md | 30 ++++++++++++++++++++++++++++++ docs/tutorials.md | 8 ++++---- library.json | 2 +- library.properties | 2 +- packaging/linux/README.md | 8 ++++---- python/README.md | 6 +++--- python/pyproject.toml | 2 +- python/src/opennet/__init__.py | 2 +- 15 files changed, 70 insertions(+), 38 deletions(-) create mode 100644 docs/releases/v0.2.3.md diff --git a/.zenodo.json b/.zenodo.json index 9442a69..c06bc20 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -12,8 +12,8 @@ } ], "title": "OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends", - "description": "

Overview

OpenNet is a dependency-free implementation of typed ONP/1 messaging for ESP32 devices, Raspberry Pi systems, and Python backends. It provides one inspectable frame format for direct communication over TCP, verified TLS, or another reliable ordered Arduino stream.

Key capabilities

Install

python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl\nopennet --version

Arduino IDE users can install the OpenNet-0.2.2.zip asset. Raspberry Pi or Linux service users can extract OpenNet-linux-0.2.2.tar.gz and run the installer shown in the documentation.

Quick start

opennet serve --echo\nopennet send sensor/temperature 24.7 --type float

Applications

Limitations/status

Version 0.2.2 is alpha software. ONP/1 requires a reliable ordered stream and does not provide routing, discovery, durable queues, retained messages, or brokered fleet management. Acknowledgements mean validated transport acceptance, not successful application side effects. Verified TLS is required outside isolated trusted development networks.

Documentation

Read Getting started, the ONP/1 protocol specification, and the security guide.

Related software

Citation

@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.2). Zenodo. https://doi.org/10.5281/zenodo.21853309

", - "version": "0.2.2", + "description": "

Overview

OpenNet is a dependency-free implementation of typed ONP/1 messaging for ESP32 devices, Raspberry Pi systems, and Python backends. It provides one inspectable frame format for direct communication over TCP, verified TLS, or another reliable ordered Arduino stream.

Key capabilities

Install

python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl\nopennet --version

Arduino IDE users can install the OpenNet-0.2.3.zip asset. Raspberry Pi or Linux service users can extract OpenNet-linux-0.2.3.tar.gz and run the installer shown in the documentation.

Quick start

opennet serve --echo\nopennet send sensor/temperature 24.7 --type float

Applications

Limitations/status

Version 0.2.3 is alpha software. ONP/1 requires a reliable ordered stream and does not provide routing, discovery, durable queues, retained messages, or brokered fleet management. Acknowledgements mean validated transport acceptance, not successful application side effects. Verified TLS is required outside isolated trusted development networks.

Documentation

Read Getting started, the ONP/1 protocol specification, and the security guide.

Related software

Citation

@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.3). Zenodo. https://doi.org/10.5281/zenodo.21853309

", + "version": "0.2.3", "keywords": [ "opennet", "ONP/1", diff --git a/CHANGELOG.md b/CHANGELOG.md index fad8e71..f28fd8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes are documented here. OpenNet follows ## [Unreleased] +## [0.2.3] - 2026-08-12 + ### Added - Add `opennet doctor` for local version, default endpoint, and TLS readiness checks. diff --git a/CITATION.cff b/CITATION.cff index 3d39dfb..43d3ee9 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,8 +4,8 @@ title: "OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backe authors: - family-names: "@dev.mako (devkyato)" affiliation: "MATA Company" -version: 0.2.2 -date-released: 2026-08-09 +version: 0.2.3 +date-released: 2026-08-12 license: MIT repository-code: "https://github.com/devkyato/OpenNet" url: "https://github.com/devkyato/OpenNet" @@ -39,7 +39,7 @@ preferred-citation: authors: - family-names: "@dev.mako (devkyato)" affiliation: "MATA Company" - version: 0.2.2 + version: 0.2.3 doi: 10.5281/zenodo.21853309 - date-released: 2026-08-09 + date-released: 2026-08-12 repository-code: "https://github.com/devkyato/OpenNet" diff --git a/README.md b/README.md index c93ed6b..9273dfd 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ communication layer or a replacement for MQTT, HTTP, or WebSocket. It sends JSON, text, signed integers, finite doubles, booleans, null, and arbitrary binary data over TCP/TLS or another reliable ordered stream. -Version 0.2.2 is an alpha release for real projects and learning. This release +Version 0.2.3 is an alpha release for real projects and learning. This release improves publication, documentation, and citation quality without claiming new protocol or runtime behaviour. OpenNet has a documented wire format, bounded resource use, retries and duplicate suppression, @@ -59,7 +59,7 @@ Python wheel from the release page: ```sh python -m pip install \ - https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl + https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl opennet --version ``` @@ -67,15 +67,15 @@ For an isolated command: ```sh pipx install \ - https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl + https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl ``` -For Raspberry Pi/Linux, extract `OpenNet-linux-0.2.2.tar.gz` and run +For Raspberry Pi/Linux, extract `OpenNet-linux-0.2.3.tar.gz` and run `sudo ./install.sh`. It creates a hardened, unprivileged systemd service with a -loopback-only default. For Arduino IDE, install `OpenNet-0.2.2.zip` through +loopback-only default. For Arduino IDE, install `OpenNet-0.2.3.zip` through **Sketch > Include Library > Add .ZIP Library**. -The Python distribution is installable with pip, but v0.2.2 is distributed from +The Python distribution is installable with pip, but v0.2.3 is distributed from GitHub Releases rather than the public PyPI index. ## Five-minute local test @@ -158,7 +158,7 @@ unsafe action. If you use this software in research or teaching, please cite the Zenodo archive / this repository: ```text -@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.2). https://github.com/devkyato/OpenNet +@dev.mako (devkyato). (2026). OpenNet: typed ONP/1 messaging for ESP32, Raspberry Pi, and Python backends (Version 0.2.3). https://github.com/devkyato/OpenNet ``` See [CITATION.cff](CITATION.cff) for machine-readable metadata. diff --git a/docs/getting-started.md b/docs/getting-started.md index ce82698..7eead2e 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -18,7 +18,7 @@ supported Python version. ```bash python -m pip install \ - https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl + https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl opennet serve ``` @@ -52,7 +52,7 @@ For another project: ```ini lib_deps = - https://github.com/devkyato/OpenNet.git#v0.2.2 + https://github.com/devkyato/OpenNet.git#v0.2.3 ``` ## Sending values diff --git a/docs/linux-service.md b/docs/linux-service.md index 93d27a6..c279ffc 100644 --- a/docs/linux-service.md +++ b/docs/linux-service.md @@ -6,9 +6,9 @@ library `venv` module. ## Install ```sh -grep 'OpenNet-linux-0.2.2.tar.gz' SHA256SUMS | sha256sum -c - -tar -xzf OpenNet-linux-0.2.2.tar.gz -cd OpenNet-linux-0.2.2 +grep 'OpenNet-linux-0.2.3.tar.gz' SHA256SUMS | sha256sum -c - +tar -xzf OpenNet-linux-0.2.3.tar.gz +cd OpenNet-linux-0.2.3 sudo ./install.sh ``` diff --git a/docs/release.md b/docs/release.md index c6afece..3ffe8a5 100644 --- a/docs/release.md +++ b/docs/release.md @@ -19,12 +19,12 @@ PyPI publication is intentionally not automatic until the owner configures trust publishing. Release assets remain installable and reproducible without a registry credential. -## v0.2.2 assets +## v0.2.3 assets | Asset | Use | |---|---| -| `OpenNet-0.2.2.zip` | Arduino IDE library | -| `opennet_protocol-0.2.2-py3-none-any.whl` | Direct pip/pipx install | -| `opennet_protocol-0.2.2.tar.gz` | Python source distribution | -| `OpenNet-linux-0.2.2.tar.gz` | `sudo` Linux/systemd install | +| `OpenNet-0.2.3.zip` | Arduino IDE library | +| `opennet_protocol-0.2.3-py3-none-any.whl` | Direct pip/pipx install | +| `opennet_protocol-0.2.3.tar.gz` | Python source distribution | +| `OpenNet-linux-0.2.3.tar.gz` | `sudo` Linux/systemd install | | `SHA256SUMS` | Artifact integrity verification | diff --git a/docs/releases/v0.2.3.md b/docs/releases/v0.2.3.md new file mode 100644 index 0000000..bbb257d --- /dev/null +++ b/docs/releases/v0.2.3.md @@ -0,0 +1,30 @@ +# OpenNet v0.2.3 — doctor command and Linux docs fix + +OpenNet v0.2.3 adds a local readiness check command and corrects stale Linux +bundle documentation references. ONP/1 framing and runtime behaviour are +unchanged. + +## What changed + +- Add `opennet doctor` for local version, default endpoint, and TLS readiness checks. +- Align the Linux service bundle README with the archive name and documentation tags + for the current release. + +## Install + +```sh +python -m pip install https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl +opennet --version +``` + +The expected version output is `opennet 0.2.3`. + +Arduino IDE users can install `OpenNet-0.2.3.zip`. Linux service users can verify and extract +`OpenNet-linux-0.2.3.tar.gz` by following the +[service guide](../linux-service.md). + +## Citation + +Concept DOI: https://doi.org/10.5281/zenodo.21853309 + +See `CITATION.cff` and `.zenodo.json`. Published by @dev.mako (devkyato). Cursor Agent is acknowledged as a non-author contributor. diff --git a/docs/tutorials.md b/docs/tutorials.md index 3af331e..5fd6cdc 100644 --- a/docs/tutorials.md +++ b/docs/tutorials.md @@ -2,13 +2,13 @@ ## 1. Local Python round trip -Install the v0.2.2 wheel directly from the GitHub release: +Install the v0.2.3 wheel directly from the GitHub release: ```sh python -m venv .venv source .venv/bin/activate python -m pip install \ - https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl + https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl ``` Terminal one: @@ -27,7 +27,7 @@ opennet send device/state '{"online":true,"battery":91}' --type json ## 2. Raspberry Pi service -Download and extract `OpenNet-linux-0.2.2.tar.gz`, then: +Download and extract `OpenNet-linux-0.2.3.tar.gz`, then: ```sh sudo ./install.sh @@ -40,7 +40,7 @@ TLS before the first start. See [Security](security.md). ## 3. ESP32 over a trusted development LAN -1. Install `OpenNet-0.2.2.zip` through Arduino IDE's **Add .ZIP Library**. +1. Install `OpenNet-0.2.3.zip` through Arduino IDE's **Add .ZIP Library**. 2. Open **File > Examples > OpenNet > TelemetryClient**. 3. Enter the Wi-Fi details and the server's LAN address. 4. Start a development server with diff --git a/library.json b/library.json index a53fe59..e430410 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "OpenNet", - "version": "0.2.2", + "version": "0.2.3", "description": "Direct typed ONP/1 messaging between ESP32 devices and Python hosts.", "keywords": ["esp32", "raspberry-pi", "iot", "tcp", "tls", "bluetooth", "messaging"], "repository": { diff --git a/library.properties b/library.properties index 1a5a8d7..82ae69d 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=OpenNet -version=0.2.2 +version=0.2.3 author=@dev.mako (devkyato) maintainer=@dev.mako (devkyato) sentence=Direct typed ONP/1 messaging between ESP32 devices and Python hosts. diff --git a/packaging/linux/README.md b/packaging/linux/README.md index d1e8afb..4abf87f 100644 --- a/packaging/linux/README.md +++ b/packaging/linux/README.md @@ -4,15 +4,15 @@ This bundle installs a dedicated, unprivileged `opennet` service under `/opt/opennet` and keeps its settings in `/etc/opennet/opennet.env`. ```sh -tar -xzf OpenNet-linux-0.2.2.tar.gz -cd OpenNet-linux-0.2.2 +tar -xzf OpenNet-linux-0.2.3.tar.gz +cd OpenNet-linux-0.2.3 sudo ./install.sh ``` The default listener is loopback-only. Read the -[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/security.md) +[security guide](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/security.md) before exposing it to a network. The complete -[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/linux-service.md) +[service/TLS guide](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/linux-service.md) shows a hardened remote setup. Use `sudo ./install.sh --no-start` to inspect or customize the unit before it starts. diff --git a/python/README.md b/python/README.md index dbd21f7..90cb651 100644 --- a/python/README.md +++ b/python/README.md @@ -5,7 +5,7 @@ projects. ```bash python -m pip install \ - https://github.com/devkyato/OpenNet/releases/download/v0.2.2/opennet_protocol-0.2.2-py3-none-any.whl + https://github.com/devkyato/OpenNet/releases/download/v0.2.3/opennet_protocol-0.2.3-py3-none-any.whl opennet serve ``` @@ -27,7 +27,7 @@ specification, and security guidance are in the The server also accepts an optional sync or async `authorizer`. It sees the validated frame and the peer's TLS certificate before the handler or ACK, which keeps topic rules in one explicit place. See -[Authorizing topics](https://github.com/devkyato/OpenNet/blob/v0.2.2/docs/authorization.md). +[Authorizing topics](https://github.com/devkyato/OpenNet/blob/v0.2.3/docs/authorization.md). -The wheel is distributed through GitHub Releases for v0.2.2; it is not yet +The wheel is distributed through GitHub Releases for v0.2.3; it is not yet published on the public PyPI index. diff --git a/python/pyproject.toml b/python/pyproject.toml index 82a1237..74be787 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "opennet-protocol" -version = "0.2.2" +version = "0.2.3" description = "Dependency-free typed ONP/1 messaging for Raspberry Pi, ESP32, and backend systems" readme = "README.md" requires-python = ">=3.9" diff --git a/python/src/opennet/__init__.py b/python/src/opennet/__init__.py index f821015..5a5ebdd 100644 --- a/python/src/opennet/__init__.py +++ b/python/src/opennet/__init__.py @@ -33,4 +33,4 @@ "encode_value", ] -__version__ = "0.2.2" +__version__ = "0.2.3"