Shared conversations are one of the highest-leverage organic growth loops an AI product has — every shared link is both a demo of capability and a referral. ChatGPT's share feature, Claude's share feature, and Poe's share feature all exist because shared chats convert viewers to signups at rates that paid channels cannot match. Without a native share path, users screenshot their conversations (which loses formatting and the ability to continue) or switch to a competitor whose share link works.
Low because sharing is a growth accelerant rather than a core workflow blocker.
Add a share button that POSTs to /api/conversations/[id]/share, flips an is_public flag on the row, returns a slug, and copies ${origin}/share/${slug} to the clipboard. Gate the public read route on the flag and strip sensitive metadata on serialization. Implement the route at app/api/conversations/[id]/share/route.ts.
await navigator.clipboard.writeText(`${location.origin}/share/${slug}`)
ID: ai-ux-patterns.feedback-control.share-conversation
Severity: low
What to look for: Count all share-related UI controls: share buttons, copy-link actions, social sharing integrations. For each, enumerate whether it produces a working shareable URL. Look for a shared or public flag on conversation records in the database schema, or a dedicated conversation_shares table. Check for navigator.share() API usage or clipboard copy of a URL. A share button that only copies the page URL (not a conversation-specific link) does not count as pass.
Pass criteria: Users can generate a shareable link to a conversation or share via the native share API. At least 1 sharing mechanism must produce a conversation-specific URL.
Fail criteria: No sharing functionality found.
Skip (N/A) when: The application is single-user or operates in contexts where sharing is inherently inappropriate (e.g., a private therapy or journaling AI tool). Signal: no user authentication, or explicit privacy-first language in the codebase/copy.
Detail on fail: "No share button, shareable link generation, or public conversation URL pattern found".
Remediation: Sharing drives organic growth. A minimal implementation:
// API route: POST /api/conversations/:id/share
// Sets conversation.is_public = true, returns shareable slug
const handleShare = async () => {
const { shareUrl } = await fetch(`/api/conversations/${conversationId}/share`, {
method: 'POST'
}).then(r => r.json())
await navigator.clipboard.writeText(shareUrl)
toast("Share link copied to clipboard")
}