Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add user-local project icons - #4401

Closed
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons
Closed

Add user-local project icons#4401
colonelpanic8 wants to merge 10 commits into
pingdotgg:mainfrom
colonelpanic8:feat/project-icons

Conversation

@colonelpanic8

@colonelpanic8colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

What Changed

  • Added user-local projectIcons and projectIconsByGitRemote maps to the server settings.json, keyed by workspace root or normalized repository identity.
  • Workspace-specific icons override git-remote icons; missing overrides fall through to repository metadata and automatic discovery.
  • Custom icon paths may be absolute, home-relative (~/…), or project-relative. They override t3.json and automatic favicon discovery without changing the repository.
  • Added exact signed-asset capabilities for configured icons outside the workspace, while retaining compatibility with existing favicon URLs.
  • Added project-icon controls to the classic project context menu and Sidebar v2 project settings.
  • Added a direct Sidebar v2 interaction: right-click the project icon on a thread and choose Set/Change project icon….

Why

Project icons are currently discovered from files committed to each repository. Personal project organization should not require adding app-specific assets or metadata to the project itself. Git-remote keys also make a dotfile-backed setting portable across devices and clone paths while retaining exact-path overrides for worktrees or exceptional clones.

UI Changes

Before — automatic folder icon:

Automatic project icon

After — right-clicking the Sidebar v2 thread icon exposes the action:

Project icon context menu

After — the dialog shows the configured external icon and the persistent settings file:

Project icon dialog

After — a second clone at a different path inherits the normalized git-remote icon:

Portable git-remote project icon

Checklist

  • vp check
  • vp run typecheck
  • vp test run packages/contracts/src/settings.test.ts packages/shared/src/serverSettings.test.ts apps/server/src/project/ProjectFaviconResolver.test.ts apps/server/src/assets/AssetAccess.test.ts apps/server/src/serverSettings.test.ts apps/web/src/components/ProjectIconSettings.test.ts
  • Verified classic-sidebar project context menu in an isolated development environment.
  • Verified Sidebar v2 thread-icon right-click, persistence to settings.json, and a signed SVG asset outside the repository.
  • Verified one github.com/pingdotgg/t3code icon setting renders for two clones at different local paths.

Note

Add user-local project icons configurable from the sidebar and project settings

  • Adds a context menu on project icons in the sidebar (both v1 and v2) to open a ProjectIconDialog for setting a custom icon path per workspace or per git remote.
  • Extends ProjectFaviconResolver to accept customIconPaths (absolute, ~-relative, or workspace-relative) and return a source discriminator (custom-setting vs workspace).
  • Extends AssetAccess.issueAssetUrl to read projectIcons/projectIconsByGitRemote from ServerSettings and RepositoryIdentityResolver to resolve git-remote-scoped icons; issues v2 project-icon claims with an absolute path.
  • Adds projectIcons and projectIconsByGitRemote maps to ServerSettings and ServerSettingsPatch, with atomic update support via projectIconUpdate.
  • ProjectFavicon now computes a deterministic configuredIconRevision hash from current icon settings and passes it to asset URL requests for cache-busting.
  • Risk: resolveAsset for v2 tokens re-canonicalizes the signed absolute path at resolution time and returns null if the file has been replaced by a symlink or moved.

Macroscope summarized 6f052c8.


Note

Medium Risk
Touches signed asset serving and path canonicalization for files outside the workspace; misconfiguration or symlink races are mitigated by tests but remain security-sensitive surface area.

Overview
Adds user-local project icons stored in server settings.json, without changing the repository. Users can set a custom icon path per workspace root or per normalized git remote so the same icon follows clones on other machines and paths.

Server & contracts: New projectIcons and projectIconsByGitRemote maps plus atomic projectIconUpdate patches. ProjectFaviconResolver gains customIconPaths (absolute, ~/…, or project-relative) and returns whether the icon came from a custom setting vs workspace discovery. AssetAccess reads those settings and repository identity, issues v2 project-icon signed tokens with a canonical absolute path for configured icons outside the repo, and still enforces workspace containment for auto-discovered icons (including rejecting post-sign symlink swaps).

Web UI:ProjectIconDialog / inline path field in Sidebar v2 project settings; classic sidebar context menu Project icon…; Sidebar v2 right-click on the thread favicon to set/change. ProjectFavicon passes a bounded settings revision on asset requests for cache-busting when icon maps or repository identity change.

Reviewed by Cursor Bugbot for commit 6f052c8. Bugbot is set up for automated code reviews on this repo. Configure here.

Current combined-stack UI evidence (2026-07-24)

Captured from PR head 804efc44c5a8321667f51400b3c513af593cde82 on upstream main ece05087a70e94efcd57441337fa1249559362ba, using combined integration 4dd4cef40 and package /nix/store/pf7fjqw8ykkdgayf3ywsbgxxp6wi1m42-t3code-0.0.29-patched-main-20260724.

The settings capture shows an external SVG stored by normalized remote identity for every clone; the second capture shows the resulting custom tree icon in Sidebar V2 and the draft header. All names, remotes, paths, and assets are disposable seed data.

Portable custom project icon setting

Custom project icon rendered in Sidebar V2

@coderabbitai

coderabbitaiBot commented Jul 23, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9405d9be-d561-4ece-a1d6-d75878691330

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeappBot commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR introduces a complete new feature (user-local project icons) with new UI components, settings schema, server-side resolution logic, and context menu integrations. The ~1500 lines of new functionality introducing new user-facing workflows warrants human review.

You can customize Macroscope's approvability policy. Learn more.

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/server/src/assets/AssetAccess.ts
Comment threadapps/web/src/components/ProjectFavicon.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectFavicon.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/server/src/assets/AssetAccess.ts Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx Outdated
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/ProjectIconSettings.tsx
Comment threadapps/web/src/components/SidebarV2.tsx

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5c2c09c. Configure here.

Comment threadapps/web/src/components/ProjectFavicon.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 25, 2026
Manifests and locks updated to the current stack (pingdotgg#4505 subsumed, pingdotgg#4401 resolved
at source). BUILDING.md gains a pre-build syntax gate: esbuild parses TSX in
seconds with an exact location, where a nix build takes minutes and Babel
surfaces only the first parse error per file.
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 26, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 27, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
#	packages/contracts/src/settings.test.ts
#	packages/shared/src/serverSettings.ts
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
colonelpanic8 added a commit to colonelpanic8/t3code that referenced this pull request Jul 28, 2026
# Conflicts:
#	apps/server/src/assets/AssetAccess.test.ts
#	apps/web/src/components/CommandPalette.tsx
#	apps/web/src/components/ProjectFavicon.tsx
#	apps/web/src/components/Sidebar.logic.test.ts
#	apps/web/src/components/SidebarV2.tsx
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. Custom and external project icons already shipped in #5775 and #7823.

@t3dotggt3dotgg closed this Aug 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@colonelpanic8@t3dotgg