feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp
, '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

feat(sidebar): group threads by environment - #9213

Closed
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping
Closed

feat(sidebar): group threads by environment#9213
roerohan wants to merge 2 commits into
pingdotgg:mainfrom
roerohan:feat/sidebar-environment-grouping

Conversation

@roerohan

@roerohanroerohan commented Sep 2, 2026

Copy link
Copy Markdown

Users connected to multiple computers could identify a thread's environment, but could not section the sidebar by where work runs.

Add a client-local environment grouping preference across web, desktop, and mobile. The default sidebar keeps its pinned, active, snoozed, and settled structure while adding environment headings; the project-tree sidebar nests projects under environment sections and scopes repository grouping within each environment.

Tests:

  • vp test run packages/contracts/src/settings.test.ts apps/web/src/environmentGrouping.test.ts apps/web/src/components/Sidebar.logic.test.ts apps/mobile/src/features/home/homeThreadList.test.ts apps/mobile/src/features/home/homeListItems.test.ts
  • vp run typecheck in apps/web, apps/mobile, and packages/contracts
  • Manually tested the feature frontend against an active T3 server

Model: GPT-5.6 Sol
Harness: OpenCode

Section headers look like this:

image

Enable in Settings / General:

image

Note

Medium Risk
Touches sidebar ordering, grouping keys, and pinned reorder semantics across web and mobile; incorrect scoping could mis-filter threads or merge projects across environments, but changes are gated behind an opt-in default-off setting.

Overview
Adds a client-local “group by environment” preference (sidebarEnvironmentGroupingEnabled on web, environmentGroupingEnabled on mobile) so multi-machine workspaces can section the sidebar by where work runs.

On web, the default sidebar inserts environment headings inside pinned, active, snoozed, and settled areas; pinned drag-reorder is limited to threads in the same environment, with helpers to keep optimistic pinned order in sync when toggling the mode. The legacy project-tree sidebar nests projects under environment sections via buildSidebarProjectGrouping, keeps repository grouping within each environment (no cross-environment merge), disables manual project sort while grouping is on, and routes project settings using logicalProjectKey.

On mobile (legacy grouped list only, when viewing all environments), scopes and thread groups are built per environment, the list gains environment-header rows, and project filters show title · environment labels. The toggle lives under Settings → Project Grouping.

Settings surfaces the control on web General settings (search + restore-defaults) and persist it in mobile preferences. Tests and user docs cover the new behavior.

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

Note

Group sidebar threads and projects by environment

  • Adds the sidebarEnvironmentGroupingEnabled client setting (default false) with toggle UI in web General settings and the mobile Project Grouping screen, plus settings-search support.
  • Web Sidebar and LegacySidebar render active, pinned, snoozed, and settled threads under environment headings when enabled; pinned drag-and-drop is scoped to the active thread's environment, and manual project sort is disabled in that mode.
  • Mobile HomeScreen and ThreadNavigationSidebar build environment-separated project scopes and thread groups, inserting environment-header list rows; grouping applies only when no specific environment filter is selected.
  • Replaces the separate sidebar snapshot and key-map builders with buildSidebarProjectGrouping, which partitions projects by environment and adds logicalProjectKey to each snapshot.
  • Behavioral Change: when grouping is enabled, matching projects from different environments become separate sidebar snapshots with environment-prefixed projectKeys and no manual sort; switching the setting clears pinned optimistic order. The selectPinnedReorderSection and shouldApplyOptimisticPinnedOrder helpers in Sidebar.logic.ts enforce the environment-mode match.

Macroscope summarized a181428.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Sep 2, 2026
Comment threadapps/web/src/components/Sidebar.tsx
Comment threadapps/mobile/src/features/home/HomeRouteScreen.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 629525f. Configure here.

Comment threadapps/web/src/components/LegacySidebar.tsx
@macroscopeapp

macroscopeappBot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This PR introduces an opt-in environment-grouping capability across web and mobile, changing sidebar layout, project identity keys, sorting, and pinned drag-and-drop behavior across multiple production paths. Its default-off setting preserves existing startup behavior, but the breadth of the new runtime logic and cross-platform interaction changes warrants human review.

You can add or adjust custom eligibility rules. Learn more.

@macroscopeappmacroscopeappBot 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.

Environment grouping is threaded consistently through the settings surface and both web sidebars, but the legacy sidebar's env-scoped projectKey leaks into a cross-surface route contract, which breaks the "Project settings" entry point while the toggle is on. Remaining comments are scoped to accessible naming, section ordering parity between the two sidebars, and the repeated heading treatment.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
Comment threadapps/web/src/sidebarProjectGrouping.ts
Comment threadapps/web/src/components/LegacySidebar.tsx Outdated
@shivamhwp

Copy link
Copy Markdown
Collaborator

Note: GPT-5.6 Sol on behalf of shivam (@shivamhwp).

Thanks for putting this together. The PR itself is well done, but we are going to close it in favor of #8530.

Environment grouping moves navigation toward the older project-tree style. With many threads, it adds more sections without reducing the list, so users still have to scroll through everything. #8530 addresses the same need with an environment filter in the current sidebar, letting users narrow the list to the environments they want.

We appreciate the work and thought that went into this.

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

@roerohan@shivamhwp