# Windows distribution, logs, versioning, signing — notes (2026-06-23) Reference for shipping the Offband Meshcore Windows desktop build. Answers four questions raised before the first `feat/64` Windows compile. ## 1. Installer / short-term distribution A Flutter Windows release is a **folder**, not a single exe: `build/windows/x64/runner/Release/` = `offband_meshcore.exe` + `flutter_windows.dll` + plugin DLLs + `data/` (`app.so`, `flutter_assets/`, `icudtl.dat`). The exe will **not** run on its own — it needs the whole folder. **Short-term (zero tooling):** zip the entire `Release/` folder → user extracts → runs the exe. This is effectively what we do now (running a copied exe). - Caveat: a truly clean machine may need the **MSVC runtime** (VC++ redistributable). Present on most Win10/11; bundle the redist or note it if a tester hits a DLL error. - Optional polish without an installer: a **self-extracting zip** (7-Zip SFX) so the user double-clicks one .exe that unpacks + can auto-launch. **Real installers, when ready (rough effort):** | Option | Effort | Notes | |---|---|---| | **MSIX** (`msix` Dart pkg) | Low | `dart run msix:create` packages `Release/` → `.msix`; clean install/uninstall; self-sign or CA-sign; Store-ready. Easiest path, ties in signing. | | **Inno Setup** | Low–Med | Free; short `.iss` script → familiar `setup.exe`. Most control over UX/shortcuts. | | **MSI / WiX** | High | Enterprise/group-policy deployment. Overkill for us now. | **Recommendation:** zip the folder for testing now; **MSIX** when we want a clean install + signing in one step (or Inno Setup if we want a traditional setup.exe). ## 2. Where log files go (today: nowhere) There are **no log files on disk.** Logging is two in-app, in-memory ring buffers: - **BLE/frame debug log** — `BleDebugLogService`, **500-entry** ring, Copy-to-clipboard (the "RX CODE_192 …" dumps). Captures every transport (BLE/USB/TCP). - **App debug log** — `AppDebugLogService`, structured app messages. `debugPrint` goes to stdout, which a **double-clicked release exe has no console for**, and is largely stripped in release mode anyway. So on a release Windows build the **only** diagnostics are the in-app log viewers (copy/paste). **Gap for desktop + real users:** no findable log file for support. If we want one, add a small file logger writing to `getApplicationSupportDirectory()` → `%APPDATA%\app.offband.meshcore\logs\` on Windows (rotating, capped). Small task; worth it before non-technical users are on desktop. (Filed as a follow-up if wanted.) ## 3. Versioning — current state + the gap - **pubspec:** `1.1.1+18` (feat/64 == dev). - **Tags present:** `v1.0.0`, `v1.1.0-rc.1/2/3`, `v1.1.2-ble-test`, `v1.1.2-queuediag` (+ old upstream `Alpha*`). The `observer-g2-rc8/rc9` GitHub pre-releases I made this session are remote-only tags (not semver). - **The gap (honest):** I have **not** been versioning per SAFELANE §Versioning. - This session's commits (#82, #88, #89, #90, #93) did **not** bump pubspec. - rc8/rc9 APKs shipped as `+28`/`+29` via `--build-number` overrides, so the pubspec build number (`+18`) lags what shipped. - Tags already point at **1.1.2** but pubspec still says **1.1.1** — inconsistent. **Cleanup proposal:** 1. Decide the marketing version for this batch. Tags imply **1.1.2** — bump pubspec to `1.1.2+30` (next build after the +29 that shipped). 2. Going forward: bump pubspec **in the milestone commit** and tag `vX.Y.Z` (or `-rc.N`) — stop relying on `--build-number` without a matching pubspec bump. 3. Or wire build-time stamping (`git rev-list --count HEAD`) for the build number so it can't drift (CLAUDE.local notes this as preferred). ## 4. Windows code signing Unsigned exe **runs**, but SmartScreen shows "Windows protected your PC / Unknown publisher" → user clicks **More info → Run anyway**. Annoying, not blocking. **Cert options (separate from our Android keystore):** | Cert | Cost | SmartScreen | |---|---|---| | **Self-signed** | free | warns unless the user installs/trusts the cert first (OK for known testers; MSIX sideload trusts it once) | | **OV** (Sectigo/DigiCert…) | ~$100–300/yr | removes "unknown publisher"; reputation builds with downloads over time | | **EV** (+ hardware token/HSM) | ~$300–600/yr | **instant** SmartScreen trust, no warning day one | **Signing mechanics are easy** (`signtool sign /fd SHA256 /f cert.pfx ...`, or the `msix` package signs for you). The cost/effort is **getting a trusted cert** (CA identity verification + annual fee + an EV token if EV). **Do we bother?** - **Short-term (you + a few testers):** No. The one-time "Run anyway" is fine. - **Public release:** Yes — at least an **OV** cert (or **EV** for zero-warning).