feat(desktop): add favicons to the Browser panel - #5644
Conversation
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
3a9eaa2 to
3ab927e
Compare
3ab927e to
dd8186a
Compare
ApprovabilityVerdict: Needs human review This PR introduces a new feature for favicon capture and display with significant scope (~2000+ lines of new logic), security-sensitive hostname classification for determining what data is sent to external favicon providers, and new image processing/network handling capabilities. New features of this magnitude warrant human review. You can customize Macroscope's approvability policy. Learn more. |
dd8186a to
25e05dd
Compare
25e05dd to
0e08e18
Compare
0e08e18 to
b5f19cb
Compare
b5f19cb to
933b0c6
Compare
933b0c6 to
4da23ae
Compare
4da23ae to
b0a50e6
Compare
b0a50e6 to
ce2fc7a
Compare
ce2fc7a to
e7a89e4
Compare
There was a problem hiding this comment.
the requested aspect-ratio repair is in place for ordinary landscape and portrait images, and the nat64 and stale-tab-origin follow-ups are fixed. one privacy edge case still blocks approval. focused lint, desktop/web typechecks, diff check, and 139 targeted tests pass at this head.
5446623 to
1cd7cc9
Compare
There was a problem hiding this comment.
the trailing-dot privacy bypass is fixed at this head, including repeated dots and shorthand numeric hosts. one aspect-ratio edge case remains in the desktop rasterizer: exif-oriented jpeg favicons use stored jpeg dimensions for scaling, while createImageBitmap applies orientation metadata before the forced resize. this stretches rotated non-square images. the focused 143-test suite, typechecks, lint, diff check, and ci otherwise pass.
1cd7cc9 to
b6fe7b0
Compare
There was a problem hiding this comment.
the prior single-exif orientation and storage-shadow blockers are fixed, and the multi-sof rejection is in place. one valid multiple-exif case still breaks the display aspect-ratio guarantee. 147 focused tests, desktop/web typechecks, lint, diff check, and required ci pass.
b6fe7b0 to
75a7995
Compare
75a7995 to
6d1b3fd
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 6d1b3fd. Configure here.
6d1b3fd to
2f1903c
Compare
2f1903c to
143c2a3
Compare
There was a problem hiding this comment.
approved exact head 143c2a3ec0d45f99e049abee7da91aa609956ffd. all previously reported favicon privacy, image safety, aspect-ratio, tab race, and storage fallback blockers are resolved. the repeated invalid-first EXIF APP1 case now matches Electron/Chromium behavior. 177 focused tests across 11 suites, scoped desktop/web typechecks, focused lint, diff check, all required CI, and independent Electron/Chromium adversarial probes pass. the only red status is the unrelated, non-required Vercel marketing authorization check.
## What's Changed * fix(web): simplify the desktop-managed server update banner copy by @t3dotgg in pingdotgg/t3code#6549 * fix(web): show background policy tooltips sooner by @davidhu2000 in pingdotgg/t3code#6506 * feat(desktop): add favicons to the Browser panel by @chrisdeeming in pingdotgg/t3code#5644 * fix(preview): only show browser-ready local servers by @chrisdeeming in pingdotgg/t3code#6021 * perf(build): stop unpacking node_modules wholesale from the Windows asar by @tsouth89 in pingdotgg/t3code#5877 ## New Contributors * @davidhu2000 made their first contribution in pingdotgg/t3code#6506 **Full Changelog**: pingdotgg/t3code@v0.0.34-nightly.20260814.1089...v0.0.34-nightly.20260814.1090 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.34-nightly.20260814.1090
- ChatView: #5880 auto-settle-on-merge setting flows into effectiveSettled, #5644 browser favicon project registration effect, activeProjectRef memo, desktopByTabId on both RightPanelTabs mounts - server: provide ServerSecretStore to the McpSessionRegistry's ServerEnvironment layer (#6325 reads publish opt-in per descriptor) - mobile: 3-way merged main's deltas into the v2 thread screens (NewTaskDraftScreen keeps the branch title seed + main's environmentId, threadListV2 keeps both new test suites, queries imports deduped) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ChatView: #5880 auto-settle-on-merge setting flows into effectiveSettled, #5644 browser favicon project registration effect, activeProjectRef memo, desktopByTabId on both RightPanelTabs mounts - server: provide ServerSecretStore to the McpSessionRegistry's ServerEnvironment layer (#6325 reads publish opt-in per descriptor) - mobile: 3-way merged main's deltas into the v2 thread screens (NewTaskDraftScreen keeps the branch title seed + main's environmentId, threadListV2 keeps both new test suites, queries imports deduped) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ChatView: #5880 auto-settle-on-merge setting flows into effectiveSettled, #5644 browser favicon project registration effect, activeProjectRef memo, desktopByTabId on both RightPanelTabs mounts - server: provide ServerSecretStore to the McpSessionRegistry's ServerEnvironment layer (#6325 reads publish opt-in per descriptor) - mobile: 3-way merged main's deltas into the v2 thread screens (NewTaskDraftScreen keeps the branch title seed + main's environmentId, threadListV2 keeps both new test suites, queries imports deduped) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

What Changed
Capture favicons from desktop preview sessions and show them in recently used sites and browser tabs, with the existing fallback when no captured icon is available.
Why
External favicon lookups cannot resolve local or private sites. Capturing the favicon from the browser keeps those icons accurate and available across sessions.
UI Changes
Recently used sites and browser tabs now show captured site favicons. Screenshots show the state before #5270 (history tracking) was merged, the state before the favicons are displayed, and the state after this PR is merged.
Checklist
I included a video for animation/interaction changesPrepared with GPT-5.6 Codex in T3 Code.
Note
Medium Risk
New untrusted image fetch/decode paths in Electron and stricter hostname gating for external favicon URLs; behavior is heavily tested but touches preview navigation and webview attachment edge cases.
Overview
Adds end-to-end favicon capture for the desktop browser preview: Electron listens for
page-favicon-updated, fetches or decodes candidates throughFaviconCapture(size limits, format validation, timeouts, rasterization to bounded PNG), andPreviewManagerpublishes icons into tab state with navigation/webview lifecycle guards.The web app persists captured icons in a Zustand store keyed by project scope and origin (with environment-host aliases), mirrors live favicons through the preview bridge, and shows them in browser tabs, recent URLs, and local server cards via
FaviconImage(captured first, then public fallback).isPublicFaviconHostand expanded private-network checks block Google’s S2 favicon URL for local, special-purpose, and malformed hostnames so private sites are not leaked to a third party.Reviewed by Cursor Bugbot for commit 143c2a3. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add favicons to the Browser panel tab bar and empty state cards
WebContentsviapage-favicon-updated, fetches and normalizes the image, and publishes it into desktop preview tab state through FaviconCapture.ts and Manager.ts.isPublicFaviconHostto browserTargetResolver.ts with comprehensive IPv4/IPv6 and special-purpose range checks;faviconUrlForOriginnow returns null for private/local hosts.RightPanelTabsandPreviewEmptyStatenow require new props (desktopByTabId,threadRef) — callers that don't pass them will have type errors.Macroscope summarized 143c2a3.