Jetpack Compose Expert
aldefy/compose-skill
Guides Jetpack Compose and Compose Multiplatform work across Android, Desktop, iOS and web, plus Android TV, Material 3 motion, paging, navigation and design-to-code.
Foundational rules for the CometChat Android UI Kit v6 — the two UI cohorts and their artifacts, credentials via the gitignored assets settings file, initFromSettings → login → render ordering, the…
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-core --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/cometchat-android-v6-core .claude/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .claude/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-coreType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-core --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/cometchat-android-v6-core .agents/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .agents/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-core --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/cometchat-android-v6-core .cursor/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .cursor/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cometchat/cometchat-skills.git --path skills/cometchat-android-v6-core--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-core --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/cometchat-android-v6-core .gemini/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .gemini/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-coreInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/cometchat-android-v6-core .github/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .github/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cometchat/cometchat-skills cometchat-android-v6-core --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cometchat/cometchat-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/cometchat-android-v6-core .opencode/skills/cometchat-android-v6-core && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "cometchat-android-v6-core" agent skill from https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-android-v6-core into .opencode/skills/cometchat-android-v6-core/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "cometchat-android-v6-core", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
cometchat-android-v6-coreFoundational rules for the CometChat Android UI Kit v6 — the two UI cohorts and their artifacts, credentials via the gitignored assets settings file, initFromSettings → login → render ordering, the…
Cometchat Android V6 Core is an agent skill from cometchat/cometchat-skills. Foundational rules for the CometChat Android UI Kit v6 — the two UI cohorts and their artifacts, credentials via the gitignored assets settings file, initFromSettings → login → render ordering, the component map, and the production-ready core chat surface. Read this first for any Android CometChat task. Triggers: CometChat Android setup, Kotlin chat UI kit, Jetpack Compose chat.
Its SKILL.md is about 5.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `references/anti-patterns.md`, `references/component-props.md` and `references/docs-map.md`). Compatibility notes: Android minSdk =28; compileSdk =36; Kotlin =2.1; AGP =8.9.1; JVM target 11; com.cometchat:chatuikit-kotlin-android ^6 (XML Views) OR…
It sits in Mobile, covering Android development and Design systems. It works with CometChat, Android, Kotlin and Jetpack Compose. The repository describes itself as: Add CometChat chat & messaging and voice & video calls to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with… The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 911b108. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
dl.cloudsmith.ioAlso links to:
cometchat.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
AUTH_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Android minSdk >=28; compileSdk >=36; Kotlin >=2.1; AGP >=8.9.1; JVM target 11; com.cometchat:chatuikit-kotlin-android ^6 (XML Views) OR com.cometchat:chatuikit-compose-android ^6 (Jetpack Compose) — 6.0.x, verified 6.0.5; com.cometchat:chat-sdk-android ^5 (5.0.x); optional com.cometchat:calls-sdk-android ^5
From compatibility in the SKILL.md frontmatter.
Cometchat Android V6 Core loads about 5.5k tokens when it runs, and up to ~21k if it reads all its reference files. Until then it costs about 102 tokens; SKILL.md has 1,525 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cometchat/cometchat-skills at commit 911b108, republished under its MIT licence (© cometchat). 1,525 words, ~5,473 tokens.
.claude/skills/cometchat-android-v6-core/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Ground truth:
com.cometchat:chatuikit-{kotlin,compose}-android@6+ catalogandroid-v6.json(287 public symbols, generated from the INSTALLED 6.0.5 source) +features.android-v6.json. Official docs: https://www.cometchat.com/docs/ui-kit/android/overview · scoped index…/ui-kit/android/llms-android-v6.md. Verify every symbol against the catalog; fetch signatures from docs (references/docs-map.md); never trust memory.⚠️ ONE kit, TWO cohorts.
chatuikit-kotlin-android(XML Views) andchatuikit-compose-android(Jetpack Compose) are different artifacts with different namespaces. Component NAMES are shared, the wiring is not — Views usessetOnX(...)setters, Compose usesonX =params. Never install both. v5 Java snippets do not compile against v6 (com.cometchat.chatuikit.*→com.cometchat.uikit.*); that migration iscometchat-android-v6-migration.⚠️ Some docs snippets are ahead of / behind the shipped kit. Where a baked signature here differs from a docs page, the baked one was verified against the installed 6.0.5 source (gap logged internally). Compile before you trust a docs fence.
<!-- core is the companion the other android v6 skills read; it has no Companion block of its own. -->
"add chat to my Android app", "set up CometChat credentials", "integrate CometChat in Kotlin/Compose", "show a conversations + messages screen", "build a chat app". An unscoped "add chat" means the production-ready core chat surface below — not a bare list, and not the whole tab-based app (that grows via cometchat-android-v6-{kotlin,compose}-placement).
Pick ONE cohort — the app's existing UI stack decides:
// settings.gradle.kts → dependencyResolutionManagement.repositories
maven("https://dl.cloudsmith.io/public/cometchat/cometchat/maven/")
// app/build.gradle.kts — repo/exclude/compileOptions are COHORT-NEUTRAL (the duplicate-class
// collision comes via chatuikit-core-android, which BOTH cohorts pull); only the artifact differs
configurations.all {
// REQUIRED — without it the first build fails at dexing with ~40
// "Duplicate class org.jetbrains.annotations.*" errors (docs getting-started-{kotlin,jetpack}).
exclude(group = "org.jetbrains", module = "annotations-java5")
}
// gradle.properties — REQUIRED, both lines (why: dexing dup-class; references/troubleshooting.md):
// android.useAndroidX=true android.enableJetifier=true
dependencies {
implementation("com.cometchat:chatuikit-kotlin-android:6.0.5")
// implementation("com.cometchat:calls-sdk-android:5.0.4") // only for voice/video
}
android {
buildFeatures { viewBinding = true }
compileOptions { sourceCompatibility = JavaVersion.VERSION_11; targetCompatibility = JavaVersion.VERSION_11 }
}
// JVM 11 (Kotlin 2.2+ rejects kotlinOptions{}). Fully-qualified: a mid-file .kts import won't compile.
kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_11) } }Theme kit views under a CometChatTheme.DayNight-derived theme — REQUIRED (Views), not cosmetic.
Kit views resolve ?attr/cometchat* at inflate time; outside such a theme the FIRST kit view crashes
(IllegalArgumentException/InflateException on ?attr/cometchatPrimaryColor — verified on device).
Greenfield → re-parent app-wide: <style name="AppTheme" parent="CometChatTheme.DayNight" /> +
<application android:theme="@style/AppTheme">. Brownfield (app HAS its own theme) → do NOT
re-parent (CometChatTheme.DayNight parents MaterialComponents, so Material3-only host attrs stop
resolving — you'd break their screens); scope a derived style to the chat Activities (manifest
android:theme) + ContextThemeWrapper for fragment/tab-embedded views — recipe: kotlin-placement Placement 2.
Compose cohort: swap the artifact for com.cometchat:chatuikit-compose-android:6.0.5 and use buildFeatures { compose = true } + the Kotlin Compose plugin. Build floors — all forced by the transitive androidx.core:core:1.18.0 and all failing with the SAME opaque checkDebugAarMetadata error, so bump them together: minSdk 28 · compileSdk 36 · AGP ≥ 8.9.1 · Gradle ≥ 8.11 · Kotlin ≥ 2.1 (exact error strings + fixes in -troubleshooting; verified on device). chatuikit-core-android and chat-sdk-android arrive transitively — never add the UI Kit twice, and never mix a v5 chat-uikit-android into the tree (version_conflict — STOP).
references/setup-credentials.md)npx @cometchat/skills detect --json
(or READ the gradle files). The signals are
android_variant ∈ compose · views · mixed · unknown (both Groovy and Kotlin DSL):
compose → use Compose, don't offer Views · views → use Views · mixed/unknown
→ ASK and WAIT (recommend Compose for greenfield). Announce the cohort and why before
writing code — the cohorts are different artifacts that must not coexist, so it is the one
choice the user cannot cheaply undo. If existing_cometchat is true, resolve version_conflict
FIRST (v4/v5 kit present ⇒ STOP + offer cometchat-android-v6-migration). Decision table +
signals: references/setup-credentials.md §1.npx @cometchat/skills-cli@3 auth login, provision list --json → ask which app, provision use --app-id <id> --json); or (b) manual paste from Dashboard → Your App → Credentials. Ask & wait — never guess.app/src/main/assets/cometchat-settings.json (the file initFromSettings reads) and gitignore it:{ "appId": "APP_ID", "region": "REGION", "credentials": { "authKey": "AUTH_KEY" },
"uiKit": { "subscribePresenceForAllUsers": true, "enableCalling": false } }⚠️
enableCalling: trueand the calls artifact go together or not at all — the flag withoutcom.cometchat:calls-sdk-androidcrashes the app at launch. Why and symptoms: docs getting-started-{kotlin,jetpack} + calling-integration. Leave the flagfalsein an app without calling.
appId + region required (else ERR_SETTINGS_INVALID); missing file → ERR_SETTINGS_FILE_NOT_FOUND. Auth Key is dev-only — omit it in release builds and log in with a server-minted token (cometchat-android-v6-production).
Docs warning, verbatim: "init() must resolve before you call login(). Calling login() before init completes will fail silently."
import com.cometchat.chat.core.CometChat
import com.cometchat.chat.exceptions.CometChatException
import com.cometchat.chat.models.User
import com.cometchat.uikit.core.CometChatUIKit
// initFromSettings reads assets/cometchat-settings.json, persists integrationSource="ai-agent"
// for telemetry attribution, and auto-inits the Calls SDK when uiKit.enableCalling is true.
// Do NOT default to the classic UIKitSettingsBuilder + init() — it loses attribution.
CometChatUIKit.initFromSettings(this, object : CometChat.CallbackListener<String>() {
override fun onSuccess(result: String) { // init resolved — only now login
if (CometChatUIKit.getLoggedInUser() == null) {
CometChatUIKit.login(uid, object : CometChat.CallbackListener<User>() {
// ⚠️ inside this object, `this` is the LISTENER, not the Activity — navigating
// with `Intent(this, …)` does not compile. Qualify it: `this@YourActivity`.
override fun onSuccess(user: User) {
startActivity(Intent(this@MainActivity, ConversationActivity::class.java)); finish()
}
override fun onError(e: CometChatException) { /* render an error state */ }
})
} else { /* session already live — unlock */ }
}
override fun onError(e: CometChatException?) { /* render an error state; do NOT open chat */ }
})Init once (Application or a splash gate), never per Activity. Which UID? login() needs a user that ALREADY exists — never invent one; take it from Dashboard → Users (fresh apps seed cometchat-uid-1…). Prod → loginWithAuthToken. Detail: references/lifecycle.md.
The kit fills the box you give it — a collapsed surface is a HOST sizing defect, never a kit bug. Four invariants (full recipe: references/layout.md):
match_parent / 0dp+layout_weight (Views) — never wrap_content for a list or the chat surface.enableEdgeToEdge() plus consuming the insets. enableEdgeToEdge() ALONE draws
the kit under the status bar — the toolbar title then collides with the clock (verified on device).
Give the layout root an id and pad it:ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.root)) { v, insets ->
val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime()) // message screen only
v.setPadding(bars.left, bars.top, bars.right, maxOf(bars.bottom, ime.bottom))
insets
}windowSoftInputMode="adjustResize" (Views) so the composer stays visible while typing.enableEdgeToEdge() — the host
owns the window. Still consume insets: skipping them because "the host owns it" puts the toolbar
back under the clock.catalogs/android-v6.json)The closed list of shipped components lives in references/component-props.md
(and catalogs/android-v6.json is the oracle). Emit ONLY symbols that appear there.
…kotlin.presentation.<area>.ui.<Component> — except the 3 calling components (no .ui) and
formatters (…kotlin.shared.formatters.*). Full table: references/component-props.md.
setOnX(...), Compose uses onX =Same component, same intent, different wiring. Full signature table (verified vs 6.0.5):
references/component-props.md § Callback shapes.
⚠️ Docs drift — trust
references/component-props.md, not the docs pages for callback shapes (the 3-arg thread callback andsetParentMessageon the list are both wrong upstream).
The default for an unscoped "add chat". One screen per Activity with a real back stack — never a web-style two-pane split. Host Activities must be lifecycle-aware (AppCompatActivity/ComponentActivity/FragmentActivity) and manifest-registered.
// ConversationActivity.kt — the list, wired to open the message screen
class ConversationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_conversation) // hosts CometChatConversations at match_parent
val conversations = findViewById<CometChatConversations>(R.id.conversations)
conversations.setTitle("Chats")
conversations.setOnItemClick { conversation ->
val intent = Intent(this, MessageActivity::class.java)
when (val entity = conversation.conversationWith) {
is User -> intent.putExtra("user", entity)
is Group -> intent.putExtra("group", entity)
}
startActivity(intent)
}
conversations.setOnSearchClick { startActivity(Intent(this, SearchActivity::class.java)) }
}
}// MessageActivity.kt — header + list + composer, all bound to the SAME target
class MessageActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_message) // vertical LinearLayout, list = 0dp + weight 1
val header = findViewById<CometChatMessageHeader>(R.id.message_header)
val list = findViewById<CometChatMessageList>(R.id.message_list)
val composer = findViewById<CometChatMessageComposer>(R.id.message_composer)
val user = intent.getParcelableExtra<User>("user")
val group = intent.getParcelableExtra<Group>("group")
user?.let { header.setUser(it); list.setUser(it); composer.setUser(it) }
group?.let { header.setGroup(it); list.setGroup(it); composer.setGroup(it) }
header.setBackButtonVisibility(View.VISIBLE) // the callback is inert without this
header.setOnBackPress { finish() }
list.setOnThreadRepliesClick { parent -> // ONE arg (verified vs 6.0.5)
startActivity(Intent(this, ThreadActivity::class.java).apply {
putExtra("raw_json", parent.rawMessage.toString())
user?.let { putExtra("user", it) }; group?.let { putExtra("group", it) }
})
}
}
}contracts.android-v6.json → core-chat-surface mandates all four by default; a list ↔ message screen is half the surface:
| Capability | Component | Wire |
|---|---|---|
| conversations | CometChatConversations | setOnItemClick |
| messages | CometChatMessageHeader + List + Composer | setUser/setGroup + setOnBackPress |
| threaded replies | CometChatThreadHeader | setOnThreadRepliesClick → push a thread Activity |
| search | CometChatSearch | setOnSearchClick → push a search Activity (global), and the in-chat case scoped with setUid/setGuid |
On Android both are pushed screens, not side panels. The callbacks above are only entry points — the pushed screens are where the mandated components render. Emit both, or the surface has tap targets that lead nowhere:
// ThreadActivity.kt — what setOnThreadRepliesClick pushes to.
// header takes the parent MESSAGE; list + composer take the parent message ID (Long).
val parent = BaseMessage.processMessage(JSONObject(intent.getStringExtra("raw_json")!!))
threadHeader.setParentMessage(parent)
threadList.setParentMessageId(parent.id)
threadComposer.setParentMessageId(parent.id)
// the thread list/composer ALSO need the conversation target, or replies silently never send:
user?.let { threadList.setUser(it); threadComposer.setUser(it) }
group?.let { threadList.setGroup(it); threadComposer.setGroup(it) }
// CometChatThreadHeader is DISPLAY-ONLY (no callbacks) → renders no back control; the HOST owns it
// here. Give the screen a toolbar back action (or say plainly it relies on system back) — a thread
// with no way out is a dead end.SearchScope is REQUIRED for setSearchIn and lives in com.cometchat.uikit.core.constants —
import it explicitly; it is not re-exported from the component's package.
// SearchActivity.kt — global search; for IN-CHAT search scope it to the open conversation.
val search = findViewById<CometChatSearch>(R.id.search)
search.setSearchIn(listOf(SearchScope.CONVERSATIONS, SearchScope.MESSAGES))
user?.let { search.setUid(it.uid) } // in-chat scoping (omit for global)
group?.let { search.setGuid(it.guid) }
// CometChatSearch renders its OWN back arrow — without this it is inert (wire-or-hide).
search.setOnBackPressListener { finish() }
// Results must GO somewhere, carrying the SAME "user"/"group" extras the message screen reads.
// Passing the Conversation/BaseMessage itself navigates but never calls setUser/setGroup, so the
// screen loads forever ("no User/Group was set" — references/troubleshooting.md).
search.setOnConversationClick { openChat(it.conversationWith) } // already the OTHER party
search.setOnMessageClick { m ->
// group → the group; 1:1 → whoever is NOT me
openChat(if (m.receiverType == CometChatConstants.RECEIVER_TYPE_GROUP) m.receiver
else if (m.sender.uid == CometChatUIKit.getLoggedInUser()?.uid) m.receiver else m.sender)
}
// same when(entity) the conversations tap uses above — never push a screen with no target
private fun openChat(e: AppEntity?) = when (e) {
is User -> startActivity(Intent(this, MessageActivity::class.java).putExtra("user", e))
is Group -> startActivity(Intent(this, MessageActivity::class.java).putExtra("group", e))
else -> Unit
}Reuse existing navigation/theme/auth; add files + wiring only. Leave header call buttons and composer attach/emoji/voice as built-in defaults. Do NOT add tabs / detail screens / call logs / incoming call (placement growths) or gated extensions/AI unless asked — the thread and search screens ARE the default.
Jetpack Compose cohort: the same four capabilities as composable params (
onItemClick =,onBackPress =,onThreadRepliesClick =) inside aNavHost+Scaffold+imePadding(). Compose recipes SHIP — usecometchat-android-v6-compose-{components,placement,customization}; fall back toreferences/docs-map.mdfor long-tail params.⚠️ Compose "Auto — follow OS" (the default theming) is a CORE obligation, NOT automatic. Unlike Views (
CometChatTheme.DayNight) and iOS, the Compose kit ignores the device dark setting unless you wrap the gate + NavHost + every kit screen inCometChatTheme(colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()){ … }(fromcom.cometchat.uikit.compose.theme.*) — no wrapper ⇒ light defaults (verified; RULES.md §Ordering-invariants). This bare follow-OS wrapper is core; brand tokens arecometchat-android-v6-compose-customization§Theming.
references/setup-credentials.md — detect, cohort, version_conflict, the CLI credential fetch, the settings file, UID rules.references/lifecycle.md — where to init, the login guard, auth-token prod path, logout, config changes.references/layout.md — the ONE mobile sizing standard (fill · insets · IME · no reflow · scroll containment).references/component-props.md — baked per-cohort signatures for the four drop-ins + the request-builder hooks.references/docs-map.md — intent → the exact docs .md twin (component table + SDK section + task guides).references/anti-patterns.md — the real-bug list (hardcoded creds, login-before-init, leaked listeners, wrap_content collapse, dead affordances, mixed cohorts).references/troubleshooting.md — symptom → cause → fix, the first stop when an integration renders wrong.version_conflict (a v5 chat-uikit-android in the tree) · both cohorts installed · minSdk below 28 · credentials hardcoded instead of the gitignored settings file · classic init() instead of initFromSettings · login (or UI) before init's onSuccess · wrap_content on the chat surface · composer hidden by the IME · thread screen missing the user/group target (replies never send) · trusting the 3-arg thread callback from the docs.
Build + run → logcat shows init onSuccess then login onSuccess → conversations renders full-size; tap a conversation → the message screen loads for that user/group and messages send/receive; "reply in thread" opens the thread screen and back returns; the search entry point opens a real search screen and returns; the composer stays visible with the keyboard open; system bars don't overlap header/composer. Blank/stuck ⇒ something rendered before init resolved, wrong Region, or the Cloudsmith repo is missing. Compile gate: ./gradlew :app:assembleDebug # in YOUR app.
Tell the user briefly: (1) what I wired (3–5 bullets, NAME the files); (2) decisions & why, flagging dev-only AS dev-only (Auth Key → server token for prod; the <uid>; the cohort); (3) what I did NOT touch (additive — navigation/auth/styles intact). Then offer these THREE options and WAIT — do NOT auto-continue:
cometchat-android-v6-features / -calls / -push.cometchat-android-v6-{kotlin,compose}-customization.© cometchat, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 7 other files (references) in skills/cometchat-android-v6-core of cometchat/cometchat-skills.
Open the folder on GitHubat commit 911b108
Cometchat Android V6 Core next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Cometchat Android V6 Core this skillcometchat/cometchat-skills | 130 | — | ~5.5k | Automated safety check: Pass | MIT | |
| Jetpack Compose Expertaldefy/compose-skill | 596 | — | ~4.8k | Automated safety check: Pass | Custom licence | |
| Compose Multiplatform Patternsmonta-app/ocpp-emulator | 180 | 5 repos | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Android Developmentdpconde/claude-android-skill | 336 | — | ~1.7k | Automated safety check: Pass | MIT | |
| Stylesarindamxd/camerax-android | 132 | 4 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| Claude Android NinjaDrjacky/claude-android-ninja | 124 | — | ~5.2k | Automated safety check: Pass | Apache-2.0 |
aldefy/compose-skill
Guides Jetpack Compose and Compose Multiplatform work across Android, Desktop, iOS and web, plus Android TV, Material 3 motion, paging, navigation and design-to-code.
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
dpconde/claude-android-skill
Create production-quality Android applications following Google's official architecture guidance and NowInAndroid best practices.
arindamxd/camerax-android
A skill your agent uses to integrate the Jetpack Compose Styles API into an Android project.
Drjacky/claude-android-ninja
Build and migrate Android apps with Kotlin, Jetpack Compose, MVVM, Hilt, Room 3 (KSP, SQLiteDriver, Flow/suspend DAOs), Navigation3, and multi-module Gradle.
darriousliu/PiPixiv
Jetpack Compose expert skill for Android UI development. An agent skill from darriousliu/PiPixiv.
cometchat/cometchat-skills
Adds voice and video calling to an Android app in Kotlin with the headless CometChat Calls SDK v5, covering meeting-style rooms, 1:1 ringing calls, call logs and recording.
cometchat/cometchat-skills
Builds chat on Android with your own UI against the headless CometChat Chat SDK v5, covering install, Jetifier conflicts, credentials and init-before-login ordering.
cometchat/cometchat-skills
Picks and customizes CometChat's Angular UI Kit components by their verified component list, exact input and output event names, and the surfaces that have no kit component at all.
cometchat/cometchat-skills
Enables or builds CometChat features such as polls, reactions, smart replies and pinned messages in an Angular app, first classifying how much client code each one needs.
cometchat/cometchat-skills
Decides where CometChat chat UI goes in an Angular app: a dedicated route, a dashboard panel, a support widget or the full multi-pane app, with thread and search panels.
cometchat/cometchat-skills
Add voice & video calling to any iOS app FROM SCRATCH with the headless CometChat Calls SDK v5 (CometChatCallsSDK, via Swift Package Manager) — no UI Kit.
Works with
Categories
Foundational rules for the CometChat Android UI Kit v6 — the two UI cohorts and their artifacts, credentials via the gitignored assets settings file, initFromSettings → login → render ordering, the…. Cometchat Android V6 Core is an agent skill from cometchat/cometchat-skills. Foundational rules for the CometChat Android UI Kit v6 — the two UI cohorts and their artifacts, credentials via the gitignored assets settings file, initFromSettings → login → render ordering, the component map, and the production-ready core chat surface.
Cometchat Android V6 Core fits situations like: tasks that involve Android development; tasks that involve Design systems.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a claude-code`. Or copy the skill folder (skills/cometchat-android-v6-core in cometchat/cometchat-skills) into .claude/skills/cometchat-android-v6-core in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a codex`. Or copy the skill folder (skills/cometchat-android-v6-core in cometchat/cometchat-skills) into .agents/skills/cometchat-android-v6-core in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cometchat/cometchat-skills --skill cometchat-android-v6-core -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/cometchat-android-v6-core, .gemini/skills/cometchat-android-v6-core, .github/skills/cometchat-android-v6-core and .opencode/skills/cometchat-android-v6-core in your project.
Going by SKILL.md and its folder, Cometchat Android V6 Core needs the command-line tools its instructions call (npx) and credentials named AUTH_KEY. Our summary lists: Node.js; A credential in AUTH_KEY. Compatibility (from SKILL.md): Android minSdk >=28; compileSdk >=36; Kotlin >=2.1; AGP >=8.9.1; JVM target 11; com.cometchat:chatuikit-kotlin-android ^6 (XML Views) OR com.cometchat:chatuikit-compose-android ^6 (Jetpack Compose) — 6.0.x, verified 6.0.5; com.cometchat:chat-sdk-android ^5 (5.0.x); optional com.cometchat:calls-sdk-android ^5.
SKILL.md names 2 domains. In commands or code: dl.cloudsmith.io; the agent is likely to contact it when it follows the instructions. As links in the text: cometchat.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Cometchat Android V6 Core is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.5k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 16k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Cometchat Android V6 Core: Jetpack Compose Expert (aldefy/compose-skill, 596 stars), Compose Multiplatform Patterns (monta-app/ocpp-emulator, 180 stars), Android Development (dpconde/claude-android-skill, 336 stars) and Styles (arindamxd/camerax-android, 132 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cometchat (a GitHub organization) maintains it in cometchat/cometchat-skills, which has 130 GitHub stars. The repository holds 97 skills in this directory. The repository was last updated on October 5, 2026.
Source: cometchat/cometchat-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.