diff --git a/.planning/phases/18-app-shell-navigation/18-RESEARCH.md b/.planning/phases/18-app-shell-navigation/18-RESEARCH.md
new file mode 100644
index 0000000..ee8254d
--- /dev/null
+++ b/.planning/phases/18-app-shell-navigation/18-RESEARCH.md
@@ -0,0 +1,547 @@
+# Phase 18: App Shell & Navigation - Research
+
+**Researched:** 2026-05-17
+**Domain:** Go/templ authenticated shell — sidebar rebuild + top header bar
+**Confidence:** HIGH
+
+---
+
+
+## User Constraints (from CONTEXT.md)
+
+### Locked Decisions
+- **D-01:** Figma file: `https://www.figma.com/design/6z32tx1YhL3nJHlX6M4IA2/XTABLO-Design--bbellev---copie-?node-id=11013-36540`
+- **D-02:** Screenshots in `screenshots/` at repo root (Homepage.png, Board.png). Planner/executor MUST read screenshots before making visual decisions.
+- **D-03:** Top header bar — three zones: Left = breadcrumb, Center = search placeholder, Right = bell/inbox/avatar
+- **D-04:** `AppLayout` gets `pageTitle string` and `[]BreadcrumbItem{label, href}` params. Every handler call site sets its own breadcrumb.
+- **D-05:** `AppLayout` gets `headerActions templ.Component` slot. Phase 18 passes nil.
+- **D-06:** Avatar dropdown: workspace name + member count, members list, settings link `/settings`, logout button (red text). No theme toggle.
+- **D-07:** Full HTML/CSS rebuild to Figma spec. Phase 15 structure is replaced, not patched.
+- **D-08:** Nav sections: GENERAL label (Home, My Tasks, Projects, Events, Team Members) + PROJECTS label (tablo list). Chat and Files removed from primary nav.
+- **D-09:** Sidebar collapse via JS toggling `is-collapsed` class. No server round-trip. No persistence.
+
+### Claude's Discretion
+- Avatar dropdown implementation mechanism (no Alpine.js).
+- Exact CSS class naming for the new header bar components (follow `.dashboard-*` / `.sidebar-*` convention).
+- Whether `BreadcrumbItem` is a struct or a simple string slice.
+
+### Deferred Ideas (OUT OF SCOPE)
+- Sidebar collapse persistence via cookie (v5.0 RESP-01)
+- Sidebar responsive collapse on mobile (v5.0 RESP-01)
+- Search functionality (future phase)
+- Notifications / Inbox wiring (future phase)
+- Settings page full implementation (future phase)
+
+
+
+## Phase Requirements
+
+| ID | Description | Research Support |
+|----|-------------|------------------|
+| NAV-01 | User sees a redesigned sidebar/nav bar matching Figma (brand section, icon nav items, tablo list section, user footer) | Sidebar CSS token inventory, call site audit, `sidebarPrimaryNavItems` restructuring |
+| NAV-02 | User sees a per-page top header bar with page title and contextual action buttons matching Figma | `AppLayout` signature extension, new `.page-header` CSS block, `BreadcrumbItem` struct design |
+
+
+---
+
+## Summary
+
+Phase 18 rebuilds the authenticated app shell from a single-column sidebar layout into a two-part shell: a redesigned sidebar (new section labels, updated nav items, collapse toggle) and a new per-page top header bar (breadcrumb, search placeholder, right-side icons, avatar dropdown).
+
+The scope is narrow but affects every authenticated page simultaneously because `AppLayout` in `backend/templates/app_layout.templ` is the single render root for all authenticated routes. There are **5 direct `AppLayout` call sites** across 4 templ files, plus the `TabloDetailPage` template which wraps `AppLayout` and is called by 5 additional handlers. The signature change propagates mechanically — every call site must add `pageTitle` and `breadcrumb` arguments.
+
+The CSS source of truth is `backend/internal/web/ui/app.css`. It is imported into `tailwind.css` via `backend/tailwind.input.css`. New header bar CSS goes into `app.css`, keeping the same section-comment pattern already established there. The compiled `tailwind.css` is regenerated from `tailwind.input.css` — never edited by hand.
+
+**Primary recommendation:** Implement Phase 18 in 3 plans: (1) `AppLayout` signature + `BreadcrumbItem` struct + all call sites updated, (2) sidebar HTML/CSS full rebuild to Figma, (3) top header bar HTML/CSS + avatar dropdown + collapse JS.
+
+---
+
+## Screenshot Analysis
+
+### Homepage.png (read as image)
+
+**Sidebar (left column, ~220px wide):**
+- Top: XTablo logo (circular/rounded icon) + "XTablo" text, centered vertically
+- Section label "GENERAL" in small caps, muted, above the nav list
+- Nav items with icons + labels: Home (active, highlighted), My Tasks, Projects, Events, Team Members
+- Section label "PROJECTS" above a list of tablo entries (colored dot + name)
+- Each tablo: small colored circle on left, project name, "..." overflow button on right
+- Bottom: workspace entry "Creative Cloud" with a small avatar icon and "..." overflow
+- Sidebar background is a light elevated surface; active item has a soft blue/brand fill
+
+**Top header bar (spans full content area width):**
+- Left zone: Page title "Good Afternoon, Jhon!" with date subtitle "Tuesday, January 5"
+- Center zone: Search input with magnifier icon and placeholder text
+- Right zone: Bell icon, "Inbox" label with count badge, avatar circle
+
+**Content area:** Project grid + tasks list. The header bar sits above this content with a thin separator or padding.
+
+### Board.png (read as image)
+
+**Breadcrumb pattern visible:**
+- Header bar left zone shows: "Dashboard > Project Details" — two levels, separated by `>`
+- Center: search input (same as homepage)
+- Right: same bell/inbox/avatar cluster
+
+**Sidebar state:** Same structure, "Digital Marketing..." tablo is highlighted in the PROJECTS section.
+
+**Key visual observations:**
+- The header bar is visually flush with the top of the main content column, NOT a separate stripe above everything. It appears as padding/section inside `dashboard-main`.
+- The avatar dropdown is not visible open in the screenshots — must be inferred from D-06 spec.
+- The sidebar `is-collapsed` state is not shown — only the expanded state.
+
+---
+
+## Architectural Responsibility Map
+
+| Capability | Primary Tier | Secondary Tier | Rationale |
+|------------|-------------|----------------|-----------|
+| Sidebar HTML/CSS structure | Frontend Server (SSR/templ) | — | Rendered server-side by `DashboardSidebar` component |
+| Header bar HTML/CSS structure | Frontend Server (SSR/templ) | — | New templ component inside `AppLayout` |
+| BreadcrumbItem data | Frontend Server (SSR/templ) | API (handler) | Struct lives in templates package; handlers supply values |
+| Avatar dropdown interaction | Browser / Client | — | Needs JS toggle; no server round-trip required |
+| Sidebar collapse toggle | Browser / Client | — | D-09: JS toggles `is-collapsed`, no persistence |
+| Logout action | API / Backend | Browser | Existing POST `/logout` stays unchanged |
+| CSS tokens | Frontend Server (SSR/templ) | — | `app.css` → `tailwind.input.css` → compiled `tailwind.css` |
+
+---
+
+## Current Code Inventory
+
+### AppLayout Signature (current, Phase 15)
+
+```go
+// backend/templates/app_layout.templ line 153
+templ AppLayout(title string, user *auth.User, csrfToken string, activePath string, tablos []sqlc.Tablo)
+```
+
+Parameters:
+1. `title string` — HTML `
` content
+2. `user *auth.User` — provides `Email` for avatar initial
+3. `csrfToken string` — passed to logout form via `ui.CSRFField`
+4. `activePath string` — drives `sidebarNavItemClass` active state
+5. `tablos []sqlc.Tablo` — list of tablos for `SidebarProjectsSection`
+
+**New signature after Phase 18:**
+```go
+templ AppLayout(
+ title string,
+ user *auth.User,
+ csrfToken string,
+ activePath string,
+ tablos []sqlc.Tablo,
+ pageTitle string,
+ breadcrumb []BreadcrumbItem,
+ headerActions templ.Component,
+)
+```
+
+### Direct AppLayout Call Sites
+
+[VERIFIED: grep of backend/templates/ *.templ]
+
+| File | Template function | Call count |
+|------|------------------|------------|
+| `backend/templates/tablos.templ` | `TablosDashboard` | 1 (line 13) |
+| `backend/templates/tablos.templ` | `TabloDetailPage` | 2 (lines 242, 648) |
+| `backend/templates/planning.templ` | `PlanningPage` | 1 (line 9) |
+| `backend/templates/account_providers.templ` | `AccountProvidersPage` | 1 (line 9) |
+
+**Total direct `@AppLayout(...)` calls: 5** across 3 files.
+
+`TabloDetailPage` is itself called by handlers — its signature also needs `pageTitle`/`breadcrumb` threaded through from each handler invocation:
+- `handlers_tablos.go` calls `TabloDetailPage` at lines 225, 338
+- `handlers_discussion.go` at line 78
+- `handlers_files.go` at lines 106, 138
+- `handlers_events.go` at line 177
+
+**Total handler call sites that indirectly need updating: 5 handler call sites** (via `TabloDetailPage` signature).
+
+### Existing sidebarPrimaryNavItems (Phase 15)
+
+```go
+// backend/templates/app_layout_helpers.go line 47
+{Href: "/", Label: "Dashboard", Icon: "panels", Active: ..., DividerAfter: true},
+{Href: "", Label: "Tasks", Icon: "tasks", Active: false},
+{Href: "/planning",Label: "Planning", Icon: "planning", Active: ...},
+{Href: "", Label: "Chat", Icon: "chat", Active: false},
+{Href: "", Label: "Files", Icon: "files", Active: false},
+```
+
+**Phase 18 replacement per D-08:**
+- GENERAL section label
+- Home (`/`, icon: panels)
+- My Tasks (`/tasks`, no route yet — non-interactive or `href="#"`)
+- Projects (`/tablos`)
+- Events (`/planning`, existing route)
+- Team Members (no route — non-interactive)
+- PROJECTS section label (existing `SidebarProjectsSection` renamed/relabeled)
+- Chat and Files: removed from primary nav entirely
+
+### Existing CSS Token Names (sidebar/shell block)
+
+[VERIFIED: read of backend/internal/web/ui/app.css]
+
+Shell and sidebar classes currently defined:
+- `.dashboard-shell` — grid container (`grid-template-columns: minmax(16rem, 18rem) 1fr`)
+- `.dashboard-sidebar` — safe-area left padding
+- `.sidebar-nav-shell` — sticky column, flex column
+- `.sidebar-brand`, `.sidebar-brand-link`, `.sidebar-brand-logo`, `.sidebar-brand-title`
+- `.sidebar-collapse-button` — exists in CSS, currently unwired in HTML
+- `.sidebar-primary`, `.sidebar-list`, `.sidebar-divider`
+- `.sidebar-nav-item`, `.sidebar-nav-item.is-active`, `.sidebar-nav-link`, `.sidebar-nav-link-inner`
+- `.sidebar-nav-icon`, `.sidebar-nav-label`
+- `.sidebar-projects`, `.sidebar-section-label`, `.sidebar-project-list`
+- `.sidebar-project-link`, `.sidebar-project-icon`, `.sidebar-project-label`
+- `.sidebar-footer-links`, `.sidebar-organization`
+- `.organization-button`, `.organization-avatar`, `.organization-copy`, `.organization-name`, `.organization-meta`
+- `.dashboard-main` — flex column, `padding: 2rem`
+
+Design tokens in use: `var(--color-surface-elevated)`, `var(--color-border-panel)`, `var(--shadow-sidebar)`, `var(--color-text-muted)`, `var(--color-text-brand)`, `var(--overlay-brand-soft-strong)`, `var(--overlay-dark-soft)`, `var(--color-surface-muted-inverse)`, `var(--color-border-panel-muted)`, `var(--shadow-floating-control)`, `var(--color-surface-elevated-strong)`.
+
+**New classes needed for Phase 18 (header bar, to be added to app.css):**
+- `.page-header` — the top bar container (flex row, 3-zone layout)
+- `.page-header-left` — breadcrumb zone
+- `.page-header-center` — search placeholder zone
+- `.page-header-right` — bell/inbox/avatar cluster
+- `.breadcrumb`, `.breadcrumb-item`, `.breadcrumb-separator`
+- `.header-avatar-button` — clickable avatar in header
+- `.header-avatar-dropdown`, `.header-avatar-dropdown.is-open` — dropdown panel
+- `.header-search-placeholder` — styled but non-functional input shell
+- `.is-collapsed` modifier on `.dashboard-sidebar` (for collapse toggle)
+- Collapsed state rules: `.dashboard-shell.sidebar-is-collapsed` adjusts `grid-template-columns`
+
+### CSS File Target
+
+[VERIFIED: read of backend/tailwind.input.css]
+
+The build pipeline is:
+```
+tailwind.input.css
+ @import "tailwindcss"
+ @import "./internal/web/ui/app.css" ← sidebar/shell CSS lives here
+ → compiled to → backend/static/tailwind.css
+```
+
+The existing sidebar block lives in `backend/internal/web/ui/app.css` (confirmed by file header comment "app.css — dashboard shell, sidebar, and project-card CSS"). All new Phase 18 CSS (header bar, breadcrumb, avatar dropdown, collapse state) belongs in `backend/internal/web/ui/app.css`, not in `tailwind.css` directly. `tailwind.css` is a compiled artifact.
+
+### auth.User Struct
+
+[VERIFIED: read of backend/internal/auth/types.go]
+
+```go
+type User struct {
+ ID uuid.UUID
+ Email string
+ PasswordHash pgtype.Text
+ CreatedAt time.Time
+ UpdatedAt time.Time
+}
+```
+
+Only `Email` is available for avatar display. There is no `Name`, `DisplayName`, or `AvatarURL` field. The initial letter from `Email` (already used in `SidebarOrganizationFooter`) is the only avatar content possible. The avatar dropdown workspace name must come from the email or a placeholder — there is no `Workspace` or `Organization` entity in the current `User` struct.
+
+---
+
+## Architecture Patterns
+
+### System Architecture Diagram
+
+```
+HTTP request
+ |
+ v
+chi router (authenticated middleware)
+ |
+ v
+Handler (e.g., TablosDashboard)
+ - resolves user, csrfToken, activePath, tablos
+ - resolves pageTitle, breadcrumb []BreadcrumbItem ← NEW
+ |
+ v
+templ template call:
+ TablosDashboard(user, csrfToken, activePath, tablos,
+ "Dashboard", []BreadcrumbItem{{...}}, nil)
+ |
+ v
+AppLayout(title, user, csrfToken, activePath, tablos,
+ pageTitle, breadcrumb, headerActions) ← NEW PARAMS
+ |
+ +---> DashboardSidebar (rebuilt, D-07)
+ | +---> SidebarBrandSection
+ | +---> SidebarNavSection ("GENERAL" label + items)
+ | +---> SidebarProjectsSection ("PROJECTS" label + tablos)
+ | +---> collapse