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
--bannerand 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
.exeas 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.exeas its own resource. It needs--banner: the build fails on--banner-darkalone. - 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 cachedtarget\release\uninstall.exestays 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.