Branded bitmaps

header.bmp + welcome.bmp from icon.ico.

5 mineasy

The installer's Welcome page and header strip are bitmaps — small PNG-as-BMP images. By default they're NSIS stock. With ~5 lines of script, they become your product's look.

The two bitmaps

  • header.bmp — 150 × 57 px. Sits in the upper-right of every install page after Welcome. Usually contains your logo on a brand background.
  • welcome.bmp — 164 × 314 px. Left- side banner on the Welcome and Finish pages. Tall, narrow, eye-catching.

Wiring them into the NSI

build/windows/installer/project.nsi
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "header.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "header.bmp"
!define MUI_HEADERIMAGE_RIGHT
!define MUI_WELCOMEFINISHPAGE_BITMAP "welcome.bmp"
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "welcome.bmp"
!define MUI_BGCOLOR "F5F1EA"
!define MUI_TEXTCOLOR "0E0E0E"

Background colour + text colour also customisable. Match your brand palette.

Generate from icon.ico — no design step

The Grit release script regenerates both bitmaps from your icon.ico automatically. PowerShell does the work:

scripts/release-desktop.sh (excerpt)
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "
Add-Type -AssemblyName System.Drawing
function Save-Bmp(\$icon, \$w, \$h, \$out) {
\$bmp = New-Object System.Drawing.Bitmap \$w, \$h
\$g = [System.Drawing.Graphics]::FromImage(\$bmp)
\$g.Clear([System.Drawing.Color]::White)
\$src = [System.Drawing.Icon]::ExtractAssociatedIcon('build/windows/icon.ico')
\$g.DrawIcon(\$src, 8, 8)
\$bmp.Save(\$out, [System.Drawing.Imaging.ImageFormat]::Bmp)
}
Save-Bmp 'build/windows/icon.ico' 150 57 'build/windows/installer/header.bmp'
Save-Bmp 'build/windows/icon.ico' 164 314 'build/windows/installer/welcome.bmp'"

Net effect: change your icon.ico, run the release script, both bitmaps reflect the new icon. No Photoshop trips.

Going further — custom bitmaps

For a polished look, replace the auto-generated bitmaps with designer-made ones. Drop them at:

  • build/windows/installer/header.bmp
  • build/windows/installer/welcome.bmp

The release script preserves them if they already exist (or you comment out the regeneration step).

Real BMP, not PNG renamed. NSIS requires actual BMP format. Export from Photoshop / GIMP / Figma as BMP, not PNG with the file extension changed. Bad BMPs render as black rectangles in the wizard.

The icon itself

Your icon.ico is a multi-resolution file — typically 16, 32, 48, 256 px embedded. Generate from a square PNG with an online icon generator (e.g., icoconvert.com).

This icon ends up in:

  • The installer's wizard window
  • The shortcut on the Start menu / Desktop
  • Add/Remove Programs entry
  • The Wails app window in Task Manager

Text strings

The Welcome page text comes from MUI defines:

!define MUI_WELCOMEPAGE_TITLE "Welcome to the FieldPOS Setup Wizard"
!define MUI_WELCOMEPAGE_TEXT "This will install FieldPOS v${INFO_PRODUCTVERSION}.$\r$\n$\r$\nClick Next to continue."
!define MUI_DIRECTORYPAGE_TEXT_TOP "Setup will install FieldPOS in the folder below."
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "Install location"
!define MUI_FINISHPAGE_RUN "$INSTDIR\FieldPOS.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Launch FieldPOS now"

Quick check

You replace icon.ico with a new design. You build the installer. The header bitmap still shows the OLD icon. What did you skip?

Try it

For chapter 5's assignment, ship a fully-branded installer:

  1. Replace build/windows/icon.ico with your real product icon
  2. Run the release script — confirm header.bmp and welcome.bmp were regenerated
  3. Build both installers (full + slim)
  4. Run the full installer on a test machine
  5. Confirm the Welcome wizard shows YOUR icon, not a default
  6. After install, confirm the Start menu shortcut and the running app both use your icon

Paste a screenshot of the branded Welcome page in notes.md.

You finished Building Desktop with Go API 🎉

Five chapters, 14 lessons. You can now:

  • Scaffold + run + build a Wails desktop app
  • Offline-first with SQLite, the outbox pattern, and a sync engine
  • Frameless window with custom titlebar and OS-aware controls
  • In-app auto-updater that swaps the binary from GitHub releases
  • Branded NSIS installers (full + slim) with custom bitmaps

From here: try Building Web + Desktop + Mobile to add a web + admin + mobile companion to the same Go API.

Spot a typo? Have an idea?

Help us improve this lesson. One click opens a GitHub issue with the lesson URL pre-filled — suggest clearer wording, report a bug, or request more depth. The course keeps improving thanks to learners like you.

Suggest an improvement on GitHub