Trustead · I1 audit

Menu IA + page-width recommendation

Full analysis of every signed-in route, the four menu surfaces that currently render them, and a final recommendation. Read-only — no code changed.

Branch · audit/i1-intake Base · f2e33f7 Audit complete Revised after Loren’s feedback

1 · Route inventory

Every page under src/app/(app)/. “In menu?” = reachable from the desktop sidebar today.

RoutePurposeIn menu?Notes
/Homefront
/browseListing searchfront
/proposalsProposals listfrontAlso at /dashboard?tab=proposals · duplicate
/vouchVouch pickerfront
/inboxMessages listMessages
/tripsTrips listTripsAlso at /dashboard?tab=traveling · duplicate
/wishlistsSaved listingsWishlists
/dashboardHost dashboardHost dashboard
/dashboard?tab=networkNetwork tabdead500s · sidebar item removed (T3.10)
/dashboard/travelingLegacy redirecthiddenRedirects to ?tab=traveling
/dashboard/networkLegacy redirecthiddenRedirects to broken target
/dashboard/pending-vouchesPending invitesorphanedNo menu entry · only via deep link
/profileOwn profileProfile
/profile/[id]Public profileindirect
/inviteOld invite floworphanedDuplicate flow (issue 3)
/invite/shareNewer invite flowindirectFrom /vouch empty state
/settingsAccount settings rootAccount settings
/settings/{hosting,notifications,phone}Settings sub-pagesindirect3 pages
/alertsProposal alertsProposal alerts
/faqsFAQ encyclopediaHelp CenterSidebar Help Center → /faqs
/helpFAQ + contact formindirectOlder variant · signed-out menu only
/hosting/createCreate listingindirect
/hosting/listings/[id]/editEdit listingindirect
/listings/[id]Public listing detailindirect

2 · Menu-surface inventory · where they diverge

Four surfaces render navigation. They are not consistent today.

SurfaceSourceWhat’s in it
Desktop sidebarnav-items.tsx → SidebarShellfront (4) + interior (6) + account (3) = 13 items
Avatar dropdown (top-right)account-menu.tsxMirrors NAV_GROUPS + Log out · single source ✓
Mobile bottom barmobile-nav.tsx (tabs[])Explore / Wishlists / Dashboard / Inbox / Menu
Mobile slide-up sheetmobile-nav.tsx (custom block)Hand-rolled · adds “Invite someone” + “Vouch for a member” not in sidebar

Divergences

3 · Issues found

Eight concrete problems flagged during the route walk.

  1. Network menu item is dead. Removed because /dashboard?tab=network 500s. The route file at /dashboard/network still exists and forwards to the broken target. Nothing in the sidebar surfaces vouch-network management today.
  2. Pending invites is fully orphaned. /dashboard/pending-vouches has no link from any menu surface. Only reachable from notification deep-links or direct URL.
  3. Three parallel invite flows. /invite (5-step), /invite/share (5-step + mode chooser), and VouchModal (component, exists-user vouching). Punchlist item 2 covers this.
  4. Dashboard duplicates standalone pages. /trips/dashboard?tab=traveling · /proposals/dashboard?tab=proposals. Two URLs per concept means two places that can drift.
  5. Legacy redirect files still on disk. /dashboard/traveling and /dashboard/network exist purely to redirect. They imply structure that doesn’t exist.
  6. /help vs /faqs split. /faqs is the richer TOC-driven encyclopedia. /help is the older variant with FAQ list + contact form. Sidebar → /faqs; signed-out menu → /help.
  7. Mobile sheet hardcoded. Not consuming NAV_GROUPS, so any sidebar IA work needs a parallel edit. Source of “Invite someone” and “Vouch for a member” surfacing on mobile but not desktop.
  8. No “create” affordances in sidebar. Mobile sheet has “Create a listing” + “Invite someone”. Desktop sidebar has neither.

4 · Recommended menu

Adopts your first-pass structure. Five groups, divided by horizontal rules. One source of truth in nav-items.tsx that every surface consumes.

Why this works

5 · Decisions on open questions

Each question got a binding recommendation. Open to override — these are not locks.

5a · /help vs /faqsrevised

Decision (Loren): keep both pages, role-split them.

5b · Wishlists → Saved — revised

Decision (Loren): rename both the label AND the route. /wishlists/saved.

5c · Dashboard tab duplicates + Listings handling — revised

Decision (Loren): agreed on stripping traveling + proposals tabs. Keep Listings as a separate sidebar entry. Keep the tab primitive for future use.

5d · Sidebar Network slot — what page does it open?

Decision (Loren): agreed. Build /network as the consolidated network-management surface.

Contents (one page, three sections):

  1. Hero summary — vouch count, trust score, “New invite” CTA.
  2. Your network — current NetworkSection content (1° / 2° / inner circle / vouch-backs).
  3. Pending invites — pull in PendingVouchesList from /dashboard/pending-vouches. That route then dies or redirects.

5e · Profile photo as menu item — revised

Decision (Loren): avatar replaces the Profile row icon at the bottom of the sidebar — match the size and spacing of the other sidebar icons exactly.

5f · Listings — standalone or stay as dashboard tab?

Decision (Loren): defer. Real /listings management page is its own build session.

5g · Create affordances in the sidebar?

Decision (Loren): agreed. No “+ New” in the sidebar. Hub pages keep their own CTAs.

6 · Page-width tiers — revised

Loren’s note: form cards can stay narrow, but the heading + supporting copy + step indicators above them shouldn’t inherit that narrow width. Two separate concerns — outer page band vs. inner card width.

Revised: 3 outer tiers + a separate inner card primitive

Today: 15 distinct max-w-[...] values across pages. Target: 3 outer tiers (every page picks one) + a <FormCard> primitive for narrow form blocks inside a wider page band.

TokenWidthUse for
generalmax-w-[820px]Most pages — lists, settings, forms, management. Headings live at this width even when the form is narrow.
widemax-w-[1180px]List + detail with side rail · faqs, profile detail, listing detail, proposal lists
app-shellmax-w-[1600px]Dense workspace · inbox, host dashboard

Plus a separate <FormCard variant="narrow" | "default"> primitive (≈480px / ≈680px). Form pages mount a general PageShell with a FormCard inside — the heading band is wide, the form itself stays narrow.

Effect on the original gripe (item 1 in the punchlist): on /invite/share, the “Invite + pre-vouch a friend” display heading + step indicator now sit in the 820 band and read on a single line. The vouch picker card below stays at FormCard-narrow.

Re-bucketing every current page

PageCurrentlyOuter (PageShell)Inner
/invite · /invite/share · /settings/phone540generalFormCard narrow
/vouch (chooser)640generalFormCard narrow
/settings/notifications · /profile/edit · /proposals/new · /proposals/[id]/edit680–720generalFormCard default
/dashboard/pending-vouches (moving to /network)720general— (list fills)
/settings · /alerts · /proposals/[id] · /trips/[bookingId] · /vouch · /help · /settings/hosting · /hosting/create780–880general
/proposals · /profile/[id] · /hosting/listings/[id]/edit · /faqs · /listings/[id]960–1280wide
/inbox · /dashboard1600app-shell
Loren’s ask: want to see this in the browser before committing. M3 build session should produce a side-by-side review (before/after on 3–4 representative pages) at the end.

7 · Build sequencing — revised

Multi-session workstream. Each session runs autonomously — no mid-flight check-ins. Surface ONE comprehensive review at the end of each session, with side-by-side proofs on key surfaces. M1 + M3 are lowest-risk and go first.

Operating mode: the build agent makes design and naming calls itself, documents them in the recap, and ships a Cowork-style review checklist when done. No "should I do A or B?" pings.
SessionScopeRisk
M1 · Menu IA refactorUpdate nav-items.tsx with new groups. Rewire mobile-nav to consume NAV_GROUPS. Rename Wishlists → Saved. Replace Profile row icon with avatar.low
M2 · /network page buildReuse NetworkSection + PendingVouchesList. Add hero + “New invite” CTA. Delete /dashboard/network redirect file. Strip network tab from /dashboard.medium
M3 · Page-shell standardizationAdd <PageShell> primitive. Refactor pages per the bucketing table. Includes the pending-invites design pass.low
M4 · Help consolidationMove HelpContactForm into the canonical page. Redirect the dead route. Update both menu links.low
M5 · Dashboard cleanupDrop traveling + proposals tabs. Drop legacy redirect files. /dashboard is hosting-only.medium