Open-source in-app support
Customers chat with you from your iOS, Android or Flutter app. Your team answers from a web dashboard or from the app itself. Messages, photos and pushes live in your Firebase project, with no Clayver server in between.
How it works
The setup CLI deploys security rules and Cloud Functions to your Firebase project. The SDKs and the dashboard talk to it directly.
conversations/{id}photos, ≤ 300 KiBclayverSetAgentRole…uid, clayver_rolesnpm start, Firebase Hosting or Docker.Clayver servers in the path: none. Your customer data never leaves your project.
Features
Live messages, history paging, read receipts and unread counts, with several conversations per customer.
openChat() · openNewConversation()Customers and agents send photos. Every SDK and the dashboard compress them before upload.
JPEG ≤ 300 KiBIn both directions, across several devices per user. Tapping one opens the right conversation.
APNs + FCM, token refresh handledStaff with an agent role tap “Switch to support agent” in the same chat screen and get the team inbox.
clayver_roles claimPriority, status and your own tags on every conversation, with inbox filters. Rename or reorder the choices in Settings.
high · medium · low / to do · in progress · on holdInternal notes stay with agents and are never pushed. Saved replies are shared across the team.
hidden from customers by the rulesClayver follows your app’s signed-in user. Guests get an anonymous account you can switch off.
customer id = Firebase uidAgents block abusive customers. Functions apply temporary blocks automatically.
30 messages/min · 10 conversations/hourHandle GDPR requests and App Store account deletion from the SDK or the dashboard.
deleteCustomerData()Install
The chat screens are native: SwiftUI on iOS, Jetpack Compose on Android. The Flutter plugin calls into them, so there is no messaging logic in Dart.
import ClayverSDK // At launch. Clayver follows your Firebase Auth user. try await Clayver.configure() // Optional context your agents will see try await Clayver.setUserProperties(["plan": "pro"]) // Conversation list, or a new chat over it Clayver.openChat()
// Application.onCreate, inside a coroutine Clayver.configure(this, ClayverOptions(projectId = "default")) Clayver.setPushToken(FirebaseMessaging.getInstance().token.await()) // Optional context your agents will see Clayver.setUserProperties(mapOf("plan" to "pro")) // Opens ClayverChatActivity Clayver.openChat(context)
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await Clayver.configure(); // Optional context your agents will see await Clayver.setUserProperties({'plan': 'pro'}); // Native SwiftUI / Compose screens Clayver.openChat();
Get started
npx clayver init detects your app, deploys the rules and functions, wires up push and writes an example.
Call configure() at launch and openChat() from a help button.
Grant a role with npx clayver admin grant --email or from the dashboard’s Team page, then answer from the web or the app.