When every session starts from an empty chat and old conversations either disappear or live in one flat scroll-list, users stop building on prior work. The conversation archive is the product's long-term memory and compounding value; without search, folders, or at minimum date grouping, that archive becomes write-only — users keep typing into it but never read back. Competitors with proper history UX retain users on the strength of accumulated context alone.
High because it caps product value at single-session utility and kills long-term retention.
Ship a sidebar that lists conversations in reverse chronological order grouped by Today / Yesterday / Last 7 days / Older, with a top-of-sidebar search input hitting /api/conversations/search?q=. Auto-title conversations from the first user message. Implement the sidebar at src/components/chat/conversation-sidebar.tsx.
<Input placeholder="Search conversations..." onChange={e => setQuery(e.target.value)} />
ID: ai-ux-patterns.advanced-patterns.conversation-organization
Severity: high
What to look for: Count all organizational features in the conversation history UI: list view, search input, folders, tags, pinned conversations, date grouping. Enumerate each feature and verify it is functional. Check for search functionality within conversation history (text search input, search API route). At least 2 organizational features must be present (list + one of: search, folders, tags, pinning, date grouping).
Pass criteria: Past conversations are listed in an accessible history view. At minimum, conversations have titles and are listed in reverse chronological order. At least 2 organizational features must exist. Report even on pass: "X organizational features found in conversation history."
Fail criteria: No conversation history or list UI detected. Users can only see the current conversation and cannot access previous ones.
Skip (N/A) when: The application is intentionally single-session — conversations are not persisted between sessions by design. Signal: no conversation database table, no conversation ID in the URL, and no session persistence beyond the current browser tab.
Detail on fail: "No conversation history UI found. Conversations appear to be single-session — no persistence or list view detected.".
Remediation: Without conversation history, every session starts from zero. Most users expect to find their previous conversations.
Start with a simple sidebar list:
const { data: conversations } = useSWR('/api/conversations', fetcher)
<aside className="w-64 border-r flex flex-col">
<div className="p-3">
<Input placeholder="Search conversations..." onChange={handleSearch} />
</div>
<nav className="flex-1 overflow-y-auto">
{conversations?.map(conv => (
<Link
key={conv.id}
href={`/chat/${conv.id}`}
className="block px-3 py-2 text-sm hover:bg-accent truncate"
>
{conv.title ?? 'Untitled conversation'}
</Link>
))}
</nav>
</aside>