Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Branding

Four packaging options make the setup .exe look finished and legally complete: the license text, a custom header banner, the icon (inherited from your application automatically), and the version-info resource. None are required. All are driven from pack, on the CLI or in the config file.

License text

Pass --license <path> and the UTF-8 plain text or CommonMark in that file becomes the EULA shown on the installer’s License page. Both .txt and .md use the same CommonMark renderer, so existing plain-text files remain supported without a configuration change. Paragraphs, headings (levels 1–6), ordered and unordered lists (including nested lists), block quotes, emphasis, strong text, inline and fenced code, thematic breaks and links are supported. Clickable links are limited to http, https and mailto. Images are ignored, table syntax stays plain text, and raw HTML is displayed rather than interpreted. Without a license file, the page shows a built-in placeholder text.

installer_builder.exe pack `
    --product "My App" --product-id myapp --publisher "My Company" --to-version 1.0 `
    --input .\build\myapp --exe myapp.exe `
    --license .\legal\EULA-myapp-en.md `
    --priv-key .\keys\priv.key --pub-key .\keys\pub.key `
    --out .\dist\setup-myapp-1.0.exe

Translations

The installer UI runs in the user’s language, so the EULA can too. Add one file per language with --license-lang <lang>=<path> (repeatable), or a licenses table in the config file:

license  = "legal/EULA-en.md"          # fallback for every other language
licenses = { fr = "legal/EULA-fr.md", de = "legal/EULA-de.md" }

The installer shows the file for its UI language, falling back to license when that language has no entry. If neither is set, it uses the built-in placeholder. Language codes are the 2-letter UI locale codes (fr, de, ja…); an unsupported code fails the build. A CLI --license-lang wins over the config entry for the same language.

The text rides inside the signed payload, so tampering with it invalidates the Ed25519 signature. --verify reports License: custom (<bytes>) or License: built-in placeholder, followed by each translation as , fr (<bytes>).

To hide the License page entirely, see Wizard pages and install location.

Header banner

By default, the wizard’s header is a flat light-gray card with the product title and a sub-line. Pass --banner <path.png> to paint your own image across that whole strip instead.

installer_builder.exe pack `
    --product "My App" --product-id myapp --publisher "My Company" --to-version 1.0 `
    --input .\build\myapp --exe myapp.exe `
    --banner .\branding\header-1400x144.png `
    --priv-key .\keys\priv.key --pub-key .\keys\pub.key `
    --out .\dist\setup-myapp-1.0.exe

A ready-made sample lives in the repo at docs/src/images/banner-sample.png:

How it behaves:

  • Optional. Omit --banner and the header stays the default gray card.
  • PNG only. The file must start with the PNG signature or the build fails. Transparency is supported.
  • Packaged in the .exe as a dedicated resource. There is no external file, and it works the same in toolchain-free mode.
  • Crisp at every DPI. The image is stretched to the header at runtime with high-quality scaling. Author it at twice the logical header size, 1400 x 144 px (the header is 700 x 72 logical px), for a sharp result at 100%, 125%, 150%, and 200% display scale.
  • Keep the left edge light. The product title and sub-line are drawn on top of the banner in dark text, anchored to the left, in both themes unless you add a dark variant. Use a light or low-contrast left third so the title stays readable; busier art belongs on the right, as in the sample above.

The banner is pure branding, so unlike the license it rides as its own raw resource rather than inside the signed manifest. Sign the final .exe with Authenticode to seal the whole file; see Authenticode signing.

Dark theme variant

The WinUI wizard follows the Windows light/dark setting, live. By default the one --banner image serves both themes, with the title drawn over it in dark text. To match dark mode, add --banner-dark <path.png>:

installer_builder.exe pack `
    ... `
    --banner      .\branding\header-1400x144.png `
    --banner-dark .\branding\header-dark-1400x144.png
  • Shown only in dark mode, by the WinUI wizard. The light theme and the classic Win32 wizard, which is always light, keep --banner.
  • Light text. Over the dark banner the title and sub-line switch to light text, so keep its left third dark or low-contrast.
  • Same rules as --banner: PNG only, 1400 x 144 px, packaged in the .exe as its own resource. It needs --banner: the build fails on --banner-dark alone.
  • Switches live. Changing the Windows theme while the installer is open swaps the banner and the text color at once.

In a config file, set banner and banner_dark.

Previewing a banner

You can iterate on a banner without packing a full installer. The debug build of the stub has a preview window that reads any PNG from an environment variable, INSTALLWAY_PREVIEW_BANNER_DARK for the dark variant:

cargo build -p installer
$env:INSTALLWAY_PREVIEW_BANNER = ".\branding\header-1400x144.png"
$env:INSTALLWAY_PREVIEW_BANNER_DARK = ".\branding\header-dark-1400x144.png"
.\target\debug\installer.exe --preview license

On a machine with WinUI available, append -win32 to compare the fallback renderer with the same sample: --preview license-win32.

Switch Windows between light and dark mode (Settings > Personalization > Colors) to check both.

Icon inheritance

At pack time, the builder reads the icon resources from <input>\<exe> (your application) and stamps them into both the setup .exe and the embedded uninstall.exe. Explorer then shows your application’s own icon on the installer and uninstaller files, and on the Windows Apps entry.

  • No flag is needed. It happens automatically when <input>\<exe> has icon resources.
  • If the source exe has no icon resources, the build prints a notice and falls back to the default icon.
  • The uninstaller is stamped on a staging copy in %TEMP%, so the cached target\release\uninstall.exe stays untouched between pack runs.

Version info

pack stamps a Win32 VS_VERSIONINFO resource built from --product, --publisher, and --to-version. Explorer’s Details tab then shows FileVersion, ProductVersion, ProductName, CompanyName, FileDescription (<product> Setup), OriginalFilename, and copyright. A complete version resource makes the binary look finished and helps build SmartScreen reputation.

--to-version is parsed as a.b.c.d with missing parts set to zero, so 1.2 becomes 1.2.0.0.