GeezerVison is showing github.com — feat(site): redesign the project page header by jaaydenh · Pull Request #30293 · coder/coder
Conversation
jaaydenh
commented
Oct 2, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Redesigns the top of /agents/projects/:projectId: a left-aligned header with the project icon, name, and an actions menu, then the description and a badge row. The composer fills the page column.
- Actions menu: Edit project and Delete project replace the "Edit project" button under the composer. Deleting toasts "Project deleted", clears the project's composer drafts as the sidebar's delete does, and returns to
/agents, keeping the sidebar's filter query string.
- Badges: Project owner shows "you" for your own projects. Other owners are looked up, with a skeleton while loading and "Unknown" on error. Created shows the date, with the full timestamp in a keyboard-focusable tooltip. Organization only appears when organizations are shown.
ProjectComposerHeader (#30378) and ProjectComposerFooter with its stories (#30379) are removed. The page keeps #30379's loading, "Project not found", and retryable error states, and the ProjectLoaded story now waits for the actions menu. The ProjectComposer story is removed with the header, so chatProjectNameMaxChars and chatProjectDescriptionMaxChars are no longer exported.
Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of the original #29583, and this stack sits on #29583:
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
# Conflicts:
# docs/reference/api/schemas.md
# Conflicts:
# coderd/database/db2sdk/db2sdk.go
# coderd/database/dbauthz/dbauthz.go
# coderd/database/dbmetrics/querymetrics.go
# coderd/database/dbmock/dbmock.go
# coderd/database/modelmethods.go
# coderd/database/querier.go
# coderd/database/querier_test.go
# coderd/database/queries.sql.go
…ories
# Conflicts:
# coderd/database/dbauthz/dbauthz.go
# coderd/database/dbmetrics/querymetrics.go
# coderd/database/querier.go
# coderd/database/querier_test.go
# coderd/database/queries.sql.go
# coderd/x/chatd/memory_extract_internal_test.go
# coderd/x/chatd/projectmemory_extract.go
…olidation
# Conflicts:
# coderd/database/dbauthz/dbauthz.go
# coderd/database/dbmetrics/querymetrics.go
# coderd/database/querier.go
# coderd/x/chatd/memory_extract.go
…emories
Memory permissions now derive from the project owner and ACL, memory tools
and the extractor use scope-neutral names, and the extraction cursor table
is chat_memory_cursors.
…onsolidation
Drops personal memory: consolidation now runs only for project memory and
its journal follows the project ACL.
…' into f0ssel/chat-projects-ui-folders
The chat sharing popover now takes a chat or project target, and the
project page shows a Share control to users who may share it.
Sharing (#29597) is parked; memory permissions follow the project owner
only and the memory migration returns to 000599.
…to f0ssel/chat-memory-consolidation
…onsolidation
Sharing is out of the stack; the consolidation migration returns to 000600.
…' into f0ssel/chat-projects-ui-folders
Sharing (#29597) is parked; the sharing popover is chat-only again.
…oject before other chat updates
…l/chat-project-memories
# Conflicts:
# coderd/database/dump.sql
# coderd/database/unique_constraint.go
…ers-resync
# Conflicts:
# site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
…ct folder review feedback
- Show an empty state when every visible chat is filed in a project.
- Reuse the chat list empty-state copy for empty folders.
- Make the projects loading and error props required.
- Rename ProjectDialogMode to ProjectDialogState.
- Add mock prefixes to new test fixtures.
- Add stories for loading, error, and empty emoji-icon folder states.
…lar empty state when every chat is in a project
Project chats live only in their folders, so the Chats section uses its
usual empty-state copy when nothing outside a project remains.
…folders open when navigating between projects
A folder that was open because its project was active now stays open
when the user opens a chat in another project. Only an explicit toggle
collapses a folder.
…roject's page after creating it
…t folders with the chat list
The Projects section no longer has its own bounded scroll area. It sits
in the sidebar's scroll area above the Chats section, so expanding a
folder pushes the chats down.
…coder/coder into f0ssel/chat-projects-ui-folders
# Conflicts:
# site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
…ct's page after deleting it
…ew feedback on project deletion and stories
…s empty state while projects load
When every chat belongs to a project, those chats are held back until
the project list loads. The Chats section showed "No agents yet" in the
meantime, which falsely told users their chats did not exist.
… into chat-project-page/composer-frame
…' into chat-project-page/list-queries
# Conflicts:
# site/src/pages/AgentsPage/exp/chatBoard/refreshChatList.test.tsx
…into chat-project-page/header
# Conflicts:
# site/src/pages/AgentsPage/AgentCreatePage.test.tsx
# site/src/pages/AgentsPage/components/ProjectComposerFooter.stories.tsx
# site/src/pages/AgentsPage/components/ProjectComposerFooter.tsx
jaaydenh
added a commit
that referenced
this pull request
Oct 6, 2026
`AgentCreateForm` no longer takes the `header`/`footer` slots added in
#30378, and no longer owns the page wrapper. The centered `max-w-3xl`
wrapper moves into `AgentCreateFormFrame`, which the new-chat page, the
project page, and the board draft wrap around the form. The project page
renders its existing `ProjectComposerHeader` and `ProjectComposerFooter`
(#30379) around the form inside the frame, so nothing changes visually.
The form keeps its `project` prop, per-project drafts, and remount per
project from #30378.
`ChatDiffStats` (from `ChatTreeNode`) and `ProjectActionsMenuItems`
(from `ProjectFolders`) are moved into their own files unchanged so the
redesigned project page can reuse them.
Most of the `AgentCreateForm.tsx` diff is re-indentation; review with
whitespace hidden.
---
Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of
the original #29583, and this stack sits on #29583:
- #30377 data layer and project dialog (f0ssel)
- #30378 new-chat form locked to a project (f0ssel)
- #30379 project page route (f0ssel)
- #29583 sidebar folders (f0ssel), the base of this stack
- #30291 composer frame 👈
- #30292 project chat list caches
- #30293 project page header
- #30294 project chats list
- #30367 instructions storage and prompt injection
- #30368 instructions API
- #30369 instructions editor dialog
- #30370 instructions Details panel
---------
Co-authored-by: Garrett Delfosse <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
jaaydenh
added a commit
that referenced
this pull request
Oct 6, 2026
Adds a project chat list query family (`projectChatsKey`) next to the
sidebar's chat lists, so the project page's chat list stays current.
- `updateInfiniteChatsCache`, `invalidateChatListQueries`,
`cancelChatListRefetches`, `cancelChatListQueries`, and the
archive-state patching cover both families. Project lists only hold
unarchived chats, so archived chats are dropped.
- `archiveChat` snapshots project lists and restores them when archiving
fails.
- A new project chat invalidates its project list instead of being
prepended. Prepending would shift the offset pages and repeat a row on
the next page.
- `findChatInListCaches` looks a chat up across both families.
`AgentsPageLayout` uses it for the chime's previous status and the
archive-and-delete `created_at`.
The family is kept outside `chatListFamilyKey` because the sidebar
helpers assume sidebar-shaped keys. The query factory that fills these
caches lands with its consumer in the chats list PR.
---
Stack (merge top to bottom). #30377 through #29583 are f0ssel's split of
the original #29583, and this stack sits on #29583:
- #30377 data layer and project dialog (f0ssel)
- #30378 new-chat form locked to a project (f0ssel)
- #30379 project page route (f0ssel)
- #29583 sidebar folders (f0ssel), the base of this stack
- #30291 composer frame
- #30292 project chat list caches 👈
- #30293 project page header
- #30294 project chats list
- #30367 instructions storage and prompt injection
- #30368 instructions API
- #30369 instructions editor dialog
- #30370 instructions Details panel
---------
Co-authored-by: Garrett Delfosse <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
Uh oh!
There was an error while loading. Please reload this page.
Reviewers
jakehwll
jakehwll approved these changes
Uh oh!
There was an error while loading. Please reload this page.
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|