Skip to content

branding: generate + wire real bear app icons (.icns/.ico/png) on all lanes#80

Merged
mdheller merged 1 commit into
mainfrom
brand-icons
Jul 23, 2026
Merged

branding: generate + wire real bear app icons (.icns/.ico/png) on all lanes#80
mdheller merged 1 commit into
mainfrom
brand-icons

Conversation

@mdheller

Copy link
Copy Markdown
Contributor

Found during the start-page audit (#79): every packaged app still wears LibreWolf/Firefox icons. apply-bearbrowser-branding.sh only swapped SVGs, but the OSes consume rasters — .icns in the .app, .ico rc-compiled into firefox.exe, sized .pngs on Linux. The macOS case was broken outright: Info.plist sets CFBundleIconFile=BearBrowser but only an SVG was installed, so the DMG app had a generic icon.

What

  • branding/icons/ — committed raster set generated from branding/bearbrowser.svg: bear-{16..1024}.png (transparent rounded corners), BearBrowser.icns (full iconset), multi-size bear.ico
  • scripts/generate-brand-icons.sh — reproducible generation on a dev Mac (qlmanage + iconutil + Pillow). Encodes the gotcha that qlmanage bakes an opaque white background: corners re-masked to transparent with the SVG's own radius
  • apply-bearbrowser-branding.sh stages the set into the workspace; bearbrowser-patches.py overwrites the librewolf-derived browser/branding/bearbrowser rasters at make dir time — square .png slots matched by real IHDR pixel size (exact-size only; stdlib-only so CI needs no Pillow), non-square wordmarks untouched
  • bearbrowser-package-source-build.sh installs BearBrowser.icns where CFBundleIconFile actually points

Verified

Replacement logic smoke-tested against a simulated librewolf branding dir: 8/8 rasters (5 sized defaults + mozicon128 + icns + ico) replaced with bear content, non-square wordmark preserved, transparency confirmed at every size.

After merge

Dispatch the three nightly lanes and confirm: .app shows the bear in Dock/Finder, firefox.exe shows it in Explorer/taskbar, Linux tarball default*.png are the bear.

… lanes

The packaged apps on all three platforms shipped default LibreWolf/Firefox
raster icons: apply-bearbrowser-branding.sh only copied the SVG over
librewolf*.svg, but the OSes consume rasters — the .icns compiled into the
.app, the .ico rc-compiles into firefox.exe, and the sized .png set on Linux.
Worse, the macOS lane's Info.plist sets CFBundleIconFile=BearBrowser while
only an SVG was installed, so the DMG app icon was broken outright.

- branding/icons/: committed raster set generated from branding/bearbrowser.svg
  (bear-{16..1024}.png, BearBrowser.icns, multi-size bear.ico)
- scripts/generate-brand-icons.sh: reproducible generation (macOS: qlmanage +
  iconutil + sips + Pillow). Gotcha encoded: qlmanage bakes an opaque white
  background — corners are re-masked to transparent (radius mirrors the SVG)
- apply-bearbrowser-branding.sh: stages branding/icons -> workspace/branding-icons
- bearbrowser-patches.py: after creating browser/branding/bearbrowser from
  librewolf, overwrites its rasters with the bear set — square .png slots
  matched by real IHDR pixel size (exact match only, stdlib-only so CI needs
  no Pillow); non-square art (wordmarks) untouched. Verified on a simulated
  branding dir: 8/8 replaced, wordmark preserved
- bearbrowser-package-source-build.sh: installs BearBrowser.icns to
  Contents/Resources so CFBundleIconFile resolves (SVG kept alongside)
@mdheller
mdheller merged commit 9e3d216 into main Jul 23, 2026
17 checks passed
@mdheller
mdheller deleted the brand-icons branch July 23, 2026 12:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant