Uh oh!
There was an error while loading. Please reload this page.
feat(web): add customizable project icons - #9137
Conversation
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This change introduces a new persisted project-icon customization workflow spanning settings, orchestration, database projections, and multiple UI surfaces. It also replaces the existing generic fallback with name-derived emoji defaults, changing product behavior for existing projects without explicit icons. You can add or adjust custom eligibility rules. Learn more. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
0a0630f to
7e6ca41CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
41e860f to
958bf27Compare958bf27 to
2bbdfa7CompareThere 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 9eb703e. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
## What's Changed * chore(ci): only run check-run agents on vouched contributors by @juliusmarminge in pingdotgg/t3code#9298 * fix(web): stop remounting markdown on every activity delta by @juliusmarminge in pingdotgg/t3code#9306 * fix(pull-requests): keep cached PR chrome on reopen by @maria-rcks in pingdotgg/t3code#9294 * feat(environments): draw each environment as the machine it runs on by @juliusmarminge in pingdotgg/t3code#9299 * feat(web): apply and remove labels from the pull request tab by @juliusmarminge in pingdotgg/t3code#9313 * fix(sidebar): collapse settled and snoozed shelves by default by @maria-rcks in pingdotgg/t3code#9314 * refactor(media): unify file and media previews across clients by @juliusmarminge in pingdotgg/t3code#9253 * fix(chat): keep live tool labels in present tense by @maria-rcks in pingdotgg/t3code#9316 * chore: audit lint directives and move plugin allowlists into config by @juliusmarminge in pingdotgg/t3code#9300 * chore(ci): narrow the Effect conventions check-run agent by @juliusmarminge in pingdotgg/t3code#9321 * refactor(mobile): style plain views with Uniwind classes instead of the theme bridge by @juliusmarminge in pingdotgg/t3code#9322 * fix(dev): share dev servers on the loopback Vite actually binds by @juliusmarminge in pingdotgg/t3code#9324 * fix(web): line up the titlebar wordmark label and version pill by @tristanmanchester in pingdotgg/t3code#9255 * fix(web): make the diff layout toggle a persisted setting by @juliusmarminge in pingdotgg/t3code#9326 * chore: dedupe lightningcss and tailwind node bindings by @juliusmarminge in pingdotgg/t3code#9331 * chore: upgrade vite-plus to 0.3.0 by @juliusmarminge in pingdotgg/t3code#9327 * feat(web): add a file tree to the diff panel and pull request code tab by @juliusmarminge in pingdotgg/t3code#9330 * feat(web): add PageUp/PageDown chat navigation by @Yash-Singh1 in pingdotgg/t3code#9315 * fix(web): collapse PR header actions to icons when narrow by @maria-rcks in pingdotgg/t3code#9334 * fix(web): resolve Vite sourcemap and supports warnings by @juliusmarminge in pingdotgg/t3code#9343 * feat(web): choose whether links open in the default browser or in T3 Code by @juliusmarminge in pingdotgg/t3code#9339 * fix(web): add press feedback to buttons by @maria-rcks in pingdotgg/t3code#9349 * feat(web): add customizable project icons by @saphid in pingdotgg/t3code#9137 * fix(mobile): stop indented code overflowing Android chat bubbles by @Adamulek123 in pingdotgg/t3code#9347 * fix(web): let the pull request list use wide screens by @juliusmarminge in pingdotgg/t3code#9351 * feat: display native app and browser icons in work logs by @Yash-Singh1 in pingdotgg/t3code#9093 ## New Contributors * @tristanmanchester made their first contribution in pingdotgg/t3code#9255 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1262...v0.0.39-nightly.20260903.1265 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1265
…cts list page Upstream's customizable project icons feature (pingdotgg#9137) made these props required after this page was built against the older ProjectFavicon signature.

What Changed
Projects without a custom or discovered favicon get an emoji chosen from their displayed name. A 5.2 KB local token classifier handles recognizable names such as
customer-api,developer-docs, andios-client; unknown names use a stable hash across generic choices. Existing projects receive an automatic emoji as soon as they load in the new client.Project Settings opens on Emoji for automatic projects, with Emoji first in the picker. Users can pick a curated emoji, paste any emoji, search the full Lucide set, choose from 18 icon colors, use a project image, or reset to automatic selection. Saved Lucide choices still reopen on Icons. The choice is stored in the project projection and sent through the existing orchestration contract, so it remains consistent across web and Electron sessions and connected clients. The full Lucide manifest is lazy-loaded only when the picker or a saved Lucide override needs it.
Why
Projects without an image currently collapse to the same gray folder icon, which makes project lists harder to scan. Automatic local selection improves every new and existing project without a model download or network call, while Project Settings gives users direct control when the suggested icon is not right.
There is no open upstream issue for this feature, and Ideas discussions are unavailable, so this PR carries the motivation.
Verification
PullRequestListFilters.tsx.UI Changes
Before, projects without images all use the folder fallback:
After, the local classifier chooses an emoji from each project name:
The cropped picker opens on Emoji by default, with Emoji first:
Icons remain the second choice, with Lucide search and colors:
The picker draft before and after a live project snapshot:
Checklist
Implementation used GPT-5.6 Sol in T3 Code. Icon-set and tiny-model research used GPT-5.6 Luna.
Note
Medium Risk
Touches orchestration projections and a DB migration, and
ProjectFaviconnow requiresprojectName—a breaking prop change for any out-of-tree callers.Overview
Adds persisted project icon overrides (Lucide icon + color, or emoji) end-to-end: contract/command/event schemas, nullable
project_icon_jsononprojection_projects(migration 047), and projection/decider/snapshot wiring alongside existingfaviconPath.ProjectFaviconnow takesprojectNameand optionalprojectIcon, rendering saved overrides before uploaded favicons, with name-based automatic emoji (and Lucide fallbacks) when no image is available. Project settings gainsProjectIconPickerDialog(emoji first, searchable Lucide + colors) plus Choose file; picking an icon clears the favicon path and vice versa, with reset back to automatic.The override is threaded through sidebar, chat header, command palette, PR filters, and related UI. User docs for project appearance are updated.
Reviewed by Cursor Bugbot for commit fc71edc. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add customizable project icons with picker and automatic fallback
ProjectIconPickerDialogto select emojis or searchable Lucide icons with colors, integrated intoProjectSettingsPanel. Saving an icon clears the existing favicon, and vice versa.selectProjectIconin projectIconModel.ts to provide deterministic automatic fallback icons based on project name keywords when no custom icon or favicon is present.ProjectIconOverride, addingproject_icon_jsontoprojection_projectsvia migration 047.ProjectFaviconnow prioritizes saved emoji or Lucide overrides over uploaded favicon assets, and otherwise selects a deterministic project-name/path fallback instead of a generic icon.Macroscope summarized fc71edc.