Files
backspace/scripts/gen-icons.README.md
T
Jannis Braun 7a8d0ce0e2 fix(brand): logo.png is bare mark on transparent, 75% padded
The previous Element-1 (full badge) approach produced a visible
warm-grey #1d1d1b square inside the cool-dark #1a1a23 sidebar — the
two near-blacks differ enough in hue to read as a foreign rectangle
in the slot.

The right answer (third time lucky): the SpaceSidebar's 40×40
rounded-[20px] tile already IS the dark squircle frame. logo.png now
composites the bare gradient mark at 75% on a transparent canvas:
the sidebar's tile bg shows through, the 25% padding keeps the mark
off the squircle edges and clear of the active-state ring, and there
is no foreign-bg colour conflict.

Refactored writeMaskablePng → writeCenteredMarkPng to share one code
path between the maskable PWA (opaque #1d1d1b background, 60% mark)
and the in-app logo (transparent background, 75% mark). Both use the
same composition pipeline; only canvas / scale / bg differ.

Only logo.png regenerated; other 21 outputs byte-identical
(determinism gate verified twice).
2026-04-27 15:20:29 +02:00

2.0 KiB

Icon Generator

Regenerates every brand artefact from assets/brand/*.svg:

  • macOS .icns, Windows .ico, Linux per-size PNGs (packages/desktop/build/)
  • Tray icons for all three platforms (packages/desktop/resources/)
  • Web favicons, PWA manifest icons, maskable, in-app logo.png (packages/web/public/icons/)

When to run

After changing any file under assets/brand/, or after bumping sharp, png-to-ico, or png2icons in the root package.json. Commit the diff in the same PR.

pnpm gen-icons
git status                       # review which files changed
git add packages/desktop/build/ packages/desktop/resources/ packages/web/public/icons/
git commit -m "chore: regenerate brand icons"

(Stage explicit paths rather than git add -A — the generator only writes to those three directories, and an unrelated working-tree change shouldn't accidentally land in a "regenerate icons" commit.)

Determinism

Output is byte-stable for a given lockfile. The same SVGs in produce the same PNG/ICO/ICNS bytes out, every time, on every OS — Sharp uses resvg internally and writes deterministic PNGs, png-to-ico and png2icons don't embed timestamps.

Caveat: byte-stability is not guaranteed across version bumps of the three encoder deps. After a Renovate / dependabot PR upgrades any of them, run pnpm gen-icons once and commit the resulting diff inside the same PR. That follow-up commit isn't an artwork change — it's encoder output drift, and gating it inside the dep PR keeps the artwork-change git history clean.

Source SVGs

Brand source Drives
assets/brand/app-icon.svg Every full app icon, all favicons, PWA
assets/brand/mark.svg Win/Linux tray, in-app logo.png, PWA maskable inner mark
assets/brand/mark-mono-dark.svg macOS menu-bar template (alpha + black)

Artworks-Backspace/ is the design archive — never read by this script.