
In-app support chat backed by Supabase, real-time messages, media, emoji reactions, swipe-to-reply quotes, shared conversation state with agent console, and anonymous client sign-in.
In-app support chat for Kotlin/Compose Multiplatform (Android · iOS · web) over a dedicated Supabase backend. Pairs with the multi-app Support Console (agent side): both read/write the same tables, so users and agents see one conversation state — messages, media, emoji reactions, and swipe-to-reply quotes.
// build.gradle.kts
commonMain.dependencies {
implementation("io.github.xemb0:supportchat:1.0.0")
}
// + a Ktor engine: okhttp (android) / darwin (ios) / js (web)single {
SupportChatConfig(
appId = "yourapp", // registered in the support console
accent = Color(0xFF7C3AED),
currentUserId = { yourAuth.userId() },
userName = { yourAuth.displayName() },
userEmail = { yourAuth.email() },
userAvatarUrl = { yourAuth.photoUrl() }, // shows in the console
extraMeta = { mapOf("device" to deviceLabel, "os" to osLabel, "app_version" to version) },
)
}
single<SupportChatRepository> { SupabaseSupportChatRepository(createSupportBackendClient(), get()) }
viewModel { SupportChatViewModel(get(), get()) }Then render SupportChatRoot(onBack = …) anywhere, or SupportUnreadViewModel
for the unread badge.
PGRST205) —
surfaced as "support not available yet", never a crash.message_reactions / message_quotes);
social fetches are best-effort and never hide messages.MIT licensed.
In-app support chat for Kotlin/Compose Multiplatform (Android · iOS · web) over a dedicated Supabase backend. Pairs with the multi-app Support Console (agent side): both read/write the same tables, so users and agents see one conversation state — messages, media, emoji reactions, and swipe-to-reply quotes.
// build.gradle.kts
commonMain.dependencies {
implementation("io.github.xemb0:supportchat:1.0.0")
}
// + a Ktor engine: okhttp (android) / darwin (ios) / js (web)single {
SupportChatConfig(
appId = "yourapp", // registered in the support console
accent = Color(0xFF7C3AED),
currentUserId = { yourAuth.userId() },
userName = { yourAuth.displayName() },
userEmail = { yourAuth.email() },
userAvatarUrl = { yourAuth.photoUrl() }, // shows in the console
extraMeta = { mapOf("device" to deviceLabel, "os" to osLabel, "app_version" to version) },
)
}
single<SupportChatRepository> { SupabaseSupportChatRepository(createSupportBackendClient(), get()) }
viewModel { SupportChatViewModel(get(), get()) }Then render SupportChatRoot(onBack = …) anywhere, or SupportUnreadViewModel
for the unread badge.
PGRST205) —
surfaced as "support not available yet", never a crash.message_reactions / message_quotes);
social fetches are best-effort and never hide messages.MIT licensed.