Skip to content

feat(today): adopt desktop's chrome in the today layout - #110696

Open
adamleithp wants to merge 6 commits into
masterfrom
today-chrome
Open

adamleithp wants to merge 6 commits into
masterfrom
today-chrome

Conversation

@adamleithp

Copy link
Copy Markdown
Contributor

Problem

  • With today-rail-nav on, the web shell doesn't look like PostHog Desktop.
    • The rail, sidebar and content have no seams between them.
    • Rail icons have no labels.
    • Panes have no title or search.
    • Scene titles are styled differently from the sidebar.
  • The sidebar lists can't be used from the keyboard, and nothing shows what was opened recently.

Changes

Spaces pane and an AI task Tools page New view page
pr-spacestask pr-toolspage pr-newview
  • Chrome:
    • The rail, sidebar pane and content now sit side by side, split by quill --border seams.
    • The rail and pane use quill's --chrome background.
    • The content area loses its rounded corner.
  • Rail:
    • Each item is now a labelled tile, and the logo is the colour logomark.
    • Each item opens its pane and its section: Home goes to the homepage, Spaces to a new chat, Views to New view, Library to All objects, and Tools to All tools.
  • Title bars:
    • Sidebar panes and scene titles share QuillSceneHeader, a fixed 48px bar, so their bottom borders line up.
    • Under the flag, SceneTitleSection renders QuillSceneTitleSection. Its name tints on hover and turns into a field of the same size on click.
    • The quill and Lemon names share one edit hook, useSceneNameEditing. It covers debounce, save-on-blur, always-editing for new objects and generated names.
    • The AI task header uses the same pieces, and QuillTaskTitle is gone.
  • Pane lists:
    • Spaces, Views, Library and Tools each get a quill autocomplete search and list.
    • Arrow keys move the highlight, Enter opens the row, and Escape clears the search.
    • Each row registers itself in render order, so there's no second list of rows to keep in step.
    • Filtering moved into the pane logics.
  • Recently viewed (up to 5):
    • Views reads the project's recently viewed objects.
    • Tools and Spaces get a per-browser record, kept persisted in todayRecentsLogic.
    • Library shows none.
  • Session icon: one TodaySessionIcon (a status dot, or a chat bubble for chats) for sidebar rows, the space feed and the AI task header.
  • New pages: /views/new lets you pick canvas, notebook or dashboard. /tools lists every tool by category.
  • Removed:
    • The Spaces pane's "New chat" button and the Views pane's "New…" menu. The rail and the New view page cover them.
    • The per-section search toggles in Spaces and Views.
  • Mechanical (no visible change with the flag off):
    • SceneDescription, SceneTitlePanelButton and sceneResourceIcon moved out of SceneTitleSection.tsx, which drops from 860 to about 360 lines.
    • The tools list moved from layout/today to scenes/tools/.
    • TodaySidebarFooter moved from SCSS to Tailwind.
    • Some unused layout/today components and logic state were deleted.

Note

The /views/new and /tools routes are registered for everyone. With the flag off, nothing links to them.

How did you test this code?

  • Typecheck shows no errors in the changed files.
  • Ran Jest on layout/today, layout/scenes/components, products/tasks/frontend/spaces and products/posthog_ai/frontend/scenes/TaskTracker.
  • Drove the local app in a headless browser with the flag on:
    • Rail navigation to each section.
    • Arrow keys, typing and Enter in the Tools and Spaces lists.
    • Header borders aligned at 48px.
    • The New view and Tools pages.
    • Hover then click to rename a dashboard title.
  • Not checked:
    • Dark mode.
    • Storybook visual snapshots. The Today stories that click the rail now land on the new pages, so snapshots will change.

Test rationale:

  • todayShellLogic.test.ts gains one case per rail item, asserting the page it opens. That catches a pane that stops navigating, or goes to the wrong section.
  • todaySessionIcon.test.ts is deleted along with the module it tested.
  • The autocomplete keyboard path is Base UI behaviour, so it was checked in the browser, not in Jest.

👉 Stay up-to-date with PostHog coding conventions for a smoother review.

Release status

  • No feature flag controls this change
  • This change is behind a feature flag and is not available to users
  • This change makes a previously flagged feature available to everyone

Automatic notifications

  • Publish to changelog?

Docs update

None. This is internal UI behind today-rail-nav.

🤖 Agent context

Autonomy: Human-driven (agent-assisted)

Agent: Claude Code, Claude Opus 5.5 (1M context)

  • Built in one session that iterated on screenshots against the running app. The design follows PostHog Desktop's chrome, loosened slightly: the rail is 60px and the title bars are 48px.
  • Skills: /writing-ui-components, /writing-code-comments, /writing-tests, /writing-pr-descriptions, /reviewing-with-coderabbit. A strict maintainability review ran before opening. It removed the parallel option lists, the dual-mode Spaces row, filtering in components, and the duplicate header component.
  • CodeRabbit CLI: skipped. The CLI was signed out, and the requester chose to skip setup.
  • Duplicate check: an open-PR search for today rail and chrome work found nothing related.
  • The work started on top of fix(posthog-ai): match desktop grouping and row chrome in the quill chat #109806 and was rebased onto master after it merged. The loading-height fix from fix(tasks): stabilize loading layout when switching tasks #110503 is carried into QuillSceneName.

🤖 Generated with Claude Code

@adamleithp adamleithp self-assigned this Oct 2, 2026
@trunk-io

trunk-io Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

✨ Submitted to Merge by @adamleithp. It will be added to the merge queue once all branch protection rules pass. See more details here.

@parameterai

parameterai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Risk: No findings

The delta since the last review only registers the existing AIO observability scorer-detail scene (Scene.AIObservabilityScorer mapped to the LlmAnalytics resource type, mirroring the scorers-list scene) and adds the matching /ai-evals/evaluations/scorers/{scorerId} template to the MCP generate-app-url manifest. Both are wiring-only: the scene mapping enables the existing access-denied gate in sceneLogic, and the MCP tool validates templates and URL-encodes all params, so no new security surface is opened.

Sentinel reviewed b6da1b0 · Review settings

@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

🤖 CI report

✅ Trunk lane — non-backend lane

This PR is assigned to the non-backend lane. It does not run backend Python tests and may merge in parallel with PRs in other lanes.

⚠️ Complexity (TypeScript) — 17 functions above the limit (max 35)

Cyclomatic complexity above the limit in changed typescript files (10 for production files, 15 for test files). Warn only: worth simplifying when you next touch these functions.

Function Location Complexity Limit
QueryWindow frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx:74 35 10
LemonSceneTitleSection frontend/src/layout/scenes/components/SceneTitleSection.tsx:145 28 10
Navigation frontend/src/layout/navigation-3000/Navigation.tsx:32 25 10
QuillSceneTitleSection frontend/src/layout/scenes/components/QuillSceneTitleSection.tsx:23 22 10
SceneDescription frontend/src/layout/scenes/components/SceneDescription.tsx:27 21 10
SceneName frontend/src/layout/scenes/components/SceneTitleSection.tsx:357 20 10
TaskRunSceneShell products/posthog_ai/frontend/scenes/TaskTracker/components/TaskRunSceneShell.tsx:63 20 10
TodaySpacesRow frontend/src/layout/today/TodaySpacesRow.tsx:35 19 10
sqlEditor frontend/src/scenes/urls.ts:74 17 10
TodaySpacesSidebar frontend/src/layout/today/TodaySpacesSidebar.tsx:35 16 10
TodayViewsSidebar frontend/src/layout/today/TodayViewsSidebar.tsx:24 16 10
sessionItem frontend/src/layout/today/todayWorkItems.ts:133 15 10
railPaneForPath frontend/src/layout/today/todayShellLogic.ts:45 13 10
sessionBadges frontend/src/layout/today/todayWorkItems.ts:177 13 10
QuillSceneName frontend/src/layout/scenes/components/QuillSceneName.tsx:26 12 10
blur frontend/src/layout/scenes/components/useSceneNameEditing.ts:103 12 10
TodaySessionRow frontend/src/layout/today/TodaySessionRow.tsx:36 11 10
✅ Duplication (Python) — clean

New Python code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

⚠️ Duplication (TypeScript) — 1 new duplicated block (worst 92 tokens)

New TypeScript code duplication introduced by this branch. Fails at 70+ tokens in app code, or 150+ tokens when both copies live in test files. Advisory while the gate proves itself: extract a shared helper instead of copying.

First copy Second copy Lines Tokens
frontend/src/layout/today/todayRecentsLogic.ts:53 frontend/src/layout/today/todayViewsLogic.ts:121 31 92
⚠️ Comment density — 4% of added code lines are comments (75 of 2097)

This section warns when comments are more than 3% of the code lines a PR adds, and alerts above 6%. Before agent-assisted PRs, the typical share was about 2%. Only full-line comments count. Docstrings, generated files, snapshots, migrations, and workflow files are left out.

Comments that restate the code, record how the change came about, or narrate the next line add noise for the next reader. Keep the comments that explain a reason the code cannot show, and remove the rest. See .agents/skills/writing-code-comments/SKILL.md for the house rules.

Files with the most added comment lines:

File Comment lines Added lines
frontend/src/layout/scenes/components/useSceneNameEditing.ts 15 129
frontend/src/layout/scenes/components/SceneTitlePanelButton.tsx 8 116
frontend/src/layout/today/TodayPaneSearchList.tsx 8 79
frontend/src/layout/today/todayRecentsLogic.ts 8 140
frontend/src/layout/scenes/components/QuillSceneHeader.tsx 4 30
frontend/src/layout/today/TodaySessionIcon.tsx 4 20
frontend/src/layout/scenes/components/QuillSceneName.tsx 3 128
frontend/src/layout/today/TodaySpacesRow.tsx 3 62

This check does not block merging. It updates on every push and clears when the share drops.

⚠️ Bundle size — 🔺 +19.8 KiB (+0.0%)

Uncompressed size of every built .js bundle, compared against the base branch.

Total: 69.66 MiB · 🔺 +19.8 KiB (+0.0%)

File Size Δ vs base
posthog-app/src/scenes/tools/Tools.js 5.9 KiB 🔺 +5.9 KiB (new)
posthog-app/src/scenes/views/NewView.js 5.4 KiB 🔺 +5.4 KiB (new)
posthog-app/src/scenes/AuthenticatedShell.js 305.4 KiB 🔺 +2.1 KiB (+0.7%)
posthog-app/_parent/products/posthog_ai/frontend/scenes/TaskTracker/TaskTracker.js 86.2 KiB 🟢 -1.0 KiB (-1.2%)

Posted automatically by build-bundle-size-report · uncompressed bytes from dist-report

✅ Eager graph — within budget

How much code each root ships on the eager path — downloaded and parsed before the surface is interactive. Measured from the esbuild output chunks (post-tree-shake, static imports only); lazy import() / React.lazy chunks are not counted.

Root Eager (shipped) Δ vs base Budget
entry (logged-out pages, app bootstrap)
src/index.tsx
1.63 MiB · 22 files 🔺 +878 B (+0.1%) █████████░ 88.7% of 1.84 MiB
logged-out boot: index + App + bootApp (preloaded by every page, including /login)
src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
3.72 MiB · 660 files 🔺 +1.1 KiB (+0.0%) █████████░ 92.3% of 4.03 MiB
authenticated shell (every logged-in page)
src/scenes/AuthenticatedShell.tsx
7.70 MiB · 2,491 files 🟢 -118.3 KiB (-1.5%) █████████░ 92.4% of 8.34 MiB
dashboard scene
src/scenes/dashboard/Dashboard.tsx
9.67 MiB · 3,397 files 🔺 +8.2 KiB (+0.1%) ███████░░░ 71.7% of 13.48 MiB
project home scene
src/scenes/project-homepage/ProjectHomepage.tsx
14.04 MiB · 5,036 files 🔺 +10.4 KiB (+0.1%) █████████░ 85.4% of 16.44 MiB
events scene
src/scenes/activity/explore/EventsScene.tsx
9.29 MiB · 3,249 files 🔺 +8.2 KiB (+0.1%) ███████░░░ 73.5% of 12.64 MiB
replay detail scene
src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
12.11 MiB · 4,126 files 🔺 +8.2 KiB (+0.1%) ████████░░ 77.1% of 15.72 MiB

🟢 node_modules/monaco-editor/ stays out of src/index.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 [object Object] stays out of src/index.tsx
🟢 node_modules/monaco-editor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/layout/navigation-3000/navigationLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/scenes/dashboard/dashboardLogic.tsx stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/lemon-ui/LemonMarkdown/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/RichContentEditor/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/lib/components/CodeSnippet/ stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 src/taxonomy/core-filter-definitions-by-group.json stays out of src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
🟢 node_modules/monaco-editor/ stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/lib/components/ActivityLog/describers stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 src/scenes/session-recordings/player/sessionRecordingPlayerLogic.ts stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx
🟢 [object Object] stays out of src/scenes/AuthenticatedShell.tsx

Largest files eagerly shipped from src/index.tsx
Size File
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
24.6 KiB ../node_modules/.pnpm/buffer@6.0.3/node_modules/buffer/index.js
6.3 KiB ../node_modules/.pnpm/react@18.3.1/node_modules/react/cjs/react.production.min.js
4.5 KiB ../node_modules/.pnpm/@jspm+core@2.1.0/node_modules/@jspm/core/nodelibs/browser/process.js
3.9 KiB ../node_modules/.pnpm/scheduler@0.23.2/node_modules/scheduler/cjs/scheduler.production.min.js
1.4 KiB ../node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js
1.3 KiB src/index.tsx
1.3 KiB src/RootErrorBoundary.tsx
912 B ../node_modules/.pnpm/ieee754@1.2.1/node_modules/ieee754/index.js
854 B src/scenes/ChunkLoadErrorBoundary.tsx
Largest files eagerly shipped from src/index.tsx + src/scenes/App.tsx + src/scenes/bootApp.ts
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
100.5 KiB src/lib/api.ts
92.5 KiB src/products.tsx
69.4 KiB src/lib/lemon-ui/icons/icons.tsx
40.1 KiB src/lib/utils/eventUsageLogic.ts
38.7 KiB ../node_modules/.pnpm/@dnd-kit+core@6.0.8_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@dnd-kit/core/dist/core.esm.js
33.9 KiB ../node_modules/.pnpm/kea@4.0.0-pre.6_patch_hash=139b8d1f1304f9d9da452a9a1244c94ea679dbcb85687d8999563146879fb6f5_react@18.3.1/node_modules/kea/lib/index.cjs.js
29.0 KiB ../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.js
Largest files eagerly shipped from src/scenes/AuthenticatedShell.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
111.6 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
90.6 KiB ../node_modules/.pnpm/@tiptap+core@3.20.6_@tiptap+pm@3.20.6/node_modules/@tiptap/core/dist/index.js
Largest files eagerly shipped from src/scenes/dashboard/Dashboard.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
111.6 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
Largest files eagerly shipped from src/scenes/project-homepage/ProjectHomepage.tsx
Size File
315.5 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
111.6 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
Largest files eagerly shipped from src/scenes/activity/explore/EventsScene.tsx
Size File
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
111.6 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js
92.5 KiB src/products.tsx
Largest files eagerly shipped from src/scenes/session-recordings/detail/SessionRecordingDetail.tsx
Size File
315.5 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/rrweb.js
306.2 KiB ../node_modules/.pnpm/posthog-js@1.435.5_@types+react@18.3.27_react@18.3.1/node_modules/posthog-js/dist/module.mjs
279.9 KiB src/taxonomy/core-filter-definitions-by-group.json
220.3 KiB ../node_modules/.pnpm/@posthog+icons@0.38.0_react-dom@18.3.1_react@18.3.1__react@18.3.1/node_modules/@posthog/icons/dist/posthog-icons.es.js
181.8 KiB src/queries/validators.js
153.7 KiB ../node_modules/.pnpm/re2js@0.4.1/node_modules/re2js/build/index.esm.js
126.8 KiB ../node_modules/.pnpm/react-dom@18.3.1_react@18.3.1/node_modules/react-dom/cjs/react-dom.production.min.js
111.6 KiB ../packages/quill/packages/quill/dist/index.js
100.5 KiB src/lib/api.ts
93.3 KiB ../node_modules/.pnpm/prosemirror-view@1.40.1/node_modules/prosemirror-view/dist/index.js

Posted automatically by check-eager-graph · sizes are eager output bytes (shipped, post-tree-shake) from the esbuild metafile · part of #32479

✅ Toolbar bundle — eager 2.20 MiB within budget

What the toolbar ships to customer pages, measured from the esbuild output (minified, post-tree-shake). The eager set is the entry plus everything statically imported from it — fetched before any feature runs; deferred chunks load lazily. The eager guardrail is 5.72 MiB. Each output file must also stay below 10 MB, where CloudFront stops compressing it. The module boundary is enforced separately by check-toolbar-graph.

Metric Size Δ vs base Budget
Eager (shipped)
entry + static imports
2.20 MiB · 19 files 🔺 +2.8 KiB (+0.1%) ████░░░░░░ 38.5% of 5.72 MiB
Deferred (lazy) 2.11 MiB · 44 files no change n/a — loads on demand
Loader dist/toolbar.js 1.2 KiB no change █░░░░░░░░░ 6.0% of 19.5 KiB
Largest eagerly-shipped chunks
Size File
837.0 KiB dist/toolbar/toolbar-app-IXUPV6HS.css
657.4 KiB dist/toolbar/chunk-chunk-TNRTR3I3.js
259.4 KiB dist/toolbar/chunk-chunk-SVMAQ3OC.js
138.2 KiB dist/toolbar/chunk-chunk-BUO6MW6E.js
131.8 KiB dist/toolbar/chunk-chunk-FDH2IBXT.js
75.2 KiB dist/toolbar/toolbar-app-VKACUART.js
69.0 KiB dist/toolbar/chunk-chunk-TSAL54PB.js
35.6 KiB dist/toolbar/chunk-chunk-LWEC4HSN.js
21.0 KiB dist/toolbar/chunk-chunk-AVIOSREB.js
6.8 KiB dist/toolbar/chunk-chunk-DV7IWQNF.js

Posted automatically by check-toolbar-size · sizes are toolbar output bytes (shipped, post-tree-shake) from the esbuild metafile

✅ Dist folder size — 🔺 +257.1 KiB (+0.0%)

Total size of the built frontend/dist folder (all assets), compared against the base branch.

Total: 959.52 MiB · 🔺 +257.1 KiB (+0.0%)

⚠️ Playwright — 1 failed

🎭 Playwright report · View test results →

❌ 1 failed test:

  • create experiment via wizard, add metrics, and launch (chromium)

These issues are not necessarily caused by your changes.
Annoyed by this section? Help fix flakies and failures and it will go green!

⚠️ MCP snapshots — 1 updated (1 modified, 0 added, 0 deleted)

Snapshots: MCP unit test snapshots updated

Changes: 1 snapshots (1 modified, 0 added, 0 deleted)

What this means:

  • Snapshots have been automatically updated to match current output

Next steps:

  • Review the changes to ensure they're intentional
  • If unexpected, investigate what caused the output to change

Review snapshot changes →

@github-actions
github-actions Bot requested a deployment to preview-pr-110696 October 2, 2026 11:33 In progress
@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

🦔 Hogbox preview · ✅ ready

▶ Open the preview

🔑 Login test@posthog.com / 12345678 (demo data)
🧩 Running this PR's backend and frontend, on the PostHog :master base
🔗 Link stable across rebuilds — a re-push swaps the box underneath, the URL stays
🔒 Access tailnet only (PostHog VPN)
🛠️ Admin inspect & debug state in hogland
💤 Idle sleeps after ~30 min idle (snapshot to S3, zero node cost) and wakes on your next visit in ~30s, behind a brief "waking up" screen

commit b6da1b0 · box box-6ecd826178c3 · ready in 645s (push → usable) · build log · rebuilds on every push, torn down on close

@pr-assigner-resolver-posthog
pr-assigner-resolver-posthog Bot requested review from a team October 2, 2026 11:33
@pr-assigner-resolver-posthog

Copy link
Copy Markdown

👀 Auto-assigned reviewers

These soft owners were skipped because they only have minor changes here. Nothing blocks merge, so self-assign if you'd like a look:

  • @PostHog/team-data-stack (frontend/src/scenes/owners.yaml)

Soft owners come from each directory's owners.yaml and each product's product.yaml (resolved nearest-file-wins). For a skipped owner, the locator is the file that decided it. Generated files and lockfiles are ignored when deciding ownership.

@github-actions
github-actions Bot requested a deployment to preview-pr-110696 October 2, 2026 11:37 In progress
@greptile-apps

greptile-apps Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Retrigger

[Medium risk] Refactors the Today layout UI to adopt desktop design patterns.

The PR is not ready to merge until recently viewed data is complete and project-scoped and the explicit frontend UI requirements are met.

Reviews (1) · Last reviewed commit: "feat(today): adopt desktop's chrome in t..."

Comment on lines +624 to +629
recentlyViewedSessions: [
(s) => [s.recentSessionIds, s.allRecentItems, s.recentQuery],
(recentSessionIds: string[], allRecentItems: TodayWorkItem[], recentQuery: string): TodayWorkItem[] =>
recentSessionIds
.flatMap((id) => allRecentItems.find((item) => item.kind === 'session' && item.id === id) ?? [])
.filter((item) => matchesPaneQuery(item.title || '', recentQuery)),

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.

P1 Viewed sessions go missing A session opened from Pinned, or one that falls outside the capped Recent list, is recorded as viewed but cannot appear in Recently viewed. This selector looks only in allRecentItems, which excludes pinned sessions and limits the remaining results. Resolve recorded session IDs independently of that list.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/today/todaySpacesLogic.ts
Line: 624-629

Comment:
**Viewed sessions go missing** A session opened from Pinned, or one that falls outside the capped Recent list, is recorded as viewed but cannot appear in Recently viewed. This selector looks only in `allRecentItems`, which excludes pinned sessions and limits the remaining results. Resolve recorded session IDs independently of that list.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +120 to +123
.flatMap((entry) => {
const href = VIEW_FILE_SYSTEM_TYPES.has(baseObjectType(entry.type))
? libraryObjectHref(entry)
: null

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.

P1 Canvas visits are omitted Opening a canvas cannot add it to Views' Recently viewed group because this check accepts only dashboard and notebook filesystem types. Canvases are also Views; include them in the view-recents classification.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/today/todayRecentsLogic.ts
Line: 120-123

Comment:
**Canvas visits are omitted** Opening a canvas cannot add it to Views' Recently viewed group because this check accepts only dashboard and notebook filesystem types. Canvases are also Views; include them in the view-recents classification.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +109 to +112
recentSessionIds: [
[] as string[],
{ persist: true },
{ recordSessionVisit: (state, { sessionId }) => pushRecent(state, sessionId) },

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.

P1 Projects share session history Session IDs are persisted in one five-item browser-wide list. If visits in project A fill that list, then visiting one session in project B leaves only that session eligible for B's Recently viewed group. Store session recents per project so each project keeps its own last five visits.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/today/todayRecentsLogic.ts
Line: 109-112

Comment:
**Projects share session history** Session IDs are persisted in one five-item browser-wide list. If visits in project A fill that list, then visiting one session in project B leaves only that session eligible for B's Recently viewed group. Store session recents per project so each project keeps its own last five visits.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +190 to +199
{hasPinned && (
<TodayPaneSection
label="Pinned"
{...sectionLayout('pinned')}
count={pinnedItems.length}
onToggle={() => toggleSection('pinned')}
dataAttr="today-section-pinned"
>
{shownPinnedItems.map((item) =>
renderItem(item, 'pinned', 'today-pinned-session', true)

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.

P2 Search leaves misleading counts Search filters the Pinned and Spaces rows, but their collapsed counts still come from the unfiltered lists. A section can claim results that opening it will not show, and Pinned can remain visible with no matching rows. Use the filtered rows for section presence and counts while searching.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/today/TodaySpacesSidebar.tsx
Line: 190-199

Comment:
**Search leaves misleading counts** Search filters the Pinned and Spaces rows, but their collapsed counts still come from the unfiltered lists. A section can claim results that opening it will not show, and Pinned can remain visible with no matching rows. Use the filtered rows for section presence and counts while searching.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +60 to +65
<QuillSceneHeader
className={cn(
'z-30 bg-[var(--scene-layout-background)] @2xl/main-content:sticky -top-[calc(var(--spacing)*4)]',
!noPadding && '-mx-4 -mt-4',
className
)}

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.

P2 Borderless titles gain borders The SQL editor passes noBorder for its embedded title, but this branch drops the prop and QuillSceneHeader always draws a bottom border. Under the Today flag, that breaks the editor's borderless title layout. Honor noBorder here.

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/scenes/components/QuillSceneTitleSection.tsx
Line: 60-65

Comment:
**Borderless titles gain borders** The SQL editor passes `noBorder` for its embedded title, but this branch drops the prop and `QuillSceneHeader` always draws a bottom border. Under the Today flag, that breaks the editor's borderless title layout. Honor `noBorder` here.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +108 to +112
actions={
<>
{!hideProductSetupButton && <ProductSetupButton />}
{actions}
<SceneTitlePanelButton maxToolProps={maxToolProps} maxButtonLabel={maxButtonLabel} />

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.

P2 Title mixes component libraries This Quill title renders LemonUI controls, including ProductSetupButton, ReleaseStageTag, and SceneDescription. The frontend guide requires Quill and LemonUI not to be mixed inside one component. Provide Quill-compatible controls before merging.

File Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/layout/scenes/components/QuillSceneTitleSection.tsx
Line: 108-112

Comment:
**Title mixes component libraries** This Quill title renders LemonUI controls, including `ProductSetupButton`, `ReleaseStageTag`, and `SceneDescription`. The frontend guide requires Quill and LemonUI not to be mixed inside one component. Provide Quill-compatible controls before merging.

**File Used:** `AGENTS.md` ([source](https://github.com/posthog/posthog/blob/e81a403186eb78c2448ba3c5cf85b07490e6d80c/AGENTS.md))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +29 to +36
<ItemGroup data-quill className="max-w-160 gap-2">
{VIEW_TYPES.map((info) => (
<Item
key={info.type}
variant="outline"
render={<button type="button" />}
className="text-start text-foreground hover:bg-fill-hover"
onClick={() => pickNewViewType(info.type)}

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.

P2 Flag-off pages render Quill The New view and Tools routes are available without today-rail-nav, but both page bodies render Quill controls unconditionally. The frontend guide requires the flag-off web UI to remain on LemonUI. Gate their Quill presentation or provide a LemonUI path before merging.

File Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: frontend/src/scenes/views/NewView.tsx
Line: 29-36

Comment:
**Flag-off pages render Quill** The New view and Tools routes are available without `today-rail-nav`, but both page bodies render Quill controls unconditionally. The frontend guide requires the flag-off web UI to remain on LemonUI. Gate their Quill presentation or provide a LemonUI path before merging.

**File Used:** `AGENTS.md` ([source](https://github.com/posthog/posthog/blob/e81a403186eb78c2448ba3c5cf85b07490e6d80c/AGENTS.md))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@coderabbitai

coderabbitai Bot commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

We couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting @coderabbitai full review.

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
📝 Walkthrough

Walkthrough

The Today workspace adds shared searchable pane components, recent views, tools, and sessions, and routes for Tools and New view. Scene titles and task headers now use shared header and name-editing components. The changes also update Today navigation styling and session icon rendering.

🚥 Pre-merge checks | ✅ 1
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed The description is complete and follows the repository template. It explains the problem, user-visible changes, screenshots, testing performed, test rationale, limitations, release status, documentati…
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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

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

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (6)
products/tasks/frontend/spaces/SpaceFeedStatusIcon.tsx-8-9 (1)

8-9: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Restore the accessible status label for chat sessions.

TodaySessionStatusDot preserves labels for running and terminal statuses on its dot or spinner child. TodaySessionIcon renders chat sessions as an unlabeled IconChat, so chat status is no longer announced. Add the former role="img" and aria-label="Chat" behavior for the chat branch only.

frontend/src/layout/scenes/components/QuillSceneName.tsx-78-81 (1)

78-81: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Return focus to the trigger after keyboard exits.

When forceEdit is false, Escape calls cancel() and Enter exits through blur. The input then unmounts without restoring focus to the edit button, so keyboard users can lose focus from the title control. Restore focus only for Escape and Enter, not for blur-driven exits.

frontend/src/layout/today/TodayLibrarySidebar.tsx-25-25 (1)

25-25: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Move the query state into Kea.

TodayLibrarySidebar uses useState for the pane query. The frontend convention prohibits useState and useEffect for local state. Its exception applies only to reusable components in frontend/src/lib, while this component is in frontend/src/layout/today. Add a query reducer to libraryLogic or a small todayLibraryLogic, and derive the filtered types in a selector.

frontend/src/layout/today/todayShellLogic.ts-236-236 (1)

236-236: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Preserve the current page when the active pane is selected.

railPaneForPath assigns dashboards and notebooks to the views pane. Therefore, selecting Views from /dashboard/12 should not navigate to /views/new. Add the guard below. It preserves the current page for the active pane and still navigates to the roots for Spaces and Tools when those panes are not active.

Suggested fix
-            router.actions.push(RAIL_PANE_HOME[pane]())
+            if (values.routePane !== pane) {
+                router.actions.push(RAIL_PANE_HOME[pane]())
+            }
frontend/src/layout/today/TodaySpacesSidebar.tsx-309-370 (1)

309-370: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Render no-match states for Spaces and Pinned.

When visibleSpaces is nonempty but shownSpaces is empty, spacesState receives the unfiltered count for shown. The helper returns ready, so the section renders no rows and no clear action. Pass the filtered count and add the existing Recent-style No matches notice using clearRecentSearchAndFilters.

Suggested fix
     const spacesState = todaySidebarSectionState({
         loading: spacesLoading,
         failed: spacesUnavailable,
         total: visibleSpaces.length,
-        shown: visibleSpaces.length,
+        shown: shownSpaces.length,
     })

Pinned has no pinnedState; it maps shownPinnedItems directly. When pinned items exist but the query excludes all of them, render the same No matches notice and clear action when shownPinnedItems.length === 0. The shown-count change alone does not fix Pinned.

frontend/src/layout/today/todaySpacesLogic.ts-622-629 (1)

622-629: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep recorded tasks visible in “Recently viewed.”

When /ai?task=<id> is opened, todayRecentsLogic records the task ID. If the task is outside the 30-item recent-task response and is not pinned, buildRecentItems does not produce a session item for it. conversationHistory is loaded separately as conversations, and recentlyViewedSessions only matches kind === 'session'. The recorded ID is therefore dropped, so TodaySpacesSidebar omits the task. Add a direct lookup or merge for recorded task IDs before filtering them.


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 0c068ffd-f4c0-4f0d-b81c-657f12fd313b

📥 Commits

Reviewing files that changed from the base of the PR and between 45a06ce and ddb9193.

📒 Files selected for processing (59)
  • frontend/src/layout/navigation-3000/Navigation.tsx
  • frontend/src/layout/scenes/components/QuillSceneHeader.tsx
  • frontend/src/layout/scenes/components/QuillSceneName.tsx
  • frontend/src/layout/scenes/components/QuillSceneTitleSection.tsx
  • frontend/src/layout/scenes/components/SceneDescription.tsx
  • frontend/src/layout/scenes/components/SceneTitlePanelButton.test.tsx
  • frontend/src/layout/scenes/components/SceneTitlePanelButton.tsx
  • frontend/src/layout/scenes/components/SceneTitleSection.tsx
  • frontend/src/layout/scenes/components/sceneResourceIcon.tsx
  • frontend/src/layout/scenes/components/useSceneNameEditing.ts
  • frontend/src/layout/today/TodayChatRow.tsx
  • frontend/src/layout/today/TodayFilterMenuTrigger.tsx
  • frontend/src/layout/today/TodayLibrarySidebar.tsx
  • frontend/src/layout/today/TodayListAppearanceDialog.tsx
  • frontend/src/layout/today/TodayPaneGroupLabel.tsx
  • frontend/src/layout/today/TodayPaneOption.tsx
  • frontend/src/layout/today/TodayPaneRow.tsx
  • frontend/src/layout/today/TodayPaneSearchField.tsx
  • frontend/src/layout/today/TodayPaneSearchList.tsx
  • frontend/src/layout/today/TodayRail.tsx
  • frontend/src/layout/today/TodayRailTile.tsx
  • frontend/src/layout/today/TodayRecentSearchField.tsx
  • frontend/src/layout/today/TodaySessionIcon.tsx
  • frontend/src/layout/today/TodaySessionRow.tsx
  • frontend/src/layout/today/TodaySessionStatusIcon.tsx
  • frontend/src/layout/today/TodayShell.scss
  • frontend/src/layout/today/TodayShell.tsx
  • frontend/src/layout/today/TodaySidebarFooter.tsx
  • frontend/src/layout/today/TodaySpacesRow.tsx
  • frontend/src/layout/today/TodaySpacesSidebar.tsx
  • frontend/src/layout/today/TodayToolsSidebar.tsx
  • frontend/src/layout/today/TodayViewsSidebar.tsx
  • frontend/src/layout/today/todayPaneSearch.ts
  • frontend/src/layout/today/todayRecentsLogic.ts
  • frontend/src/layout/today/todaySessionIcon.test.ts
  • frontend/src/layout/today/todaySessionIcon.ts
  • frontend/src/layout/today/todayShellLogic.test.ts
  • frontend/src/layout/today/todayShellLogic.ts
  • frontend/src/layout/today/todaySpacesLogic.ts
  • frontend/src/layout/today/todayToolsLogic.ts
  • frontend/src/layout/today/todayViewsLogic.ts
  • frontend/src/layout/today/todayWorkItems.ts
  • frontend/src/scenes/appScenes.ts
  • frontend/src/scenes/data-warehouse/editor/QueryWindow.tsx
  • frontend/src/scenes/project-homepage/today/Today.scss
  • frontend/src/scenes/project-homepage/today/Today.stories.tsx
  • frontend/src/scenes/project-homepage/today/TodayHomeSidebar.tsx
  • frontend/src/scenes/sceneTypes.ts
  • frontend/src/scenes/scenes.ts
  • frontend/src/scenes/tools/Tools.tsx
  • frontend/src/scenes/tools/toolsLogic.ts
  • frontend/src/scenes/tools/toolsUtils.ts
  • frontend/src/scenes/urls.ts
  • frontend/src/scenes/views/NewView.tsx
  • products/posthog_ai/frontend/scenes/TaskTracker/components/QuillTaskTitle.tsx
  • products/posthog_ai/frontend/scenes/TaskTracker/components/TaskRunSceneShell.tsx
  • products/tasks/frontend/spaces/SpaceFeedStatusIcon.tsx
  • services/mcp/src/tools/links/app-url-manifest.json
  • services/mcp/tests/unit/__snapshots__/tool-schemas/generate-app-url.json
💤 Files with no reviewable changes (8)
  • frontend/src/scenes/project-homepage/today/TodayHomeSidebar.tsx
  • frontend/src/layout/today/todaySessionIcon.ts
  • frontend/src/layout/today/TodaySessionStatusIcon.tsx
  • products/posthog_ai/frontend/scenes/TaskTracker/components/QuillTaskTitle.tsx
  • frontend/src/layout/today/TodayRecentSearchField.tsx
  • frontend/src/layout/today/todaySessionIcon.test.ts
  • frontend/src/scenes/project-homepage/today/Today.scss
  • frontend/src/layout/today/TodayPaneSearchField.tsx

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 10 remain after this review.

@trunk-io

trunk-io Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Static Badge   Static Badge   Static Badge

Failed Test Failure Summary Logs
personalAPIKeysLogic preserves the `*` (all access) scope regardless of flag state The test failed because it could not find the specified path 'scenes.PreflightCheck.preflightLogic' in the store. Logs ↗︎
compareTopLevelSections() reports a modifiers change when the current query overrides the team default A TypeError occurred because the code attempted to access the 'add' property of an undefined object. Logs ↗︎

View Full Report ↗︎ ⋅ Docs

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

Note

Quiet mode is enabled, so only the most important comments were posted inline. Other review comments are grouped below.

🟡 Other comments (1)
frontend/src/layout/scenes/components/SceneTitleSection.tsx-406-411 (1)

406-411: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Ignore Enter during IME composition in both scene-name inputs.

useSceneNameEditing.saveFromEnter immediately calls onChange when saveOnBlur is enabled and the value changed. Both SceneName and QuillSceneName call it for every Enter press without checking isComposing.

The Lemon behavior existed in the PR base. The head also routes the Today rail through QuillSceneName, so apply the guard to both handlers.

Suggested fix
// frontend/src/layout/scenes/components/SceneTitleSection.tsx
-                                if (e.key === 'Enter') {
+                                if (e.key === 'Enter' && !e.nativeEvent.isComposing) {
                                     e.preventDefault()
                                     saveFromEnter(e.currentTarget.value)
// frontend/src/layout/scenes/components/QuillSceneName.tsx
-                        if (event.key === 'Enter') {
+                        if (event.key === 'Enter' && !event.nativeEvent.isComposing) {
                             event.preventDefault()
                             saveFromEnter(event.currentTarget.value)
                             if (!forceEdit) {

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: PostHog/posthog/.coderabbit.yaml

Review profile: QUIET

Plan: Enterprise

Run ID: 05d68002-52c8-41ab-8acd-a59f19db21c9

📥 Commits

Reviewing files that changed from the base of the PR and between ddb9193 and a43c6ed.

📒 Files selected for processing (1)
  • frontend/src/layout/scenes/components/SceneTitleSection.tsx

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 11 remain after this review.

adamleithp and others added 4 commits October 2, 2026 14:20
Rail, sidebar pane and content sit side by side with quill borders, like
PostHog Desktop. The rail shows labelled tiles and opens each section.
Sidebar panes and scene titles share one 48px title bar, and every pane
gets a keyboard-navigable quill autocomplete list with recently viewed
items on top.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… url manifest

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	services/mcp/tests/unit/__snapshots__/tool-schemas/generate-app-url.json
@adamleithp

Copy link
Copy Markdown
Contributor Author

/trunk merge

This branch was successfully deployed

1 active deployment
preview-pr-110696 — b6da1b0a Deployed Oct 2, 2026 by github-actions[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants