Uh oh!
There was an error while loading. Please reload this page.
feat: color-code projects as an accessibility aid - #8772
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Warning Your free Security trial is over. An organization admin can activate Security or dismiss this notice. Comment |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
One finding on the new web palette module. Everything else — capability gating and RPC both resolved from member.environmentId, activeProject scoped to the thread's environment, ProjectColorDot placements inside MenuRadioItem's children wrapper, and the raw swatch buttons (exempt as swatches) — looks consistent with the existing patterns.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR introduces a persisted, cross-environment project-color capability with a new settings workflow and rendering across several production surfaces. Although it is opt-in and backward-compatible for uncolored projects, its cross-stack scope and multi-environment write behavior warrant human review. You can add or adjust custom eligibility rules. Learn more. |
Adds a per-project color, chosen from a theme-aware nine-swatch palette in the sidebar's project actions dialog, shown as a small dot wherever the project identifies itself: sidebar thread cards and compact rows, search results, tooltips, the project filter menu, the Sidebar V1 group header, and the chat header. The color is stored server-side on project metadata (migration 039, optional `color` on the project.meta.update command / meta-updated event / project shells) so it syncs across devices, mirroring the pinned-thread ordering precedent. A new `projectColor` capability flag hides the picker for servers that predate it. Grouped projects share one color across environments. Written by Claude Code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
898f7f3 to
120e81cCompareThere was a problem hiding this comment.
Reviewed the web UI changes for shared-component, Tailwind ownership, and capability/environment-routing consistency. Two findings in apps/web/src/components/settings/ProjectSettingsPanel.tsx; the swatch/dot components themselves look consistent with the existing patterns.
Posted via Macroscope — UI Consistency
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
- Group color now prefers the group representative's color over member order, so a remote member can't override a colored primary checkout (Macroscope, projectColors.ts). - The chat header resolves the color through the same project grouping as the sidebar, so a color set on another member of the logical project still marks the thread (Macroscope + Cursor, ChatView). - getCommandReadModel now maps projection_projects.color like the other read-model builders (Macroscope, ProjectionSnapshotQuery). - Palette CSS variables are literal var() strings owned by projectColors.ts instead of runtime-built names, so Tailwind v4's source scanner always emits them (Macroscope UI-consistency). - Added unit tests for the color precedence and CSS value mapping. Written by Claude Code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
IAmJSD
commented
Aug 30, 2026
Note This comment was written by Claude Code (Claude Fable 5), babysitting this PR from Astrid Gealer's session. Addressed the bot review feedback in f28c54d (after rebasing onto
🤖 Generated with Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f28c54d. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
…bing - The project settings Color row now renders only when a member's server advertises the projectColor capability, and the fan-out skips members on pre-color servers — matching the contract comment and user docs (Macroscope + Cursor). - setProjectColor gets the same in-flight guard as setFaviconPath, and the picker's disabled state is finally wired, so overlapping fan-outs can't leave a group with mixed colors (Macroscope). - getActiveProjectByWorkspaceRoot now copies row.color into the OrchestrationProject it builds (Macroscope + Cursor). Written by Claude Code. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
IAmJSD
commented
Aug 30, 2026
Note This comment was written by Claude Code (Claude Fable 5), babysitting this PR. Second round of bot feedback addressed in faf3e3f:
Validation: monorepo typecheck and lint clean; web suite 3013 passed; server projection/decider suites pass. The only failing server tests locally ( 🤖 Generated with Claude Code |

Note
This PR — code and description — was written by Claude Code (Claude Fable 5), working in Astrid Gealer's session at Infrawrench.
What
Adds the ability to color-code repos/projects as an accessibility feature, so they can be told apart at a glance. Pick a color from a nine-swatch palette (plus a "no color" option) in the sidebar's project actions dialog; it then shows as a small dot everywhere the project identifies itself:
How
Follows the precedent set by pinned-thread ordering (#5581) for server-synced per-entity state:
ProjectColorfield onOrchestrationProject(Shell),project.meta.update, andProjectMetaUpdatedPayload— optional/nullable everywhere so old servers and clients interop. NewprojectColorcapability flag so clients hide the picker instead of sending commands a pre-color server would reject.039_ProjectionProjectsColoradds acolorcolumn toprojection_projects; decider, in-memory projector, projection pipeline, and snapshot queries thread the field through.projectColors.ts(palette + group-color resolution) andProjectColor.tsx(ProjectColorDot,ProjectColorPicker). Colors are persisted as palette names and rendered via Tailwind color tokens, so dots stay legible in both light and dark themes. Dots arearia-hidden(the project name is always present as text); picker swatches carry labels andaria-pressedstate.Testing
Not included (possible follow-ups)
ProjectFaviconsites don't render dots yet).🤖 Generated with Claude Code
Note
Medium Risk
Touches orchestration commands, a DB migration on
projection_projects, and multi-environment fan-out in project settings; mitigated by optional wire fields and capability gating for version skew.Overview
Adds optional project colors end to end so repos can be distinguished by a small colored dot in the sidebar, chat header, and project settings.
Contracts & server: Introduces
ProjectColorand nullablecoloron project snapshots andproject.meta.update/project.meta-updated(omitted when unchanged). Migration044_ProjectionProjectsColoraddscolortoprojection_projects; the decider, projector, SQL projections, and snapshot queries persist and expose it. Servers advertise aprojectColorcapability so older peers are not sent unknown fields.Web: Palette helpers (
projectColors.ts) plusProjectColorDot/ProjectColorPicker. Settings fans color out to capability-aware group members; grouped logical projects share one resolved color across environments. Dots are decorative (aria-hidden); the picker is labeled for accessibility.Tests & docs: Decider/projector and DB round-trip coverage, plus user docs for setting colors.
Reviewed by Cursor Bugbot for commit faf3e3f. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Add end-to-end project color support as an accessibility aid
colorfield acrossOrchestrationProject,OrchestrationProjectShell,ProjectMetaUpdateCommand, andProjectMetaUpdatedPayloadin orchestration.ts, plus an optionalprojectColorcapability flag in environment.tscolorTEXT column toprojection_projectsin 044_ProjectionProjectsColor.ts; the projection pipeline, projector, and snapshot queries now persist and return colorprojectColor: truein ServerEnvironment.ts; the project settings UI in ProjectSettingsPanel.tsx only renders the newProjectColorPickerwhen at least one group member is color-capable, and fans out color updates only to capable membersProjectColorDotusing group-level color resolution via new utilities in projectColors.tsproject.meta-updatedevents now conditionally carrycolor(absent = unchanged, null = cleared);getSnapshot,getShellSnapshot, andgetActiveProjectByIdresponses now includecolor, which older clients may ignore under version skew. The capability flag gates the UI; servers not advertisingprojectColorwill not show the picker.Macroscope summarized faf3e3f.