Sanyam0385
Add browser chrome, packaging pipeline, and fix UTF-8 crash in calibration
1b83c9c
|
Raw
History Blame Contribute Delete
4.19 kB
# 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.