diff options
| author | Christophe Besson <cbesson@gmail.com> | 2026-09-04 09:28:14 +0200 |
|---|---|---|
| committer | Christophe Besson <cbesson@gmail.com> | 2026-09-04 09:28:14 +0200 |
| commit | 3ce52774760b222d94d78bc0118e9da2662a809f (patch) | |
| tree | 52a16c7e05080869fbb17b83665b2fb2048b21e2 /docs/PACKAGING-GUIDE.md | |
| parent | 220e6e701806213a576ce80fa655cd9cf4a51880 (diff) | |
| download | meshbay-3ce52774760b222d94d78bc0118e9da2662a809f.tar.gz | |
feat: Windows installer (W4) — one per-user NSIS package, client + node
`npm run dist:win` produces MeshBay-Setup-<version>.exe: the Electron client
and, beside it under resources/node-runtime/, the frozen meshbay-node daemon
(meshbay-common inside it). No hub. Per-user, no elevation — matches the W3
constraint that a logon-triggered scheduled task needs admin.
electron-builder / package.json
build.win nsis, build/icon.ico, extraResources -> node-runtime/
build.nsis oneClick:false perMachine:false allowElevation:false
allowToChangeInstallationDirectory:true
dist:win -> packaging/win/build-win.ps1 (mirrors dist -> build-client.sh)
packaging/win/
meshbay-node.spec + node-entry.py PyInstaller freeze of
meshbay_node.daemon:main. The awkward deps (aiortc, av, aioquic,
pydantic_core, uvicorn, watchdog, guessit, blake3, tzdata) are pulled
in whole with collect_all — that list is expected to grow when a frozen
run raises ModuleNotFoundError.
build-node-runtime.ps1 throwaway venv -> pip install -> PyInstaller ->
packages/meshbay-client/node-runtime/ (gitignored)
build-win.ps1 Node>=22 check, npm ci, Electron bump, sync-ui,
node runtime, electron-builder --win nsis
bump-electron.mjs the Chromium-CVE "build against latest Electron"
policy, out of the PS script (5.1 here-string terminator rules)
README.md
PyInstaller, not the python-embed zip: the frozen meshbay-node.exe is a
genuine relocatable single binary, which is what src/main.js:findNodeBinary
spawns (process.resourcesPath/node-runtime/meshbay-node.exe when packaged) and
what the W3 autostart launcher points at. The embeddable zip needs pip to make
that wrapper and the wrapper bakes in an absolute interpreter path.
build/installer.nsh: on uninstall, taskkill meshbay-node.exe and delete the W3
Startup .vbs (it would point wscript at a deleted binary every sign-in).
%LOCALAPPDATA%\meshbay\ — node.toml, keystore.enc — is never touched.
ffmpeg is not bundled by default (node finds it on PATH); build-win.ps1
-FfmpegDir copies ffmpeg.exe/ffprobe.exe in for a self-contained installer.
Verified on the Windows guest: PyInstaller freeze builds first try
(node-runtime 147 MB), frozen `meshbay-node status` talks to the live daemon's
loopback API; electron-builder --win nsis produces MeshBay-Setup-0.1.0.exe
(155 MB), oneClick/perMachine flags applied, node-runtime bundled at the path
findNodeBinary expects. test_packaging_win.py (14) pins the config invariants
and the NSIS <-> platform.py autostart seam. Node suite 798 pass / 34 skip.
Open: Authenticode signing (13.9 — unsigned => SmartScreen), Windows CI
(18.3), electron-updater. First clean-machine install + DPAPI + autostart
round-trip is a manual check.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'docs/PACKAGING-GUIDE.md')
| -rw-r--r-- | docs/PACKAGING-GUIDE.md | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/docs/PACKAGING-GUIDE.md b/docs/PACKAGING-GUIDE.md index 0f9997d..5a5c388 100644 --- a/docs/PACKAGING-GUIDE.md +++ b/docs/PACKAGING-GUIDE.md @@ -59,6 +59,51 @@ sudo rpm -e meshbay-client meshbay-hub meshbay-node meshbay-common --- +## Windows + +One installer, **`MeshBay-Setup-<version>.exe`**, carries the client **and** the +node (with `meshbay-common` inside it). There is no Windows hub. + +### Install + +Run the installer. It is **per-user** — no administrator prompt — and lands in +`%LOCALAPPDATA%\Programs\meshbay-client\`. The node daemon ships beside the app +at `resources\node-runtime\meshbay-node.exe`; the client finds it automatically. + +**ffmpeg** is required for video streaming and is *not* in the installer unless +it was built with `-FfmpegDir`. Otherwise install it separately +(`winget install ffmpeg`) so the node finds it on `PATH`. + +### First run + +Open MeshBay and sign in. Use the **Node** page (or a terminal) to provision: + +``` +meshbay-node init +meshbay-node autostart install # run the daemon at every sign-in (no admin) +``` + +Runtime data — `node.toml`, `keystore.enc`, `unlock.key`, `data\` — lives in +`%LOCALAPPDATA%\meshbay\` and **survives uninstall/reinstall**. + +### Uninstall + +*Apps & features → MeshBay → Uninstall*, or the Start-menu *Uninstall MeshBay* +entry. It stops a running daemon and removes the sign-in launcher; it does not +touch `%LOCALAPPDATA%\meshbay\` (the keystore). + +### Build from source + +See [`packaging/win/README.md`](../packaging/win/README.md). On a machine with +Node ≥ 22 and Python ≥ 3.12: + +```powershell +cd packages\meshbay-client +npm run dist:win +``` + +--- + ## Post-install: Node (desktop user) ### 1. Initialize |