File size: 4,189 Bytes
1b83c9c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# Packaging InsightUX as a downloadable installer

Turns the cloned-repo-plus-venv workflow into a single Windows installer
(`InsightUX-Setup-<version>.exe`) that bundles Python, torch, mediapipe,
onnxruntime, opencv, and pywebview β€” end users need nothing pre-installed.

## One-time setup (per machine you build from)

1. In the project venv: `pip install pyinstaller`
2. Install [Inno Setup 6](https://jrsoftware.org/isdl.php) (free) β€” provides
   `ISCC.exe`, the command-line compiler `installer.iss` needs. Not required
   just to build the app itself, only to build the final installer.
3. (Optional but recommended) Download Microsoft's WebView2 bootstrapper
   (`MicrosoftEdgeWebview2Setup.exe`) from
   [Microsoft's evergreen bootstrapper page](https://developer.microsoft.com/microsoft-edge/webview2/)
   and place it in this `packaging/` folder before compiling the installer β€”
   `installer.iss` bundles and silently runs it if present, as a safety net
   for machines missing the WebView2 Runtime (usually already present on
   modern Windows 10/11, but not guaranteed on older/locked-down machines).
   If you skip this, the installer still builds fine, just without that
   safety net.

## Build

From the repo root:

```powershell
pyinstaller packaging\InsightUX.spec --noconfirm
```

Output: `dist\InsightUX\` (a folder β€” `InsightUX.exe` + `_internal\`). Run
`dist\InsightUX\InsightUX.exe` directly first to confirm it actually starts
before building the installer β€” much faster to debug a missing-DLL/missing-
data-file error at this stage than after wrapping it in an installer.

**Expect to iterate on the first build.** mediapipe, torch, and onnxruntime
all ship native binaries and non-`.py` data files that PyInstaller's default
hooks don't always fully catch β€” see the comments at the top of
`InsightUX.spec` for what's already collected and where to look if the
frozen exe fails to start.

Then build the installer:

```powershell
iscc packaging\installer.iss
```

Output: `packaging\dist_installer\InsightUX-Setup-<version>.exe`.

## Release checklist

Every time you ship a code change as an update:

1. Bump `VERSION` in [browser_session.py](../browser_session.py).
2. Bump `AppVersion`/`MyAppVersion` in [installer.iss](installer.iss) to match.
3. Rebuild (`pyinstaller ...` then `iscc ...`).
4. Update [version.json](../version.json) at the repo root β€” `"latest"` to
   the new version, `"url"` to the new installer's HF download URL.
5. `git lfs` tracks `*.exe` already (see `.gitattributes`) β€” add and push the
   new installer + `version.json` to the `origin` (Hugging Face) remote.

That's it β€” nothing about *publishing* a release is automated. What's
automated is the *checking*: every running copy of InsightUX pings
`version.json` once at startup (`check_for_update()` in browser_session.py)
and shows a clickable "Update available" pill in the toolbar if `"latest"`
is newer than its own `VERSION`. Clicking it opens `"url"` in the user's
default browser β€” still a manual download+run, just automated the "is there
something new" question. No internet, or any failure fetching the file, is
silent (no banner, never an error).

## Why these choices

- **Onedir, not onefile** β€” onefile re-extracts the whole ~1.5-2.5GB bundle
  to a temp directory on every launch. With torch/mediapipe already this
  heavy, that's a genuinely bad startup-time hit. Onedir just runs directly
  from the installed folder.
- **Per-user install (`{localappdata}`), not Program Files** β€” no
  admin/UAC prompt, and avoids Program Files' write-permission restrictions
  for `calibration.pkl`/`sessions/`, which the running app writes directly
  into its own folder (see `RESOURCE_DIR`/`DATA_DIR` in browser_session.py).
- **Fixed `AppId` GUID in installer.iss** β€” this is what makes a new
  installer upgrade the existing install in place instead of creating a
  second copy. Never regenerate it.
- **torch is bundled** (not excluded) β€” its fine-tuning step measurably
  improves calibration accuracy (169-204px mean error vs. 275px without it,
  per calibrate.py's own numbers). Confirmed with the project owner as
  worth the larger download.