Conversation sharing is supported
Why it matters
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.
Severity rationale
Low because sharing is a growth accelerant rather than a core workflow blocker.
Remediation
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}`)
Detection
-
ID:
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
sharedorpublicflag on conversation records in the database schema, or a dedicatedconversation_sharestable. Check fornavigator.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") }
Taxons
History
- 2026-04-18·v1.0.0·Initial import from ai-ux-patterns·automated