# Housing installer Publish the app as a self-contained Windows x64 application to `obj/setup-staging/app` before running `powershell -File installer/build.ps1`. The build requires WiX 6.0.2 at `obj/installer-tools/wix.exe` and WixToolset.Bal.wixext 6.0.2 in the local WiX extension cache. The default version is `1.0.3`, which can upgrade the previously distributed `1.0.0` through `1.0.2` WiX packages. For every subsequent release, set `-ProductVersion` to a higher three-part version than the installed release. Reusing a version does not produce a major upgrade; Windows Installer compares the first three version fields. The unsigned HousingSetup.exe contains Housing.msi, which installs for the current user under `%LOCALAPPDATA%\Housing` and adds Housing shortcuts to the desktop and Start menu. It does not require a separate .NET runtime. The retained final release is `installer/output/HousingSetup-1.0.3.exe` (built October 28, 2026). This standalone bundle includes the MSI; no separate MSI file is needed for installation. Build outputs, downloaded build tools, and older installers have been removed from the working folder. Installation creates a `Housing` folder on the current user's Windows desktop (including a redirected/OneDrive desktop) and puts `Hardware.ini`, `Database.ini`, and `InspectionSettings.ini` there. Both the main window and login window read these desktop settings; edited judgement limits are saved to the same `InspectionSettings.ini`. Restart the app after manually editing INI files. Existing desktop INI files are preserved. When a desktop INI is missing, setup copies its counterpart from the previous `%LOCALAPPDATA%\Housing` installation if available, otherwise installs the bundled default. For inspection limits, the previously saved `%LOCALAPPDATA%\AMO Housing\InspectionSettings.ini` takes priority over the old installation's bundled file. Migration copies files without deleting the originals. INI files survive upgrade, repair and uninstall. `LoginOptions.json` remains in the installation directory and is also preserved. Update settings manually when a new release introduces required keys. Starting with 1.0.3, the default `Hardware.ini` uses `[StartSignal] TimeoutMilliseconds=0`: after a valid barcode and judgement limits, the app waits indefinitely for the equipment start signal. The screen identifies this as a wait without a time limit. The existing inactive-before-active check remains enabled, so an already-held button must be released and pressed again. NI driver/connection errors still stop the inspection. Existing installations keep their INI values; to enable indefinite waiting there, change `TimeoutMilliseconds=30000` to `TimeoutMilliseconds=0` in the desktop `Housing\Hardware.ini` before the next inspection. Positive values still enable a finite timeout in milliseconds. Build and check from the repository root: After a cleanup or fresh checkout, restore the pinned installer tools first: ```powershell dotnet tool install --tool-path obj/installer-tools wix --version 6.0.2 ./obj/installer-tools/wix.exe extension add WixToolset.Bal.wixext/6.0.2 ``` ```powershell dotnet run --project tools/SettingsPathChecks/SettingsPathChecks.csproj -- obj/settings-path-checks dotnet publish Housing.csproj -c Release -r win-x64 --self-contained true -o obj/setup-staging/app -p:Version=1.0.3 powershell -File installer/build.ps1 -OutputDir installer/output powershell -File tools/SettingsPathChecks/Check-Installer.ps1 ``` The checks use isolated fixtures under `obj`, including read-only MSI inspection and AppSearch/condition evaluation. They do not install the product or change the user's desktop/settings. The WiX installer has its own upgrade identity and does not automatically remove previous installers created by the legacy Setup projects. Installation, upgrade, and database and hardware connectivity must be tested on a representative target computer. The package is not code-signed. The package includes the current Database.ini, which can contain database credentials; distribute it only to authorized recipients. It includes add-resistance-column.sql but does not execute it against the database.