Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)

    Documentation

    Concepts, value, and typical clone scenarios — less code.

    Welcome to Ring
    Quick Reference
    Getting Started
    Prerequisites
    Installation
    First Success Validation
    Next Steps
    Features
    Multi-Vendor Store
    Inventory & Stock
    Vendor Management
    Commissions & Settlements
    SubscriptionConductor
    PaymentConductor
    Ring Oracle
    Payments Overview
    Public Pools & DAO Jars
    WayForPay Payment Integration
    Wallet & Credit System
    WalletConductor
    Affiliate & Referral Enablement
    Referral Codes (Refcodes)
    NFT Exhibition Marketplace
    Solana NFT Gates
    Token Staking System
    Owner Project Lab
    Entities
    Opportunities
    Real-Time Messaging
    Ring Tasks
    WebRTC Calls & STUNner TURN
    Peer Games
    News Module
    Member Blogs
    Public Profile Pages
    Profile Account Widgets
    Ring File Cabinet
    Username Reservation System
    Scientific Editor
    Notifications
    Push Notifications with FCM (Ring-Powered)
    Email AI-CRM
    Ring Mailer & RingdomX Mail
    Tunnel Protocol
    VideoConductor
    MediaConductor
    Generative Gallery
    Authentication
    Security & Compliance
    Admin console
    Admin Wiki
    Manage via Telegram
    Locale System
    Mobile Experience
    Performance Optimization Patterns
    Examples
    Quick Start
    Basic Setup
    White Label
    Custom Branding
    Web3 Integration
    Real World
    Advanced Features
    Customization
    Quick Start — Your First Ring Clone
    Customization Guide
    Vertical Presets (SSOT)
    Ringization playbook
    Branding
    Themes
    Features
    Localization
    Token Economics Setup
    Payment Gateway Integration
    Reference Ring deployments
    Project configuration
    Public environment variables
    Order Lab secrets
    WalletConnect Project ID (Reown Cloud)
    Supported services
    NODUS wiki (project knowledge)
    Configuration playbook
    Web3
    Token launch jurisdictions
    Wallet
    Wallet Security Tips
    Integrations
    Ethereum wallets (Wagmi v3)
    RingFileBase (object storage API)
    Ring CDN (RingFileBase edge)
    Deployment
    Self-hosted deployment
    Vercel Deployment
    Docker
    Environment Configuration
    Monitoring & Analytics
    Performance Optimization
    Backup & Recovery
    Architecture
    Data Model
    Security
    Real Time
    Discovery Mutation Sync
    PaymentConductor architecture
    WalletConductor architecture
    Backend Services
    Firebase Integration
    Development
    Ring MCP Server

    Quick entry (CTOs · auditors · agents)

    Welcome — mission & audiences
    Quick Reference
    Getting started
    Architecture & Auth.js
    Backend modes & databases (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Security & compliance reads
    ringdom.org — LegioX homebase
    Source — MIT license (GitHub)
    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Ring Platform Logo

    Loading documentation...

    Preparing Ring Platform content

    Real-Time Messaging

    Use Founder / Developer tabs in the docs sidebar to filter this page. This article is the SSOT for Conversation.type (channel) vs metadata.kind (subtype) and inbox hygiene for tool chats.

    Ring messaging combines REST conversations with Tunnel Protocol fan-out so members chat in context of opportunities, entities, and store deals without refreshing the page.

    LayerWhere
    RESTapp/api/conversations/**
    RealtimeTunnel channels conversation:{id} — see Tunnel Protocol
    UIfeatures/chat, features/messages
    Typesfeatures/chat/types/index.ts
    API referenceMessaging API

    Channel vs subtype (shared)

    Ring does not invent a new top-level conversation type for every feature. Two layers stay separate:

    FieldMeaningExample
    Conversation.typeChannel / domain routing — where the thread lives in the messaging systemdirect, entity, opportunity, product, group
    metadata.kindOptional subtype within that channelgenerative_gallery
    metadata.hiddenFromInboxInbox contract — hide from Messages listtrue for tool editors

    Verified channel enum (TypeScript + create zod in app/api/conversations/route.ts):

    direct | entity | opportunity | product | group

    Do not add type: 'generative'. Generative Gallery reuses type: 'product' plus kind: 'generative_gallery' and hiddenFromInbox: true. Extending the channel enum for one feature breaks product lookup helpers and invents parallel plumbing.

    Same product channel, different visibility:

    UsetypeMetadata highlightsMessages inbox
    Store product agent (DAGI)productreal productId, no tool kindVisible
    Generative Gallery tool chatproductkind: 'generative_gallery', hiddenFromInbox: true, productId/subject = genmedia:…Hidden

    Conversation metadata.kind is not the same namespace as message metadata.kind (e.g. payment_request, env_request, task, poll, rsvp, dao_jar, share_card, gallery_upload, ghost_write_result, game_request).

    Interactive types share one lifecycle kit (features/chat/lib/interactive-kind.ts + bubble registry + notify helper): server-action create → dual-gate widget (type OR metadata.kind) → updateMessage / tunnel message:update → typed notify. Domain owns money for dao_jar via public-pools: native treasury chip-in (contributeToPool) and card/PayPal (public_pool_contribution → desk-oracle FX). Chat owns the snapshot — always refreshOpenDaoJarMessages after totals change. share_card reuses MESSAGE_RECEIVED + data.kind. Tier A interactive UX is remediated (2026-07-21); see Public Pools & DAO Jars.

    Peer games add game_request (allowlisted in interactive-kind.ts): session SSOT in PeerGameService.createInvite, Tunnel game:invite / games:incoming (incl. terminal clear), and IncomingGameBanner on Messages + /games. Titles: tic-tac-toe · chess · checkers. Direct conversations only. See Peer Games.

    Structured work inside a thread: Ring Tasks (type: 'task' + /tasks tree).

    Why messaging matters for your clone

    Instant conversation shortens the path from match → trust → deal. Members stay inside your Ring instead of dropping to email or third-party chat. Tool editors (image generation history) stay out of the main inbox so operators are not flooded with system threads.

    Tunnel Protocol

    How live updates reach the browser (WSS / SSE / poll).

    Generative Gallery

    Upload | Generate media — history in a hidden product-tool chat.

    WebRTC Calls & STUNner

    1:1 audio/video in direct chats — ICE + TURN.

    Messaging API

    Implementation

    Verified routes

    MethodPathRole
    GET, POST/api/conversationsList / create conversations
    GET/api/conversations/[id]Conversation detail
    POST/api/conversations/[id]/typingTyping signal
    POST/api/conversations/[id]/readMark read
    POST/api/conversations/uploadAttachment upload
    MCP

    Related

    Related documentation

    Tunnel Protocol

    Depends-on: live message and jar updates publish on conversation tunnel channels.

    Public Pools & DAO Jars

    Same-workflow: dao_jar money, dual-currency contribute, and jar refresh after chip-in.

    Generative Gallery

    See-also: product-channel tool chats stay hidden from the Messages inbox.

    Multi-Vendor Store

    See-also: product agent chats share type product but stay inbox-visible.

    Real-Time Messaging

    Use Founder / Developer tabs in the docs sidebar to filter this page. This article is the SSOT for Conversation.type (channel) vs metadata.kind (subtype) and inbox hygiene for tool chats.

    Ring messaging combines REST conversations with Tunnel Protocol fan-out so members chat in context of opportunities, entities, and store deals without refreshing the page.

    LayerWhere
    RESTapp/api/conversations/**
    RealtimeTunnel channels conversation:{id} — see Tunnel Protocol
    UIfeatures/chat, features/messages
    Typesfeatures/chat/types/index.ts
    API referenceMessaging API

    Channel vs subtype (shared)

    Ring does not invent a new top-level conversation type for every feature. Two layers stay separate:

    FieldMeaningExample
    Conversation.typeChannel / domain routing — where the thread lives in the messaging systemdirect, entity, opportunity, product, group
    metadata.kindOptional subtype within that channelgenerative_gallery
    metadata.hiddenFromInboxInbox contract — hide from Messages listtrue for tool editors

    Verified channel enum (TypeScript + create zod in app/api/conversations/route.ts):

    direct | entity | opportunity | product | group

    Do not add type: 'generative'. Generative Gallery reuses type: 'product' plus kind: 'generative_gallery' and hiddenFromInbox: true. Extending the channel enum for one feature breaks product lookup helpers and invents parallel plumbing.

    Same product channel, different visibility:

    UsetypeMetadata highlightsMessages inbox
    Store product agent (DAGI)productreal productId, no tool kindVisible
    Generative Gallery tool chatproductkind: 'generative_gallery', hiddenFromInbox: true, productId/subject = genmedia:…Hidden

    Conversation metadata.kind is not the same namespace as message metadata.kind (e.g. payment_request, env_request, task, poll, rsvp, dao_jar, share_card, gallery_upload, ghost_write_result, game_request).

    Interactive types share one lifecycle kit (features/chat/lib/interactive-kind.ts + bubble registry + notify helper): server-action create → dual-gate widget (type OR metadata.kind) → updateMessage / tunnel message:update → typed notify. Domain owns money for dao_jar via public-pools: native treasury chip-in (contributeToPool) and card/PayPal (public_pool_contribution → desk-oracle FX). Chat owns the snapshot — always refreshOpenDaoJarMessages after totals change. share_card reuses MESSAGE_RECEIVED + data.kind. Tier A interactive UX is remediated (2026-07-21); see Public Pools & DAO Jars.

    Peer games add game_request (allowlisted in interactive-kind.ts): session SSOT in PeerGameService.createInvite, Tunnel game:invite / games:incoming (incl. terminal clear), and IncomingGameBanner on Messages + /games. Titles: tic-tac-toe · chess · checkers. Direct conversations only. See Peer Games.

    Structured work inside a thread: Ring Tasks (type: 'task' + /tasks tree).

    Why messaging matters for your clone

    Instant conversation shortens the path from match → trust → deal. Members stay inside your Ring instead of dropping to email or third-party chat. Tool editors (image generation history) stay out of the main inbox so operators are not flooded with system threads.

    Tunnel Protocol

    How live updates reach the browser (WSS / SSE / poll).

    Generative Gallery

    Upload | Generate media — history in a hidden product-tool chat.

    WebRTC Calls & STUNner

    1:1 audio/video in direct chats — ICE + TURN.

    Messaging API

    Implementation

    Verified routes

    MethodPathRole
    GET, POST/api/conversationsList / create conversations
    GET/api/conversations/[id]Conversation detail
    POST/api/conversations/[id]/typingTyping signal
    POST/api/conversations/[id]/readMark read
    POST/api/conversations/uploadAttachment upload
    MCP

    Related

    Related documentation

    Tunnel Protocol

    Depends-on: live message and jar updates publish on conversation tunnel channels.

    Public Pools & DAO Jars

    Same-workflow: dao_jar money, dual-currency contribute, and jar refresh after chip-in.

    Generative Gallery

    See-also: product-channel tool chats stay hidden from the Messages inbox.

    Multi-Vendor Store

    See-also: product agent chats share type product but stay inbox-visible.

    Real-Time Messaging

    Use Founder / Developer tabs in the docs sidebar to filter this page. This article is the SSOT for Conversation.type (channel) vs metadata.kind (subtype) and inbox hygiene for tool chats.

    Ring messaging combines REST conversations with Tunnel Protocol fan-out so members chat in context of opportunities, entities, and store deals without refreshing the page.

    LayerWhere
    RESTapp/api/conversations/**
    RealtimeTunnel channels conversation:{id} — see Tunnel Protocol
    UIfeatures/chat, features/messages
    Typesfeatures/chat/types/index.ts
    API referenceMessaging API

    Channel vs subtype (shared)

    Ring does not invent a new top-level conversation type for every feature. Two layers stay separate:

    FieldMeaningExample
    Conversation.typeChannel / domain routing — where the thread lives in the messaging systemdirect, entity, opportunity, product, group
    metadata.kindOptional subtype within that channelgenerative_gallery
    metadata.hiddenFromInboxInbox contract — hide from Messages listtrue for tool editors

    Verified channel enum (TypeScript + create zod in app/api/conversations/route.ts):

    direct | entity | opportunity | product | group

    Do not add type: 'generative'. Generative Gallery reuses type: 'product' plus kind: 'generative_gallery' and hiddenFromInbox: true. Extending the channel enum for one feature breaks product lookup helpers and invents parallel plumbing.

    Same product channel, different visibility:

    UsetypeMetadata highlightsMessages inbox
    Store product agent (DAGI)productreal productId, no tool kindVisible
    Generative Gallery tool chatproductkind: 'generative_gallery', hiddenFromInbox: true, productId/subject = genmedia:…Hidden

    Conversation metadata.kind is not the same namespace as message metadata.kind (e.g. payment_request, env_request, task, poll, rsvp, dao_jar, share_card, gallery_upload, ghost_write_result, game_request).

    Interactive types share one lifecycle kit (features/chat/lib/interactive-kind.ts + bubble registry + notify helper): server-action create → dual-gate widget (type OR metadata.kind) → updateMessage / tunnel message:update → typed notify. Domain owns money for dao_jar via public-pools: native treasury chip-in (contributeToPool) and card/PayPal (public_pool_contribution → desk-oracle FX). Chat owns the snapshot — always refreshOpenDaoJarMessages after totals change. share_card reuses MESSAGE_RECEIVED + data.kind. Tier A interactive UX is remediated (2026-07-21); see Public Pools & DAO Jars.

    Peer games add game_request (allowlisted in interactive-kind.ts): session SSOT in PeerGameService.createInvite, Tunnel game:invite / games:incoming (incl. terminal clear), and IncomingGameBanner on Messages + /games. Titles: tic-tac-toe · chess · checkers. Direct conversations only. See Peer Games.

    Structured work inside a thread: Ring Tasks (type: 'task' + /tasks tree).

    Why messaging matters for your clone

    Instant conversation shortens the path from match → trust → deal. Members stay inside your Ring instead of dropping to email or third-party chat. Tool editors (image generation history) stay out of the main inbox so operators are not flooded with system threads.

    Tunnel Protocol

    How live updates reach the browser (WSS / SSE / poll).

    Generative Gallery

    Upload | Generate media — history in a hidden product-tool chat.

    WebRTC Calls & STUNner

    1:1 audio/video in direct chats — ICE + TURN.

    Messaging API

    Implementation

    Verified routes

    MethodPathRole
    GET, POST/api/conversationsList / create conversations
    GET/api/conversations/[id]Conversation detail
    POST/api/conversations/[id]/typingTyping signal
    POST/api/conversations/[id]/readMark read
    POST/api/conversations/uploadAttachment upload
    MCP

    Related

    Related documentation

    Tunnel Protocol

    Depends-on: live message and jar updates publish on conversation tunnel channels.

    Public Pools & DAO Jars

    Same-workflow: dao_jar money, dual-currency contribute, and jar refresh after chip-in.

    Generative Gallery

    See-also: product-channel tool chats stay hidden from the Messages inbox.

    Multi-Vendor Store

    See-also: product agent chats share type product but stay inbox-visible.

    Integrator contracts for conversations and typing.

    Typical scenarios

    • Two matched professionals open a direct conversation from an opportunity — it appears in Messages.
    • A buyer asks a store product agent a question — that product chat stays visible in Messages.
    • A vendor or member generates NFT/product art in Generative Gallery — history lives in a hidden tool chat, not the inbox.
    • Typing indicators and read state keep negotiations moving on mobile PWA.
    /api/mcp/v1/messaging/conversations
    Agent tooling

    After writes, publish on Tunnel channel conversation:{id} via publishToChannel — clients subscribe with useTunnelChannel (not raw useTunnel().subscribe() in effects).

    Create body type must be one of: direct | entity | opportunity | product | group (z.enum in app/api/conversations/route.ts). Optional metadata includes productId, groupName, kind, hiddenFromInbox, and domain ids (entityId, opportunityId, …).

    Inbox hide contract

    ConversationService.getConversations skips rows where isHiddenToolConversation is true (features/chat/services/conversation-service.ts):

    1. metadata.hiddenFromInbox === true (preferred long-term gate)
    2. metadata.kind === 'generative_gallery'
    3. Legacy: productId or subject starts with genmedia: or imggen:

    Modules

    PathResponsibility
    features/chat/types/index.tsConversation, CreateConversationRequest, filters
    features/chat/services/conversation-service.tsCRUD + isHiddenToolConversation
    features/chat/, features/messages/Chat UI
    features/generative-media/service.tsCreates hidden product + generative_gallery chats
    features/store/services/product-agent-service.tsCreates visible product agent chats
    lib/tunnel/Hub, publisher, transports
    hooks/use-tunnel-channel.tsStable channel subscribe

    Transports

    • k8s / self-hosted: native WSS /api/tunnel/ws primary
    • Vercel: SSE + long-poll (/api/tunnel/poll)
    • Optional Supabase Realtime when configured

    Full endpoint samples: Messaging API. Architecture: Real-time.

    WebRTC Calls & STUNner TURN

    Next-step: 1:1 audio/video in direct chats.

    Peer Games

    Same-workflow: game_request interactive type, IncomingGameBanner, and call/game mutex.

    Messaging API

    Deep-dive: REST + tunnel contracts for conversations.

    Push Notifications with FCM (Ring-Powered)

    Next-step: reach members when the tab is closed.

    Integrator contracts for conversations and typing.

    Typical scenarios

    • Two matched professionals open a direct conversation from an opportunity — it appears in Messages.
    • A buyer asks a store product agent a question — that product chat stays visible in Messages.
    • A vendor or member generates NFT/product art in Generative Gallery — history lives in a hidden tool chat, not the inbox.
    • Typing indicators and read state keep negotiations moving on mobile PWA.
    /api/mcp/v1/messaging/conversations
    Agent tooling

    After writes, publish on Tunnel channel conversation:{id} via publishToChannel — clients subscribe with useTunnelChannel (not raw useTunnel().subscribe() in effects).

    Create body type must be one of: direct | entity | opportunity | product | group (z.enum in app/api/conversations/route.ts). Optional metadata includes productId, groupName, kind, hiddenFromInbox, and domain ids (entityId, opportunityId, …).

    Inbox hide contract

    ConversationService.getConversations skips rows where isHiddenToolConversation is true (features/chat/services/conversation-service.ts):

    1. metadata.hiddenFromInbox === true (preferred long-term gate)
    2. metadata.kind === 'generative_gallery'
    3. Legacy: productId or subject starts with genmedia: or imggen:

    Modules

    PathResponsibility
    features/chat/types/index.tsConversation, CreateConversationRequest, filters
    features/chat/services/conversation-service.tsCRUD + isHiddenToolConversation
    features/chat/, features/messages/Chat UI
    features/generative-media/service.tsCreates hidden product + generative_gallery chats
    features/store/services/product-agent-service.tsCreates visible product agent chats
    lib/tunnel/Hub, publisher, transports
    hooks/use-tunnel-channel.tsStable channel subscribe

    Transports

    • k8s / self-hosted: native WSS /api/tunnel/ws primary
    • Vercel: SSE + long-poll (/api/tunnel/poll)
    • Optional Supabase Realtime when configured

    Full endpoint samples: Messaging API. Architecture: Real-time.

    WebRTC Calls & STUNner TURN

    Next-step: 1:1 audio/video in direct chats.

    Peer Games

    Same-workflow: game_request interactive type, IncomingGameBanner, and call/game mutex.

    Messaging API

    Deep-dive: REST + tunnel contracts for conversations.

    Push Notifications with FCM (Ring-Powered)

    Next-step: reach members when the tab is closed.

    Integrator contracts for conversations and typing.

    Typical scenarios

    • Two matched professionals open a direct conversation from an opportunity — it appears in Messages.
    • A buyer asks a store product agent a question — that product chat stays visible in Messages.
    • A vendor or member generates NFT/product art in Generative Gallery — history lives in a hidden tool chat, not the inbox.
    • Typing indicators and read state keep negotiations moving on mobile PWA.
    /api/mcp/v1/messaging/conversations
    Agent tooling

    After writes, publish on Tunnel channel conversation:{id} via publishToChannel — clients subscribe with useTunnelChannel (not raw useTunnel().subscribe() in effects).

    Create body type must be one of: direct | entity | opportunity | product | group (z.enum in app/api/conversations/route.ts). Optional metadata includes productId, groupName, kind, hiddenFromInbox, and domain ids (entityId, opportunityId, …).

    Inbox hide contract

    ConversationService.getConversations skips rows where isHiddenToolConversation is true (features/chat/services/conversation-service.ts):

    1. metadata.hiddenFromInbox === true (preferred long-term gate)
    2. metadata.kind === 'generative_gallery'
    3. Legacy: productId or subject starts with genmedia: or imggen:

    Modules

    PathResponsibility
    features/chat/types/index.tsConversation, CreateConversationRequest, filters
    features/chat/services/conversation-service.tsCRUD + isHiddenToolConversation
    features/chat/, features/messages/Chat UI
    features/generative-media/service.tsCreates hidden product + generative_gallery chats
    features/store/services/product-agent-service.tsCreates visible product agent chats
    lib/tunnel/Hub, publisher, transports
    hooks/use-tunnel-channel.tsStable channel subscribe

    Transports

    • k8s / self-hosted: native WSS /api/tunnel/ws primary
    • Vercel: SSE + long-poll (/api/tunnel/poll)
    • Optional Supabase Realtime when configured

    Full endpoint samples: Messaging API. Architecture: Real-time.

    WebRTC Calls & STUNner TURN

    Next-step: 1:1 audio/video in direct chats.

    Peer Games

    Same-workflow: game_request interactive type, IncomingGameBanner, and call/game mutex.

    Messaging API

    Deep-dive: REST + tunnel contracts for conversations.

    Push Notifications with FCM (Ring-Powered)

    Next-step: reach members when the tab is closed.

    1. Docs
    2. /Features
    3. /Real-Time Messaging

    Updated Jul 24, 20265 min listen

    1. Docs
    2. /Features
    3. /Real-Time Messaging

    Updated Jul 24, 20265 min listen

    1. Docs
    2. /Features
    3. /Real-Time Messaging

    Updated Jul 24, 20265 min listen