Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/flatpak.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ jobs:
- name: Clone Ratspeak stack (rsReticulum, rsLXMF)
env:
WORKSPACE_ROOT: ${{ github.workspace }}/.rsstack
# Keep in sync with reticulum-sidecar.yaml / ratspeak-stack-ci-pins.env.
RS_RETICULUM_REF: 90774570eae7498554b4809d9203765368c5bbed
RS_LXMF_REF: c3d8b44942e7726dbbe6bb53e0976d4c72134119
run: bash scripts/clone-ratspeak-stack.sh

- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
Expand Down
7 changes: 7 additions & 0 deletions .github/workflows/reticulum-sidecar.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,13 @@ name: Reticulum sidecar
permissions:
contents: read

# Stacked Nomad file/metadata work: pin siblings until upstream PRs merge, then float again.
# ratspeak/rsReticulum#26, ratspeak/rsLXMF#7 (rsNomad#7 merged — float). Keep in sync with
# scripts/ratspeak-stack-ci-pins.env and RATSPEAK_STACK_PR_ENTRIES in scripts/update.sh.
env:
RS_RETICULUM_REF: 90774570eae7498554b4809d9203765368c5bbed
RS_LXMF_REF: c3d8b44942e7726dbbe6bb53e0976d4c72134119

on:
workflow_dispatch:
push:
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ Adding a cross-boundary feature:

**Local Linux CI (optional):** Container mode — `act:ci`, `act:tests`, `act:pr`, … (needs a Docker-compatible engine + act; Podman preferred). Host mode — `act:ci:native`, `act:tests:native`, … (no container engine). See [docs/ci-cd.md](docs/ci-cd.md). macOS/Windows packaging uses native `dist:mac` / `dist:win`. **`dist:mac`** / **`dist:mac:publish`** always run **`scripts/verify-mac-packaging.mjs`** (ZIP + DMG symlink asserts, no raw `.app` CI uploads). macOS signing env (`CSC_LINK`, `CSC_KEY_PASSWORD`, `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, `APPLE_TEAM_ID`, `CSC_IDENTITY_AUTO_DISCOVERY`) is scoped to **`macos-latest`** jobs in `release.yaml` / `build.yaml`; partial-secret validation fails the release job when `CSC_LINK` is set but notarization secrets are missing.

> **Update script sync:** When adding or removing packages from `patchedDependencies` in `pnpm-workspace.yaml`, keep `WATCH_ENTRIES` in `scripts/update.sh` in sync so the script warns on version changes to every patched dependency. When adding or removing Ratspeak overlays under `reticulum-sidecar/patches/`, keep `RATSPEAK_PATCH_ENTRIES` in `scripts/update.sh` (`check_ratspeak_patches`) in sync — `pnpm run update` queries upstream PRs (rsReticulum / rsLXMF) and warns when a local overlay can be removed. It also runs `check_ratspeak_upstream` (watched **published** releases for rsLXST / lrgp-rs / Ratspeak vs `reviewed-ref` pins, plus new `ratspeak` org repos) — keep `RATSPEAK_RELEASE_WATCH_ENTRIES` / `RATSPEAK_KNOWN_ORG_REPOS` in sync when adopting libs. LXMFace is not a published-release watch: its baseline is a vendored-file commit (`file:js/lxmface.js@<sha>`) compared with the latest GitHub commit that touched that file. `scripts/clone-ratspeak-stack.sh` floats **rsReticulum** / **rsLXMF** / **rsNomad** / **rsLXST** / **lrgp-rs** to `origin/main` (override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF`); overlays must apply or the clone fails. Ratspeak release watch uses stub-kind `games-parity` to nudge Games tab review when a published release is newer than the pin (`docs/reticulum-games-parity.md`). Peer default avatars use vendored **LXMFace** (`src/renderer/lib/reticulum/lxmface.ts`). `pnpm run update` also runs `rustup update` (or Homebrew `rust` on macOS without rustup) and `cargo build` in `reticulum-sidecar/` when `cargo` is on `PATH` (full-feature build includes `nomad-core` / rsNomad).
> **Update script sync:** When adding or removing packages from `patchedDependencies` in `pnpm-workspace.yaml`, keep `WATCH_ENTRIES` in `scripts/update.sh` in sync so the script warns on version changes to every patched dependency. When adding or removing Ratspeak overlays under `reticulum-sidecar/patches/`, keep `RATSPEAK_PATCH_ENTRIES` in `scripts/update.sh` (`check_ratspeak_patches`) in sync — `pnpm run update` queries upstream PRs (rsReticulum / rsLXMF) and warns when a local overlay can be removed. Stacked **feature** PRs that mesh-client CI pins (not overlays) live in `RATSPEAK_STACK_PR_ENTRIES` + `scripts/ratspeak-stack-ci-pins.env` (`check_ratspeak_stack_prs`) — today [rsReticulum#26](https://github.com/ratspeak/rsReticulum/pull/26) and [rsLXMF#7](https://github.com/ratspeak/rsLXMF/pull/7); clear pins when those merge. It also runs `check_ratspeak_upstream` (watched **published** releases for rsLXST / lrgp-rs / Ratspeak vs `reviewed-ref` pins, plus new `ratspeak` org repos) — keep `RATSPEAK_RELEASE_WATCH_ENTRIES` / `RATSPEAK_KNOWN_ORG_REPOS` in sync when adopting libs. LXMFace is not a published-release watch: its baseline is a vendored-file commit (`file:js/lxmface.js@<sha>`) compared with the latest GitHub commit that touched that file. `scripts/clone-ratspeak-stack.sh` floats **rsReticulum** / **rsLXMF** / **rsNomad** / **rsLXST** / **lrgp-rs** to `origin/main` (override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF`); overlays must apply or the clone fails. Ratspeak release watch uses stub-kind `games-parity` to nudge Games tab review when a published release is newer than the pin (`docs/reticulum-games-parity.md`). Peer default avatars use vendored **LXMFace** (`src/renderer/lib/reticulum/lxmface.ts`). `pnpm run update` also runs `rustup update` (or Homebrew `rust` on macOS without rustup) and `cargo build` in `reticulum-sidecar/` when `cargo` is on `PATH` (full-feature build includes `nomad-core` / rsNomad).

**Pre-commit hook order:**

Expand Down
9 changes: 6 additions & 3 deletions docs/ci-cd.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Path-filtered on `reticulum-sidecar/**` and related scripts:
1. **`lint` job (ubuntu-latest)** — `cargo fmt --check` + `cargo clippy` with `rns-stack,rns-ble,rns-rnode-tcp` (`-D warnings`)
2. **Build matrix** — stub + full-stack `cargo test` and release builds on Linux, macOS, and Windows (including WoA arm64 jobs)

CI and local **dev** clones float the `.rsstack/` workspace via `scripts/clone-ratspeak-stack.sh` to `origin/main` (overlays must apply; override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF` for bisect). **Release** packaging (`scripts/build-reticulum-sidecar-release.mjs`) runs the same clone and records the resolved commit SHAs for all five crates in `.rsstack/RESOLVED_SHAS.txt` so artifacts retain the exact source revisions used — pin via `RS_*_REF` when a release must not float.
CI and local **dev** clones float the `.rsstack/` workspace via `scripts/clone-ratspeak-stack.sh` to `origin/main` (overlays must apply; override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF` for bisect). When CI must build against open stacked ratspeak PRs, `scripts/ratspeak-stack-ci-pins.env` supplies defaults under `CI=true` (tracked by `RATSPEAK_STACK_PR_ENTRIES` in `scripts/update.sh`; see [reticulum-sidecar/patches/README.md](../reticulum-sidecar/patches/README.md#stacked-upstream-feature-prs-ci-pins)). **Release** packaging (`scripts/build-reticulum-sidecar-release.mjs`) runs the same clone and records the resolved commit SHAs for all five crates in `.rsstack/RESOLVED_SHAS.txt` so artifacts retain the exact source revisions used — pin via `RS_*_REF` when a release must not float.

Local parity: `pnpm run reticulum:sidecar:clippy:full`, `pnpm run check:reticulum-sidecar` (pre-commit full-feature). See [development-environment.md](development-environment.md#reticulum-sidecar-optional).

Expand Down Expand Up @@ -185,11 +185,14 @@ Automated dependency updates are configured in `.github/dependabot.yml`:
- **GitHub Actions:** Grouped into one PR
- **Open PRs:** `open-pull-requests-limit: 0` — Dependabot scans but does **not** open PRs.
Dependency bumps are applied manually via `pnpm run update` (`scripts/update.sh`), which
also runs dedupe, Ratspeak overlay PR checks, and an upstream release / new-org-repo watch
also runs dedupe, Ratspeak overlay PR checks, stacked feature-PR pin watches
([rsReticulum#26](https://github.com/ratspeak/rsReticulum/pull/26) ReplyFile,
[rsLXMF#7](https://github.com/ratspeak/rsLXMF/pull/7) multi-file attachments — see
`scripts/ratspeak-stack-ci-pins.env`), and an upstream release / new-org-repo watch
(rsLXST, lrgp-rs, Ratspeak Games-parity when a newer published release exists, LXMFace
`js/lxmface.js` commit). Sibling **rsReticulum** /
**rsLXMF** / **rsNomad** / **rsLXST** / **lrgp-rs** float to `origin/main` via
`clone-ratspeak-stack.sh` (overlays must apply). See AGENTS.md §6.
`clone-ratspeak-stack.sh` (overlays must apply; CI may pin open stacked PRs). See AGENTS.md §6.

### Testing Dependabot PRs locally

Expand Down
2 changes: 1 addition & 1 deletion docs/reticulum.md
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,7 @@ Firmware `.zip` files are selected locally (no in-app GitHub download). Disconne

## Building the sidecar (development)

`rns-stack` builds need the repo-local `.rsstack/` workspace checkouts `rsReticulum`, `rsLXMF`, `rsNomad`, `rsLXST`, and `lrgp-rs` (see `scripts/clone-ratspeak-stack.sh`). That script floats each to `origin/main` by default (bisect with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF`) and applies mesh-client overlays for rsReticulum/rsLXMF (fails if a patch will not apply). Peer list / detail default avatars use [LXMFace](https://github.com/ratspeak/LXMFace) (`src/renderer/lib/reticulum/lxmface.ts`) when no custom Lucide icon is set.
`rns-stack` builds need the repo-local `.rsstack/` workspace checkouts `rsReticulum`, `rsLXMF`, `rsNomad`, `rsLXST`, and `lrgp-rs` (see `scripts/clone-ratspeak-stack.sh`). That script floats each to `origin/main` by default (bisect with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF`) and applies mesh-client overlays for rsReticulum/rsLXMF (fails if a patch will not apply). CI may pin open stacked feature PRs ([rsReticulum#26](https://github.com/ratspeak/rsReticulum/pull/26), [rsLXMF#7](https://github.com/ratspeak/rsLXMF/pull/7)) via `scripts/ratspeak-stack-ci-pins.env` — tracked by `pnpm run update`. Peer list / detail default avatars use [LXMFace](https://github.com/ratspeak/LXMFace) (`src/renderer/lib/reticulum/lxmface.ts`) when no custom Lucide icon is set.

End users of **GitHub Releases** or **Flatpak** do not need Rust. Developers and contributors do.

Expand Down
9 changes: 5 additions & 4 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ overrides:
# GHSA-2883-xcg3-v3hh / GHSA-w5vr-8v7q-w6rv / GHSA-82fw-gwwq-j7x9 /
# GHSA-4w3w-2rp5-g8jm / GHSA-w2rr-34g9-rvrj / GHSA-93r5-fhx6-vmg9 /
# GHSA-8344-3jmq-59r6 / GHSA-6h8r-xr42-gp59 / GHSA-27p8-2357-5qqv /
# GHSA-c7q8-3ch8-vqpv).
# GHSA-c7q8-3ch8-vqpv / GHSA-7w5x-hrqm-74c2).
# brace-expansion: keep a single 5.0.9 floor. GHSA-rgw5-rvv9-x895 is a
# bypass of the CVE-2026-14257 mitigation and marks >=4.0.0 <5.0.9 vulnerable
# (only >=5.0.9 counts as patched). CI audit is blocking.
Expand All @@ -85,6 +85,7 @@ overrides:
# baseline-browser-mapping: GHSA-w5vr-8v7q-w6rv — floor >=2.11.0.
# vitest / @vitest/mocker: GHSA-82fw-gwwq-j7x9 — package.json pins vitest
# ^4.1.11 (no override needed while the direct pin holds the floor).
# smol-toml: GHSA-7w5x-hrqm-74c2 (markdownlint-cli2) — floor >=1.7.1.
# extract-zip (GHSA-7pqw-9j4j-h8q3): no patched release; Electron replaced it
# with hardened @electron-internal/extract-zip (not the vulnerable package).
# electron: deliberate major pin — bump with Flatpak sync + native rebuild smoke.
Expand All @@ -100,6 +101,7 @@ overrides:
markdown-it@<=14.1.1: '>=14.2.0 <15'
postcss: ^8.5.25
shell-quote: ^1.9.0
smol-toml: ^1.7.1
tar: ^7.5.18
tmp: ^0.2.6
undici@<7.29.0: ^7.29.0
Expand Down
4 changes: 2 additions & 2 deletions reticulum-sidecar/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ rns-stack = [
"dep:rns-crypto",
"dep:argon2",
"dep:zeroize",
"dep:rmpv",
"dep:tempfile",
"dep:notify",
"dep:rusqlite",
Expand All @@ -55,7 +54,8 @@ uuid = { version = "1", features = ["v4"] }
hex = "0.4"
sha2 = "0.10"
tempfile = { version = "3", optional = true }
rmpv = { version = "1", optional = true }
# Always on: stub builds compile `nomad_file` metadata helpers (Resource name msgpack).
rmpv = "1"

base64 = "0.22"
bytes = "1"
Expand Down
2 changes: 1 addition & 1 deletion reticulum-sidecar/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Install Rust (**1.85+**, edition 2024). Prefer [rustup](https://rustup.rs/). See
./scripts/clone-ratspeak-stack.sh
```

That floats `rsReticulum` / `rsLXMF` / `rsNomad` / `rsLXST` / `lrgp-rs` under `.rsstack/` to `origin/main` (override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF` for bisect). Peer default avatars use [LXMFace](https://github.com/ratspeak/LXMFace) in the **renderer** (`src/renderer/lib/reticulum/lxmface.ts`), not this sidecar.
That floats `rsReticulum` / `rsLXMF` / `rsNomad` / `rsLXST` / `lrgp-rs` under `.rsstack/` to `origin/main` (override with `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` / `RS_LXST_REF` / `RS_LRGP_REF` for bisect). CI may temporarily pin rsReticulum / rsLXMF to open stacked PRs via `scripts/ratspeak-stack-ci-pins.env` (see [patches/README.md](patches/README.md#stacked-upstream-feature-prs-ci-pins); tracked by `pnpm run update`). Peer default avatars use [LXMFace](https://github.com/ratspeak/LXMFace) in the **renderer** (`src/renderer/lib/reticulum/lxmface.ts`), not this sidecar.

**Default (stub stack)** — builds without `--features rns-stack`; Cargo still requires the `.rsstack/` checkouts on disk (CI runs `clone-ratspeak-stack.sh`; locally use the script above):

Expand Down
11 changes: 11 additions & 0 deletions reticulum-sidecar/patches/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@ Patches applied on top of [ratspeak/rsReticulum](https://github.com/ratspeak/rsR

By default `scripts/clone-ratspeak-stack.sh` floats the `.rsstack/` checkouts to **`origin/main`** and applies these overlays (fails loud if a patch will not apply). Use `RS_RETICULUM_REF` / `RS_LXMF_REF` / `RS_NOMAD_REF` to pin a known-good SHA for bisect. Per-overlay **Base commit** tables below record the last regeneration baseline, not a permanent pin — when regenerating, prefer floated `origin/main` and record the short SHA in the PR.

## Stacked upstream feature PRs (CI pins)

mesh-client sometimes depends on **open** ratspeak PRs that are not local overlays (new library APIs). Those are pinned for CI via `scripts/ratspeak-stack-ci-pins.env` (loaded when `CI=true`) and matching workflow `env` blocks. `pnpm run update` tracks them in `RATSPEAK_STACK_PR_ENTRIES` (`scripts/update.sh`) and warns when they merge so pins can be cleared.

| Upstream | What we need | Pin / watch |
| -------- | ------------ | ----------- |
| [ratspeak/rsReticulum#26](https://github.com/ratspeak/rsReticulum/pull/26) | `RequestOutcome::ReplyFile` + `LinkClient::query` Resource metadata | `RS_RETICULUM_REF` |
| [ratspeak/rsLXMF#7](https://github.com/ratspeak/rsLXMF/pull/7) | Multi-file LXMF attachment pack/list APIs | `RS_LXMF_REF` |

After both merge and floated `origin/main` includes them: delete or empty `ratspeak-stack-ci-pins.env`, drop workflow env pins, and remove the matching `RATSPEAK_STACK_PR_ENTRIES` rows.

## Development — overlays/patches

Overlays require **git checkouts** in the repo-local `.rsstack/` workspace (not a bare Cargo cache path):
Expand Down
Loading
Loading