diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e3d15f..5150f3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ All notable changes to this project will be documented in this file. - **NomadNet file downloads (cancel)**: Fixed `AttributeError` when cancelling a download — `RequestReceipt` has no `.cancel()`; we now cancel the underlying `Resource` if present, or mark the receipt `FAILED` and remove it from the link queue. - **NomadNet browser (links)**: Relative `/page/` and `/file/` URLs from the Micron parser (which include backtick parameters) are now parsed correctly so they no longer show "Unsupported URL". - **NomadNet browser (hover)**: Links with `data-destination` now show the full URL including backtick parameters in the browser hover title. +- **Docker build**: `build-frontend` stage now installs `python3` so docs generation succeeds in `node:24-alpine`. +- **Docs manager**: Markdown tables in generated documentation render with proper borders and padding. ### Added @@ -47,6 +49,9 @@ All notable changes to this project will be documented in this file. - **NomadNet query tests**: Frontend and backend tests for `parseNomadnetworkUrl` with query strings and `downloadNomadNetFile` data payload handling. - **Android RNode protection**: On Android, `RNodeInterface`, `RNodeIPInterface`, and `RNodeMultiInterface` entries in the Reticulum config are automatically disabled before startup to prevent crashes from missing serial/BLE support in Chaquopy. - **Android external storage**: On Android, MeshChatX now defaults to `getExternalFilesDir()` (user-accessible via file managers) instead of private internal storage. +- **CI (Linux packages)**: AppImage, deb, and rpm release assets are now built and tested on every push to `dev` for both x64 and arm64. +- **Docker**: Added a hardened image variant (`-hardened` suffix) with non-root user, read-only rootfs, and restricted capabilities. +- **Map**: Drag-and-drop import of GeoJSON, KML, and KMZ files directly onto the map window, with localized drop hint overlays. ### Changed @@ -61,6 +66,7 @@ All notable changes to this project will be documented in this file. - **Sidebar order**: Reordered sidebar so **Telephone** appears directly below **Messages** for faster access. - **Telephone announce**: Disabled by default in `config_manager`. - **CONTRIBUTING.md**: Updated generative AI policy to emphasize local/offline models and reference the Reticulum Zen and License. +- **Dependencies**: Migrated Python dependency management from **Poetry** to **UV** (0.11.12) across all CI scripts, Dockerfiles, and dev tooling. `poetry.lock` replaced with `uv.lock`. ## [4.6.1] - 2026-05-04 diff --git a/Dockerfile b/Dockerfile index 5689195..c684069 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,17 +16,19 @@ ARG PYTHON_HASH=sha256:dd4d2bd5b53d9b25a51da13addf2be586beebd5387e289e798e4083d9 # ---- STAGE 1: Frontend Build ---- FROM --platform=linux/amd64 ${NODE_IMAGE}@${NODE_HASH} AS build-frontend WORKDIR /src -RUN apk add --no-cache git +RUN apk add --no-cache git python3 COPY package.json pnpm-lock.yaml vite.config.js ./ COPY patches ./patches COPY scripts/fetch-micron-wasm.mjs scripts/fetch-micron-wasm.mjs COPY scripts/micron-wasm-resolve-bundled.mjs scripts/micron-wasm-resolve-bundled.mjs COPY scripts/micron-parser-go-version.mjs scripts/micron-parser-go-version.mjs +COPY scripts/build/fetch_reticulum_manual.py scripts/build/fetch_reticulum_manual.py COPY meshchatx/src/frontend ./meshchatx/src/frontend RUN npm install -g pnpm@10.33.0 && \ pnpm config set verify-store-integrity true && \ pnpm install --frozen-lockfile && \ - pnpm run build-frontend + pnpm run build-frontend && \ + pnpm run build-docs # ---- STAGE 2: Python Builder ---- @@ -45,7 +47,8 @@ ENV PATH="/opt/venv/bin:$PATH" # Install essential runtime tools in the venv (cffi verify needs setuptools on Python 3.12+) RUN pip install --no-cache-dir --upgrade "pip>=26.0" "setuptools" "jaraco.context>=6.1.0" -COPY pyproject.toml uv.lock README.md ./ +COPY pyproject.toml uv.lock README.md CHANGELOG.md ./ +COPY logo ./logo COPY vendor ./vendor RUN uv sync --no-group dev --no-install-project && \ rm -rf /root/.cache/pip /root/.cache/uv diff --git a/Dockerfile.hardened b/Dockerfile.hardened index 95481bd..9078f46 100644 --- a/Dockerfile.hardened +++ b/Dockerfile.hardened @@ -13,17 +13,19 @@ ARG PYTHON_RUNTIME_IMAGE=cgr.dev/chainguard/python:latest-dev FROM --platform=linux/amd64 ${NODE_IMAGE} AS build-frontend USER root WORKDIR /src -RUN apk add --no-cache git +RUN apk add --no-cache git python3 COPY package.json pnpm-lock.yaml vite.config.js ./ COPY patches ./patches COPY scripts/fetch-micron-wasm.mjs scripts/fetch-micron-wasm.mjs COPY scripts/micron-wasm-resolve-bundled.mjs scripts/micron-wasm-resolve-bundled.mjs COPY scripts/micron-parser-go-version.mjs scripts/micron-parser-go-version.mjs +COPY scripts/build/fetch_reticulum_manual.py scripts/build/fetch_reticulum_manual.py COPY meshchatx/src/frontend ./meshchatx/src/frontend RUN npm install -g pnpm@10.33.0 && \ pnpm config set verify-store-integrity true && \ pnpm install --frozen-lockfile && \ - pnpm run build-frontend + pnpm run build-frontend && \ + pnpm run build-docs FROM ${PYTHON_BUILD_IMAGE} AS builder USER root @@ -37,7 +39,8 @@ ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir --upgrade "pip>=26.0" "setuptools" "jaraco.context>=6.1.0" -COPY pyproject.toml uv.lock README.md ./ +COPY pyproject.toml uv.lock README.md CHANGELOG.md ./ +COPY logo ./logo COPY vendor ./vendor RUN uv sync --no-group dev --no-install-project && \ rm -rf /root/.cache/pip /root/.cache/uv diff --git a/meshchatx/src/frontend/components/docs/DocsPage.vue b/meshchatx/src/frontend/components/docs/DocsPage.vue index deb7be4..1ccb9e2 100644 --- a/meshchatx/src/frontend/components/docs/DocsPage.vue +++ b/meshchatx/src/frontend/components/docs/DocsPage.vue @@ -856,4 +856,41 @@ iframe { .dark :deep(.max-w-none) h4 { color: #f4f4f5; /* zinc-100 */ } + +/* Markdown table styling */ +:deep(.max-w-none) table { + width: 100%; + border-collapse: collapse; + margin: 1rem 0; + font-size: 0.875rem; +} + +:deep(.max-w-none) th, +:deep(.max-w-none) td { + border: 1px solid #d1d5db; + padding: 0.5rem 0.75rem; + text-align: left; +} + +:deep(.max-w-none) th { + background-color: #f3f4f6; + font-weight: 700; +} + +:deep(.max-w-none) tr:nth-child(even) { + background-color: #f9fafb; +} + +.dark :deep(.max-w-none) th, +.dark :deep(.max-w-none) td { + border-color: #3f3f46; +} + +.dark :deep(.max-w-none) th { + background-color: #27272a; +} + +.dark :deep(.max-w-none) tr:nth-child(even) { + background-color: #18181b; +} diff --git a/meshchatx/src/frontend/components/map/MapPage.vue b/meshchatx/src/frontend/components/map/MapPage.vue index b90b51e..5e8dd7b 100644 --- a/meshchatx/src/frontend/components/map/MapPage.vue +++ b/meshchatx/src/frontend/components/map/MapPage.vue @@ -149,7 +149,24 @@ /> -
+ + + +GeoJSON, KML, or KMZ
+