Skip to main content
← All notes
Building

One project page shows everything without a single tab switch

software

When a client taps into a project from the portal dashboard, they land on a single page that shows every dimension of the work. The project detail page is an async server component that calls getProjectDetail with the project ID and the user's Clerk ID. If the project does not belong to that user, notFound fires and the page never renders. If it does, everything loads in one query — milestones with their comments, sessions with their attachments and comment threads, deliverables with status tracking, action items with assignment labels, and goals with discussion threads. The page lays it all out vertically. Milestones come first with a MilestoneTimeline gradient bar at the top and each milestone listed underneath with a coloured dot — emerald for done, cyan with a glow for active, dim white for upcoming. Every milestone has an inline CommentThread so the client can ask a question about a specific phase without navigating away. Sessions come next, each in its own GlassCard with the date, duration, notes, and any attached files rendered through AttachmentList. Audio attachments get a Play button. Everything else gets Download. Each session has its own CommentThread too. Deliverables follow with a vertical connector line tracking the four-stage pipeline — pending, in progress, delivered, approved. Then action items with the shared checklist. Then goals with their completion dots and discussion threads. One page, one query, one scroll. A client working on a mixing project and a software build sees the same layout for both because the components do not know or care what service type the project belongs to. The service type is a database field. The UI is universal.

Comments coming soon

Sign in with TikTok to leave a comment. Coming soon.