feat(web): project icons can be chosen manually - #5775
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 |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
ApprovabilityVerdict: Needs human review New feature adding manual project icon selection, including a database migration, new UI dialog/workflow, orchestration event changes, and asset resolution modifications. The scope and schema impact warrant human review. You can customize Macroscope's approvability policy. Learn more. |
5237c45 to
c96de5d
Compare
74c7686 to
a224a27
Compare
0dda3a9 to
3b7d26e
Compare
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 3b7d26e. Configure here.
## What's Changed * feat(web): project icons can be chosen manually by @t3dotgg in pingdotgg/t3code#5775 * fix(server): one greedy agent process no longer takes down the whole server by @t3dotgg in pingdotgg/t3code#5788 **Full Changelog**: pingdotgg/t3code@v0.0.33-nightly.20260809.1040...v0.0.33-nightly.20260809.1041 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.33-nightly.20260809.1041
## What's Changed * fix(mobile): reconnects no longer shift the thread list by @t3dotgg in pingdotgg/t3code#5372 * feat(web): drag pinned threads into your own order by @t3dotgg in pingdotgg/t3code#5581 * chore(ci): vouch StiensWout by @t3-code[bot] in pingdotgg/t3code#5637 * feat(desktop): remember recently used sites in the Browser panel by @chrisdeeming in pingdotgg/t3code#5270 * chore: vouch chrisdeeming by @t3-code[bot] in pingdotgg/t3code#5641 * feat(web): make sidebar artwork theme-aware by @maria-rcks in pingdotgg/t3code#5636 * fix(web): reconnect the composer seam for remote non-Git projects by @caezium in pingdotgg/t3code#5633 * fix(web): show Stop button while input is pending by @ipanasenko in pingdotgg/t3code#5554 * feat(web): fold plan mode and token-by-token output into Legacy features by @t3dotgg in pingdotgg/t3code#5664 * feat: sidebar v2 is now the default sidebar by @t3dotgg in pingdotgg/t3code#5672 * fix(server): stop PR status lookups amplifying GitHub rate limits by @t3dotgg in pingdotgg/t3code#5673 * fix(web): delay transient reconnect warnings by @t3-code[bot] in pingdotgg/t3code#5670 * fix(web): inherit terminal size in simple typography by @chrisdeeming in pingdotgg/t3code#5628 * fix(server): stop the reaper from silently killing live background subagents by @t3dotgg in pingdotgg/t3code#5677 * fix(desktop): zoom shortcuts no longer die when the preview browser has focus by @t3dotgg in pingdotgg/t3code#5691 * feat(mobile): one sheet for model and thread settings by @t3dotgg in pingdotgg/t3code#5625 * feat(usage): usage page reading provider transcripts across environments by @t3dotgg in pingdotgg/t3code#5684 * fix(web): usage chart no longer makes Claude look like the bigger spender by @t3dotgg in pingdotgg/t3code#5697 * fix(web): persist diff view mode by @leorivastech in pingdotgg/t3code#5731 * feat(web): show how many subagents are running at a glance by @t3dotgg in pingdotgg/t3code#5745 * fix(web): add missing cursor-pointer styling to dropdowns and interactive buttons by @naMqe-h in pingdotgg/t3code#5716 * fix(server): stop Claude resume handshakes from completing turns that never ran by @gfsaaser24 in pingdotgg/t3code#5710 * chore: vouch gfsaaser24 by @t3dotgg in pingdotgg/t3code#5761 * chore: vouch saphid by @t3dotgg in pingdotgg/t3code#5763 * fix(server): stop Codex threads with queued follow-ups by @t3dotgg in pingdotgg/t3code#5762 * fix(web): usage page loses the cost quality panel, gains a back button by @t3dotgg in pingdotgg/t3code#5756 * feat(server): agents can now open the images you paste into chat by @t3dotgg in pingdotgg/t3code#5757 * fix(web): pinned reorder no longer reshuffles while writes land by @t3dotgg in pingdotgg/t3code#5767 * feat(web): overhaul project settings into a real settings page by @t3dotgg in pingdotgg/t3code#5768 * fix(web): usage totals no longer jump while devices report in by @t3dotgg in pingdotgg/t3code#5772 * fix(server): settle no longer leaves monitors and dev servers running by @t3dotgg in pingdotgg/t3code#5774 * feat: pick worktree or current checkout per project by @t3dotgg in pingdotgg/t3code#5766 * fix(web): sidebar rows show the branch again, not a truncated plan step by @t3dotgg in pingdotgg/t3code#5776 * feat(server): vp run migrate-dev-db seeds worktree dev dbs with real data by @t3dotgg in pingdotgg/t3code#5773 * feat(web): keep unsent drafts one click away in the sidebar by @t3dotgg in pingdotgg/t3code#5777 * feat(web): project icons can be chosen manually by @t3dotgg in pingdotgg/t3code#5775 * fix(server): one greedy agent process no longer takes down the whole server by @t3dotgg in pingdotgg/t3code#5788 * ci: label-gated hosted-web preview deploys by @t3dotgg in pingdotgg/t3code#5465 * Add cross-platform mobile usage dashboard by @juliusmarminge in pingdotgg/t3code#5743 * fix(web): preserve desktop route during Clerk auth by @wobsoriano in pingdotgg/t3code#5770 * fix(web): match create theme and import theme buttons to the standard outline style by @UtkarshUsername in pingdotgg/t3code#5860 * fix(server): favicon resolution no longer pins the event loop by @murenovich in pingdotgg/t3code#5538 * fix(shared): bound the file-link label so bracket runs stop rescanning by @tsouth89 in pingdotgg/t3code#5782 * fix(web): thread title button no longer eats the drag area by @nathangerday in pingdotgg/t3code#5857 * fix(web): unify usage page chrome by @t3-code[bot] in pingdotgg/t3code#5823 * fix(shell): add ~/.local/bin to the Windows CLI resolver so native-installed providers are found by @arhxam in pingdotgg/t3code#5074 * fix(web): match settings search shortcut styling to command palette's by @UtkarshUsername in pingdotgg/t3code#5841 * fix(mobile): long-pressing a thread row no longer navigates into the thread by @juliusmarminge in pingdotgg/t3code#5901 * fix(server): usage no longer double-counts forked Codex sessions by @t3dotgg in pingdotgg/t3code#5887 * fix(server): sandbox user-provided SVGs by @t3dotgg in pingdotgg/t3code#5916 * fix(web): match usage titlebar text styling by @t3-code[bot] in pingdotgg/t3code#5897 * Move project settings to contextual project routes by @juliusmarminge in pingdotgg/t3code#5923 * Retain thread sidebar data when navigating to /settings so back navigation is instant by @juliusmarminge in pingdotgg/t3code#5930 * Automate production mobile EAS releases by @juliusmarminge in pingdotgg/t3code#5609 * Add settings and usage breadcrumbs by @juliusmarminge in pingdotgg/t3code#5929 * fix(web): correct model picker trigger padding by @Chrono-byte in pingdotgg/t3code#5935 * fix(web): show worktree icon in sidebar v2 by @tris203 in pingdotgg/t3code#5909 * fix(web): enable restore defaults after theme mix changes by @Lucenx9 in pingdotgg/t3code#5928 * fix(web): trait menu closes after you pick a level by @t3dotgg in pingdotgg/t3code#5879 * fix(web): align project name with headline by @carterwsmith in pingdotgg/t3code#5864 * fix(web): update pills use readable theme foregrounds by @chrisdeeming in pingdotgg/t3code#5938 * fix(web): use themed confirmation dialogs by @StiensWout in pingdotgg/t3code#5624 * fix(web): use import/export-appropriate icons for theme buttons by @UtkarshUsername in pingdotgg/t3code#5964 * fix(mobile): detect PowerShell cmdlet errors in work log rows by @myacoub91 in pingdotgg/t3code#5726 * fix(mobile): stop Android user bubbles with code blocks from overlapping by @Brechard in pingdotgg/t3code#5659 * fix(mobile): parse EAS fingerprint JSON by @juliusmarminge in pingdotgg/t3code#5991 ## New Contributors * @chrisdeeming made their first contribution in pingdotgg/t3code#5270 * @wobsoriano made their first contribution in pingdotgg/t3code#5770 * @murenovich made their first contribution in pingdotgg/t3code#5538 * @tsouth89 made their first contribution in pingdotgg/t3code#5782 * @nathangerday made their first contribution in pingdotgg/t3code#5857 * @carterwsmith made their first contribution in pingdotgg/t3code#5864 * @myacoub91 made their first contribution in pingdotgg/t3code#5726 **Full Changelog**: pingdotgg/t3code@v0.0.32...v0.0.33 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.33
… cases The v0.0.33 sync landed five new assertions in this file, from pingdotgg#5538 and pingdotgg#5775, and all five fail on Windows. They compare resolvePath's output against a forward-slash literal, and resolvePath returns a native absolute path, so on this machine the two strings name the same file and disagree on spelling. This is the exact assumption 2effde5 removed from the assertions that existed at the time, and it left withPosixSeparators in the file for the purpose. The new assertions simply predate nothing and were written on a POSIX machine. They now go through the same helper, which is every remaining unwrapped call, so the file no longer has two conventions in it. Nineteen of nineteen pass. Nothing about the resolver changed: backslashes are correct in its output, because its consumer feeds the result to path.relative. Worth sending upstream. The suite is red on Windows without it, and the fix costs upstream nothing on the platforms where it already passes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Projects currently rely on automatic icon detection with no way to correct the result. This adds an explicit project icon setting while keeping automatic detection as the default.
The new Appearance section shows the detected icon and path. Users can select a supported image from the project, or switch back to automatic detection. T3 Code stores the override with project metadata so web, desktop, mobile, and remote clients use the same icon.
Visual reference: Option C settings mock
Tests:
vp test run apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/orchestration/decider.projectScripts.test.ts apps/server/src/orchestration/Layers/ProjectionPipeline.test.ts apps/server/src/persistence/Migrations/039_ProjectionProjectFaviconPath.test.ts packages/client-runtime/src/state/assets.test.ts apps/web/src/components/ProjectFavicon.test.tsxBuilt by GPT-5.6 in T3 Code through the Codex harness.
Note
Medium Risk
Touches orchestration persistence, asset URL signing, and cross-client projection; mitigated by schema validation, server-authoritative paths, and broad tests.
Overview
Adds manual project icon selection while keeping automatic detection as the default. Users can pick a workspace image from project settings or reset to automatic; the choice syncs across web, mobile, and remote clients.
Persistence & pipeline:
faviconPathflows throughproject.meta.update, events, projector, and SQLite (favicon_pathvia migration 040). Contracts validate paths as supported image extensions only.Server resolution:
ProjectFaviconResolverprefers the saved override when the file exists, then falls back tot3.jsonand well-known paths. Asset URL issuance loads the authoritative path from the project projection (clientpathon the resource is a cache hint only), returns optionalsourcePath, and rejects non-image files.UI: New Appearance section and
ProjectFaviconPickerDialoguse workspace search with animageOnlyfilter.ProjectFaviconand thread/sidebar/header surfaces passfaviconPaththrough.Docs link to Customize a project icon in
project-settings.md.Reviewed by Cursor Bugbot for commit ae1e94e. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add manual project icon selection in project settings
ProjectFaviconPickerDialogthat searches project files filtered to image types, letting users select a custom icon for a project from the settings panel.faviconPaththrough the event/projection pipeline: newfaviconPathfield onOrchestrationProject,ProjectMetaUpdateCommand, and related payloads, backed by a newfavicon_pathcolumn added via migration 040.ProjectFaviconResolver.resolvePathnow checks the savedfaviconPathfirst (when the file exists in the workspace) before falling back tot3.jsonand well-known icon candidates.AssetAccess.issueAssetUrlaccepts an explicitprojectFaviconPathoverride, validates resolved paths against allowed image extensions, and returns asourcePathin the result.faviconPathis threaded through all UI surfaces that render project icons: sidebar rows, thread list headers, chat header, command palette, archived threads, and mobile screens.Macroscope summarized ae1e94e.