Conversation
A button pointing at an application that is not in the Dock has drawn the kind's glyph rather than its icon. The widget knows the name the user typed and needs the bundle id the icon is filed under, so it read `/api/apps/installed` itself — but a widget's frame is served with `connect-src 'none'`, so that request never left the page: the console says the connection violates the policy, the list stayed empty, and only the applications the Dock had already named resolved to an icon. `Fremkit.installedApps()` asks the host page, which is the server's own origin, exactly as `Fremkit.favicon()` does one step further along. The route already answers names and bundle ids without a filesystem path, so the widget learns nothing it could not have asked for before. When the answer does not come the Dock match and the glyph still stand. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
mcouzinet
force-pushed
the
shortcuts-installed-apps
branch
from
September 22, 2026 17:07
c046c8d to
353f6d0
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
A shortcut button pointing at an application that is not in the Dock draws the kind's
□glyph instead of the app's icon. The widget has the name the user typed and needs the bundle id the icon is filed under, soloadInstalled()reads/api/apps/installeditself — but a widget's frame is served withconnect-src 'none'(WIDGET_CSP), so the request never leaves the page:installedtherefore stays empty and only what the Dock has already named resolves to an icon. Same class of bug as the favicons one, and the same shape of fix, one step further along:Fremkit.installedApps()asks the host page, which is the server's own origin, and hands the list back.server/src/bridge/fremkit.js—installedApps(), besidefavicon().ui/src/shared/useWidgetBridge.ts— thefremkit:appscase: fetch the route, reply with the list,bridge.noAppswhen it refuses. No request parameters, so nothing to validate inwidgetMessages.ts.widgets/shortcuts/index.html—loadInstalled()asks the bridge; the retry timer, the Dock fallback and the glyph are unchanged. Manifest 1.3.0 → 1.3.1.server/test/shortcuts-widget.test.ts— the widget evaluated for real against stubs: the icon of an undocked application, a name filed under another bundle name (Code.app→com.microsoft.VSCode), the glyph while no answer comes, and the Dock fallback. The first two fail onmain.The route answers
{ name, bundleId, file }and no filesystem path, so a widget learns nothing here it could not already ask the Dock channel for — but it is one more thing every widget can ask, ungated likefavicon(). Happy to put it behind a manifest permission instead if you would rather.Checked on a real dashboard (second instance,
FREMKIT_PORT=4302): Terminal and Sequel Ace, neither of them in the Dock, draw their own icons, and the console is clean.pnpm typecheckandpnpm testare green (66 server files / 1352 tests, 30 UI files / 382 tests).🤖 Generated with Claude Code