The app has an icon
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful

Every build so far shipped the default Electron one. electron-builder said so on
every run — "default Electron icon is used, reason=application icon is not set" —
in a line that is very easy to read past. A store people install games with
should not look like a framework demo in the Dock.

The mark is a W with three lines running into it: the product's initial, and what
it is doing. It uses the window's own palette, so the icon and the application it
opens are the same object. Drawn for the smallest size first, which is what
settled it — at 32px the W still reads and the lines survive as motion rather
than as noise, where a ring, an outline or fine detail did not. A portal, a play
triangle and a send arrow were each drawn and each discarded: they already mean a
loading spinner, a media player and a submit button.

`resources/icon.svg` is the source and the only file anybody should edit.
`make icons` renders the rest. Three committed binaries with no way to regenerate
them is how an icon becomes something nobody dares change, so the ICO is written
here rather than shelling out to ImageMagick — the container is a header and 16
bytes per image, which is not worth a build dependency this machine does not
have.

`directories.buildResources` had to move off the default: electron-builder looks
in `build/`, which this project uses for compiled output and wipes on `make
clean`, so the icons would have been deleted before every package.

The window picks it up when run from source too, where there is otherwise nothing
to carry an icon and a dev run looks like a different application. Guarded on
`app.isPackaged`, because `resources/` is not inside the package and pointing at
it there would be a path that does not exist.

Verified by reading the icon back out of the built bundle rather than trusting
the config: extracted from `WarpEngine Client.app/Contents/Resources/icon.icns`
and looked at, and the ICO parsed entry by entry — 7 images, 16 to 256, each a
valid PNG.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-19 18:14:08 +02:00
co-authored by Claude Opus 5
parent 6285d93790
commit 31da869800
19 changed files with 260 additions and 35 deletions
+18 -25
View File
@@ -1,30 +1,23 @@
# WarpEngine Client 2.5.0
# WarpEngine Client 2.5.1
**A store can be taken off the machine again.** Hovering a store in the side menu shows
a bin. It asks first, and says how many titles will go with it — because removing a
store *uninstalls what it installed*. That is not a convenience: a store's `state.json`
is the only record of which payloads, icons and menu entries belong to it, so leaving
the games behind would leave orphans nothing could ever identify, least of all a later
install of the same store into the same folder. The catalog cache, the settings and any
sign-in token go too.
**The app has an icon.** Until now every build shipped the default Electron one —
`electron-builder` said so on every run, in a line easy to read past: *"default Electron
icon is used, reason=application icon is not set"*. A store you install games with
should not look like a framework demo in the Dock.
**Adding one moved to a + beside Refresh**, and it now takes a catalog address of your
own as well as the ones the registry lists. A bare host is enough — `https` is assumed —
and the name is taken from the address. Both are actions on the whole store rather than
on one of them, which is why they sit together; the full-width "Add a store…" button
under the list read as a third store.
The mark is a **W with three lines running into it**: the product's initial, and what it
is doing. It uses the window's own palette, so the icon and the application it opens are
the same object. It was drawn for the smallest size first — at 32px the W still reads
and the lines survive as motion rather than as noise. A portal, a play triangle and a
send arrow were each tried and each discarded: they already mean a loading spinner, a
media player and a submit button.
**The picker has a way out.** Opening it with a store already installed used to be a
trap: the grid was replaced and nothing short of installing something brought it back.
`resources/icon.svg` is the source and the only file to edit. `make icons` renders the
`.png`, the `.ico`, the `.icns` and the Linux size directory from it — three committed
binaries with no way to regenerate them is how an icon becomes something nobody dares
touch.
**Two things found by the new test.** `make storetest` adds and removes a store in a
sandbox, because removal is the only code here that deletes a directory tree and the
path it deletes is named by the window. It immediately caught that `http://` was
accepted and became a store called *http* — the trailing slashes were being stripped
before the scheme was checked — and that `STORE_ROOT` only *prepended* to the search
path, so a "sandboxed" run still listed the real stores. With a delete button in the
window, a sandbox that can reach a working installation is not a sandbox; it replaces
the search path now.
The window also picks it up when run from source, where there is otherwise no icon to
carry and a dev run looks like a different application from the one being built.
**`btn-secondary` had no styling at all.** It was introduced in 2.4.0 on the card's
sign-in button and on the sign-in panel, and rendered as a plain button in both places.
Nothing else changed: same store handling, same catalog, same sign-in.