4.7 KiB
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 upstreamAlpha*). Theobserver-g2-rc8/rc9GitHub pre-releases I made this session are remote-only tags (not semver). - The gap (honest): I have not been versioning per SAFELANE §Versioning.
Cleanup proposal:
- 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). - Going forward: bump pubspec in the milestone commit and tag
vX.Y.Z(or-rc.N) — stop relying on--build-numberwithout a matching pubspec bump. - 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).