diff --git a/CHANGELOG.md b/CHANGELOG.md index c6e479a..267d2e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,52 @@ All notable changes to this project will be documented in this file. +## [4.6.0] - 2026-04-24 + +### TL;DR + +- **File downloads**: When you save or export things (including from archives), filenames are **cleaned up** so odd characters are less likely to break saves, and you get **clearer feedback** when a download wraps up. +- **NomadNet favourites**: You can **import and export** your NomadNet favourites list so you are not stuck re-building it by hand on a new device; **contact sharing** wording is clearer across several languages. + +### Downloads, archives, and frontend utilities + +- **Downloads**: File download flow adds **persistence**, **user notifications**, and **filename sanitization** so exports land predictably and bad names are rejected or normalized safely. +- **Refactors**: Download helpers and **time formatting** utilities consolidated; UI elements updated where downloads surface. +- **Tests**: **`DownloadUtils`** unit tests; **`Utils`** tests updated for formatting helpers; **`ArchivesPage`** test accounts for delayed **`downloadTextAsFile`** behaviour. + +### NomadNet and locales + +- **Favourites**: **Import/export** for NomadNet favourites from the app. +- **Locales**: **Contact sharing** options and related strings refreshed across supported languages. + +### Android + +- **Gradle**: **Product flavors** removed; **Python sync** task simplified to match the single packaging path. +- **Paths**: **Taskfile** and CI workflows updated for the new **APK** / Python directory layout. +- **Docs**: Android README sections updated so they no longer talk about removed flavors. + +### Repository server and bundled wheels + +- **Bundling**: Logic to **stage a local MeshChatX wheel** into the bundled directory and refreshed **download** behaviour for repository assets. + +### CI, release automation, and supply chain + +- **GitHub Actions**: **Migrated** primary workflows from **Gitea**; obsolete Gitea workflow files removed. +- **Workflow hygiene**: **Flatpak** CI cleaned up; deprecated **Snap** build scripts removed from the tree. +- **Caching**: **Node.js** and **Poetry** caches added where workflows install tooling. +- **Docker publish**: Workflow gains **Docker Hub** integration, **tag generation**, and a **login** fix so credential detection output is used consistently. +- **Android release**: Workflow updates for **tag handling**, **signing secret** detection, and **APK upload** behaviour. +- **Benchmarks**: **Taskfile** default **benchmark** task and workflow trigger alignment. +- **Draft releases**: Script sets **`GH_REPO`** from **`GITHUB_REPOSITORY`** when unset. +- **Trivy**: Install script gains **upstream verification** and **cosign** integration. +- **pip-audit**: **`CVE-2026-3219`** ignored temporarily with a documented rationale until an upstream fix lands. +- **Tests**: Minor **formatting** tidy-ups in the test tree; **`test_app_status_tracking`** uses **`4.6.0`** as the example **`changelog_seen_version`** stamp so it tracks the release. + +### Docker, compose, and documentation + +- **Dockerfile**: Optional **reproducible native build** target wiring; **OCI**-style metadata and **image source** hints refined; **`docker-compose.yml`** image source updated. +- **Docs**: **README** and translated READMEs add **Docker Hub** / **GHCR** guidance; **official GitHub mirror** links refreshed; **GitHub Actions** references replace Gitea-era wording; **security policy** and **SECURITY** formatting polish; **Raspberry Pi** install examples use **`bash`** fences consistently. + ## [4.5.1] - 2026-04-24 ### Identity switching diff --git a/README.md b/README.md index 34fe9db..1cf3fa9 100644 --- a/README.md +++ b/README.md @@ -321,7 +321,7 @@ task build:all ## Versioning -Current version in this repo is `4.5.1`. +Current version in this repo is `4.6.0`. - `package.json` is the JavaScript/Electron version source. - `meshchatx/src/version.py` is synced from `package.json` using: diff --git a/docs/meshchatx_on_raspberry_pi.md b/docs/meshchatx_on_raspberry_pi.md index 79156ea..0ef2c50 100644 --- a/docs/meshchatx_on_raspberry_pi.md +++ b/docs/meshchatx_on_raspberry_pi.md @@ -61,17 +61,17 @@ source ~/.profile ## 3) Install MeshChatX with pipx (recommended) -Preferred option (recommended): install from a release wheel (4.5.1 or newer), +Preferred option (recommended): install from a release wheel (4.6.0 or newer), because the wheel bundles frontend assets. ```bash pipx install /path/to/reticulum_meshchatx--py3-none-any.whl ``` -Direct example (v4.5.1): +Direct example (v4.6.0): ```bash -pipx install "https://git.quad4.io/RNS-Things/MeshChatX/releases/download/v4.5.1/reticulum_meshchatx-4.5.1-py3-none-any.whl" +pipx install "https://git.quad4.io/RNS-Things/MeshChatX/releases/download/v4.6.0/reticulum_meshchatx-4.6.0-py3-none-any.whl" ``` `py3-none-any` wheels are architecture-independent, so the same wheel artifact diff --git a/lang/README.de.md b/lang/README.de.md index d82daee..59949ab 100644 --- a/lang/README.de.md +++ b/lang/README.de.md @@ -290,7 +290,7 @@ task build:all ## Versionierung -Aktuelle Version in diesem Repository: `4.5.1`. +Aktuelle Version in diesem Repository: `4.6.0`. - `package.json` ist die Quelle fuer die JavaScript/Electron-Version. - `meshchatx/src/version.py` wird aus `package.json` synchronisiert mit: diff --git a/lang/README.it.md b/lang/README.it.md index 527df89..01f1416 100644 --- a/lang/README.it.md +++ b/lang/README.it.md @@ -290,7 +290,7 @@ Scorciatoie `Makefile`: ## Versioning -Versione attuale nel repository: `4.5.1`. +Versione attuale nel repository: `4.6.0`. - La fonte della versione JavaScript/Electron e `package.json`. - `meshchatx/src/version.py` e sincronizzato da `package.json` con: diff --git a/lang/README.ja.md b/lang/README.ja.md index 9aaa463..a0606cd 100644 --- a/lang/README.ja.md +++ b/lang/README.ja.md @@ -290,7 +290,7 @@ task build:all ## バージョン管理 -このリポジトリの現在のバージョンは `4.5.1` です。 +このリポジトリの現在のバージョンは `4.6.0` です。 - JavaScript / Electron のバージョンソースは `package.json`。 - `meshchatx/src/version.py` は次で `package.json` と同期します: diff --git a/lang/README.ru.md b/lang/README.ru.md index 0b26b3e..fadf96c 100644 --- a/lang/README.ru.md +++ b/lang/README.ru.md @@ -290,7 +290,7 @@ task build:all ## Версионирование -Текущая версия в репозитории: `4.5.1`. +Текущая версия в репозитории: `4.6.0`. - Источник версии JS/Electron — `package.json`. - `meshchatx/src/version.py` синхронизируется из `package.json`: diff --git a/lang/README.zh.md b/lang/README.zh.md index 9272d03..8a2a586 100644 --- a/lang/README.zh.md +++ b/lang/README.zh.md @@ -290,7 +290,7 @@ task build:all ## 版本 -本仓库当前版本: `4.5.1`。 +本仓库当前版本: `4.6.0`。 - JavaScript/Electron 版本以 `package.json` 为准。 - `meshchatx/src/version.py` 通过以下命令与 `package.json` 同步: diff --git a/meshchatx/__init__.py b/meshchatx/__init__.py index ecb9296..d197ba0 100644 --- a/meshchatx/__init__.py +++ b/meshchatx/__init__.py @@ -2,4 +2,4 @@ """Reticulum MeshChatX - A mesh network communications app.""" -__version__ = "4.5.1" +__version__ = "4.6.0" diff --git a/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt b/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt index eb34c4e..c61565b 100644 --- a/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt +++ b/meshchatx/src/backend/data/THIRD_PARTY_NOTICES.txt @@ -76,7 +76,7 @@ pycparser 3.0 pyserial 3.5 License: BSD Author: Chris Liechti -reticulum-meshchatx 4.5.1 +reticulum-meshchatx 4.6.0 License: 0BSD AND MIT Author: Quad4 rns 1.1.9 diff --git a/meshchatx/src/version.py b/meshchatx/src/version.py index a18bd84..9fee25d 100644 --- a/meshchatx/src/version.py +++ b/meshchatx/src/version.py @@ -3,4 +3,4 @@ Do not edit by hand. Run: pnpm run version:sync """ -__version__ = "4.5.1" +__version__ = "4.6.0" diff --git a/package.json b/package.json index 93e7590..9319835 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "reticulum-meshchatx", - "version": "4.5.1", + "version": "4.6.0", "description": "A simple mesh network communications app powered by the Reticulum Network Stack", "homepage": "https://git.quad4.io/RNS-Things/MeshChatX", "desktopName": "reticulum-meshchatx.desktop", diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD index ccdf36b..badab50 100644 --- a/packaging/arch/PKGBUILD +++ b/packaging/arch/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: Ivan pkgname=reticulum-meshchatx-git _pkgname=reticulum-meshchatx -pkgver=4.5.1.r0.gebacc00 +pkgver=4.6.0.r0.gebacc00 pkgrel=1 pkgdesc="A simple mesh network communications app powered by the Reticulum Network Stack" arch=('x86_64' 'aarch64') @@ -19,7 +19,7 @@ sha256sums=('SKIP' pkgver() { cd "$_pkgname" git describe --long --tags 2>/dev/null | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' || \ - printf "4.5.1.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" + printf "4.6.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" } prepare() { diff --git a/pyproject.toml b/pyproject.toml index 970d994..3be6414 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "reticulum-meshchatx" -version = "4.5.1" +version = "4.6.0" description = "A simple mesh network communications app powered by the Reticulum Network Stack" authors = [ {name = "Quad4"} diff --git a/tests/backend/test_app_status_tracking.py b/tests/backend/test_app_status_tracking.py index d4c6d80..5cb047a 100644 --- a/tests/backend/test_app_status_tracking.py +++ b/tests/backend/test_app_status_tracking.py @@ -96,8 +96,8 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir): app_instance.config.set("tutorial_seen", True) assert app_instance.config.get("tutorial_seen") == "true" - app_instance.config.set("changelog_seen_version", "4.5.1") - assert app_instance.config.get("changelog_seen_version") == "4.5.1" + app_instance.config.set("changelog_seen_version", "4.6.0") + assert app_instance.config.get("changelog_seen_version") == "4.6.0" # Test app_info returns these values with ExitStack() as info_stack: @@ -113,4 +113,4 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir): assert val == "true" val = app_instance.config.get("changelog_seen_version") - assert val == "4.5.1" + assert val == "4.6.0" diff --git a/tests/frontend/AppModals.test.js b/tests/frontend/AppModals.test.js index b915a34..aedbb65 100644 --- a/tests/frontend/AppModals.test.js +++ b/tests/frontend/AppModals.test.js @@ -62,9 +62,9 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.5.1", + version: "4.6.0", tutorial_seen: true, - changelog_seen_version: "4.5.1", + changelog_seen_version: "4.6.0", }, }, }); @@ -94,7 +94,7 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.5.1", + version: "4.6.0", tutorial_seen: false, changelog_seen_version: "0.0.0", }, @@ -153,7 +153,7 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.5.1", + version: "4.6.0", tutorial_seen: true, changelog_seen_version: "3.9.0", }, @@ -161,7 +161,7 @@ describe("App.vue Modals", () => { }); } if (url === "/api/v1/app/changelog") { - return Promise.resolve({ data: { html: "

New Features

", version: "4.5.1" } }); + return Promise.resolve({ data: { html: "

New Features

", version: "4.6.0" } }); } if (url === "/api/v1/config") return Promise.resolve({ data: { config: { theme: "dark" } } }); if (url === "/api/v1/auth/status") return Promise.resolve({ data: { auth_enabled: false } }); diff --git a/tests/frontend/ChangelogModal.test.js b/tests/frontend/ChangelogModal.test.js index 339dffa..276d46c 100644 --- a/tests/frontend/ChangelogModal.test.js +++ b/tests/frontend/ChangelogModal.test.js @@ -78,7 +78,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.5.1", + version: "4.6.0", }, }); @@ -95,7 +95,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.5.1", + version: "4.6.0", }, }); @@ -114,7 +114,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.5.1", + version: "4.6.0", }, });