Source integration favicons from integrations.sh/logo#1250
Conversation
integrations.sh now proxies context.dev's Logo Link behind an edge cache, so it becomes the single logo source; the Google favicon service stays in the resolution cascade as the onError fallback.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-marketing | ed09aac | Commit Preview URL Branch Preview URL |
Jul 02 2026, 02:50 AM |
Greptile SummaryThis PR replaces per-site
Confidence Score: 5/5Safe to merge; the cascade ensures Google's favicon service is always the final fallback, so no integration will silently lose its icon. The change is a straightforward URL substitution across preset files and a well-tested cascade extension. The existing onError fallback chain guarantees a working icon even if the new proxy is unreachable. The one observation (preset-icon path retries the proxy twice before Google) is a minor inefficiency that only surfaces when the proxy is down, and does not affect correctness. No files require special attention; the preset files are mechanical substitutions and the cascade logic in integration-favicon.tsx is clean. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[IntegrationFavicon renders] --> B{args.icon set?}
B -- Yes --> C[Try preset icon\nhttps://integrations.sh/logo/domain]
B -- No --> E
C -- success --> Z[Display icon]
C -- onError --> D{args.sourceId = executor?}
D -- Yes --> F[Try /favicon-32.png]
D -- No --> E
F -- success --> Z
F -- onError --> E
E[integrationFaviconUrl\nhttps://integrations.sh/logo/domain?sz=N] -- success --> Z
E -- onError --> G[integrationFaviconFallbackUrl\nhttps://www.google.com/s2/favicons?domain=X&sz=N]
G -- success --> Z
G -- onError --> H[BoxIcon placeholder]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[IntegrationFavicon renders] --> B{args.icon set?}
B -- Yes --> C[Try preset icon\nhttps://integrations.sh/logo/domain]
B -- No --> E
C -- success --> Z[Display icon]
C -- onError --> D{args.sourceId = executor?}
D -- Yes --> F[Try /favicon-32.png]
D -- No --> E
F -- success --> Z
F -- onError --> E
E[integrationFaviconUrl\nhttps://integrations.sh/logo/domain?sz=N] -- success --> Z
E -- onError --> G[integrationFaviconFallbackUrl\nhttps://www.google.com/s2/favicons?domain=X&sz=N]
G -- success --> Z
G -- onError --> H[BoxIcon placeholder]
Reviews (2): Last reviewed commit: "Route preset vendor favicons through int..." | Re-trigger Greptile |
| it("does not request favicons for local URLs", () => { | ||
| expect(integrationFaviconUrl("http://localhost:3000/private", 20)).toBeNull(); | ||
| expect(integrationFaviconUrl("http://127.0.0.1:3000/private", 20)).toBeNull(); | ||
| expect(integrationFaviconFallbackUrl("http://localhost:3000/private", 20)).toBeNull(); |
There was a problem hiding this comment.
The
127.0.0.1 local-URL guard is tested for integrationFaviconUrl but the new integrationFaviconFallbackUrl is only checked against localhost. Since both functions share the same integrationFaviconDomain helper the guard holds for IPs too, but the symmetry gap makes it easy for a future refactor to silently break IP blocking on the fallback path without a failing test.
| expect(integrationFaviconFallbackUrl("http://localhost:3000/private", 20)).toBeNull(); | |
| expect(integrationFaviconFallbackUrl("http://localhost:3000/private", 20)).toBeNull(); | |
| expect(integrationFaviconFallbackUrl("http://127.0.0.1:3000/private", 20)).toBeNull(); |
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-cloud | ed09aac | Jul 02 2026, 02:53 AM |
Cloudflare previewTorn down — the PR is closed. |
@executor-js/cli
@executor-js/config
@executor-js/execution
@executor-js/sdk
@executor-js/plugin-file-secrets
@executor-js/plugin-graphql
@executor-js/plugin-keychain
@executor-js/plugin-mcp
@executor-js/plugin-onepassword
@executor-js/plugin-openapi
@executor-js/codemode-core
@executor-js/runtime-quickjs
executor
commit: |
Preset icons that pointed at vendor favicon.ico paths (brittle: vendors move or serve HTML) now use the same /logo proxy the derived favicon path uses. Deliberate keeps: svgl.app and fonts.gstatic.com product logos (per-product marks for Google/Microsoft sub-products the domain-keyed proxy can't distinguish), bundled marketing assets, and the app's own favicon links.
|
Extended the sweep: preset icons that pointed at vendor favicon.ico paths (stripe.com, linear.app, notion.com, ... 28 URLs across the openapi/graphql/mcp/microsoft plugins) now route through integrations.sh/logo too. Kept as-is: svgl.app and fonts.gstatic product logos (per-product marks for Google/Microsoft sub-products that a domain-keyed proxy can't distinguish), bundled marketing assets, and the app's own favicon links. Verified every swapped domain serves a real image via the proxy; plugin sdk tests and typecheck pass. |
integrations.sh now exposes
GET /logo/{domain}?sz=N, an edge-cached proxy over a proper logo API, so favicons come from there instead of hitting Google's favicon service directly.integrationFaviconUrlnow buildshttps://integrations.sh/logo/{domain}?sz=N.integrationFaviconFallbackUrl(the old Googles2/faviconsURL), so if the proxy is unreachable the<img>onError handler walks to it automatically; the BoxIcon placeholder remains the terminal fallback.Tests updated and passing (14), full
bun run typecheckgreen.