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

@colonelpanic8 colonelpanic8 commented Jul 23, 2026

Copy link
Copy Markdown

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

coderabbitai Bot 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-actions github-actions Bot 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 thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/server/src/assets/AssetAccess.ts
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/web/src/components/ProjectFavicon.tsx Outdated
@macroscopeapp

macroscopeapp Bot 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-actions github-actions Bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jul 23, 2026
Comment thread apps/web/src/components/ProjectFavicon.tsx Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx Outdated
Comment thread apps/web/src/components/ProjectFavicon.tsx Outdated
Comment thread apps/server/src/assets/AssetAccess.ts
Comment thread apps/server/src/assets/AssetAccess.ts
Comment thread apps/web/src/components/ProjectFavicon.tsx
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/web/src/components/ProjectFavicon.tsx Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/server/src/assets/AssetAccess.ts Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/web/src/components/ProjectIconSettings.tsx Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx Outdated
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/web/src/components/ProjectIconSettings.tsx
Comment thread apps/web/src/components/SidebarV2.tsx

@cursor cursor Bot 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 thread apps/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

t3dotgg commented Aug 23, 2026

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.

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

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants