# PeerSpeak — Windows installer

This directory builds a Windows setup installer for PeerSpeak using
[Inno Setup](https://jrsoftware.org/isinfo.php).

PeerSpeak ships as a **single self-contained `peerspeak.exe`** — the GUI icon,
notification chimes, and avatar presets are all embedded in the binary
(`include_bytes!`), and the executable is statically linked against the GNU
runtime, so there are no extra DLLs to bundle. The installer payload is just the
`.exe` plus an `.ico` for the Start-menu / desktop shortcuts.

## Version compatibility

The installer version tracks the release version in `Cargo.toml` — keep
`MyAppVersion` in `peerspeak.iss` in sync when cutting a release. Do not reuse an
old installer filename after a crate-version bump.

Per `VERSIONING.md`, a **MINOR** bump in `0.x` is a **breaking wire change**:
peers on different MINOR versions can't connect (they fail fast at the
handshake rather than misbehaving). So when you ship a new Windows build after
a MINOR bump, **everyone on the call must reinstall** — an old Windows build
and a newer Linux/Windows peer won't talk. (0.3.0 was the chat file-sharing +
per-peer noise-gate release; it cannot connect to a 0.2.x peer.)

## Files

| File | Tracked | Purpose |
|------|---------|---------|
| `peerspeak.iss` | yes | Inno Setup script |
| `peerspeak.ico` | yes | multi-resolution app icon (from `assets/icons/*.png`) |
| `README.md` | yes | this file |
| `peerspeak.exe` | no (gitignored) | staged build artifact, copied from `target/x86_64-pc-windows-gnu/release/` |
| `output/peerspeak-<ver>-setup.exe` | no (gitignored) | the compiled installer |

## Build steps

1. **Cross-compile the Windows binary** (from the repo root, inside the
   `peerspeak-win` archlinux distrobox):

   ```sh
   RUSTC_BOOTSTRAP=1 ./win-cross-build.sh -Z build-std=std,panic_abort
   ```

   This needs the `rust-src` component and the `x86_64-pc-windows-gnu` target
   installed in that toolchain. The result is a statically-linked,
   GUI-subsystem `.exe` (no stray console window).

2. **Stage the binary** next to the script:

   ```sh
   cp target/x86_64-pc-windows-gnu/release/peerspeak.exe packaging/windows/
   ```

3. **Regenerate the icon** if the source PNGs changed:

   ```sh
   magick assets/icons/peerspeak-16.png assets/icons/peerspeak-24.png \
          assets/icons/peerspeak-32.png assets/icons/peerspeak-48.png \
          assets/icons/peerspeak-64.png assets/icons/peerspeak-128.png \
          assets/icons/peerspeak-256.png packaging/windows/peerspeak.ico
   ```

4. **Compile the installer** with Inno Setup. On Linux this runs under Wine:

   ```sh
   cd packaging/windows
   wine ~/.wine/drive_c/InnoSetup6/ISCC.exe peerspeak.iss
   ```

   The installer lands at `output/peerspeak-<version>-setup.exe`.

## What the installer does

- Installs `peerspeak.exe` to `Program Files\PeerSpeak` (requires admin / one
  UAC prompt).
- Creates a Start-menu shortcut, with an optional desktop shortcut.
- Optionally adds a Windows Firewall allow-rule for PeerSpeak (recommended —
  iroh uses UDP hole-punching, so this avoids a mid-call firewall prompt). The
  rule is removed on uninstall.
- Provides a standard uninstaller.

> **Note:** the installer and the binary are **not code-signed**, so Windows
> SmartScreen will show an "unknown publisher" warning on first run. The user
> clicks *More info → Run anyway*. Removing this warning requires a paid
> code-signing certificate.
