Compose Multiplatform Patterns
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
Implements Google Cast support in Android apps using Jetpack Media3.
$ npx skills add arindamxd/camerax-android --skill media3-cast-integration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install arindamxd/camerax-android media3-cast-integration --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/arindamxd/camerax-android.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/media3-cast-integration .claude/skills/media3-cast-integration && 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 "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .claude/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integrationType 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 arindamxd/camerax-android --skill media3-cast-integration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install arindamxd/camerax-android media3-cast-integration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arindamxd/camerax-android.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/media3-cast-integration .agents/skills/media3-cast-integration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .agents/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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 arindamxd/camerax-android --skill media3-cast-integration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install arindamxd/camerax-android media3-cast-integration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arindamxd/camerax-android.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/media3-cast-integration .cursor/skills/media3-cast-integration && 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 "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .cursor/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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/arindamxd/camerax-android.git --path .agents/skills/media3-cast-integration--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 arindamxd/camerax-android --skill media3-cast-integration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install arindamxd/camerax-android media3-cast-integration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arindamxd/camerax-android.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/media3-cast-integration .gemini/skills/media3-cast-integration && 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 "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .gemini/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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 arindamxd/camerax-android media3-cast-integrationInstalls 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 arindamxd/camerax-android --skill media3-cast-integration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/arindamxd/camerax-android.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/media3-cast-integration .github/skills/media3-cast-integration && 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 "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .github/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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 arindamxd/camerax-android --skill media3-cast-integration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install arindamxd/camerax-android media3-cast-integration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/arindamxd/camerax-android.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/media3-cast-integration .opencode/skills/media3-cast-integration && 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 "media3-cast-integration" agent skill from https://github.com/arindamxd/camerax-android/tree/master/.agents/skills/media3-cast-integration into .opencode/skills/media3-cast-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "media3-cast-integration", 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.
media3-cast-integrationImplements Google Cast support in Android apps using Jetpack Media3.
Media3 Cast Integration is an agent skill from arindamxd/camerax-android. Implements Google Cast support in Android apps using Jetpack Media3. Handles adding build dependencies, updating manifest, configuring OptionsProvider, and managing CastPlayer or RemoteCastPlayer for playback in both Compose and View-based UIs. Use when adding Cast functionality or migrating from legacy Cast SDK to Media3 Cast.
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files (for example `references/android/media/media3/cast/create-castplayer.md`, `references/android/media/media3/cast/customize-castoptions.md` and `references/android/media/media3/cast/index.md`).
It sits in Mobile, covering Android development. It works with Android. The repository describes itself as: A Play Store camera app showing Jetpack CameraX APIs in Kotlin — install it, use it, copy the patterns. The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7c36352. 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.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
developer.android.comdevelopers.google.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Media3 Cast Integration loads about 2.7k tokens when it runs, and up to ~7.4k if it reads all its reference files. Until then it costs about 88 tokens; SKILL.md has 905 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 arindamxd/camerax-android at commit 7c36352, republished under its Apache-2.0 licence (© arindamxd). 905 words, ~2,677 tokens.
.claude/skills/media3-cast-integration/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.>= 1.9.0. Cast isn't available in lower versions.CastPlayer : Media3 Player that controls playback on both local and remote Cast devices.RemoteCastPlayer : Media3 Player that communicates with a Cast receiver, only used for remote playback.OptionsProvider : Interface providing configuration options to initialize GMS CastContext.To complete this step, you MUST ensure the following:
In the app-level build file, declare the media3-cast dependency version 1.9.0 or higher.
implementation("androidx.media3:media3-cast:1.10.1")
Ensure required Media3 dependencies are present:
androidx.media3:media3-exoplayerandroidx.media3:media3-sessionandroidx.media3:media3-ui-composeIf the application uses legacy Views, add media3-ui.
Enforce the same versions across all Media3 dependencies.
Use configurations in "Add build dependencies" section of Getting started with CastPlayer as the source of truth.
For apps without an existing Cast integration:
libs.play.services.cast.framework) is absent.If Migrating from Legacy Cast SDK:
To complete this step, you MUST ensure the following:
<application> tag, declare the Cast options provider.DefaultCastOptionsProvider by default. See the "OptionsProvider" section in Getting started with CastPlayer.OptionsProvider only if explicitly requested. See Customize CastOptions.INTERNET permission is present. Don't add any unnecessary permissions.Before integrating Media3 Cast, an existing app follows one of two setups:
ExoPlayer only to support local playback.ExoPlayer for local playback, alongside a Player wrapper over the legacy RemoteMediaClient for remote playback. The UI interfaces with a MediaSession interacting with a ForwardingPlayer, which finally routes controls to either local or remote playback.To complete this step, you MUST ensure the following:
MediaSessionService (or MediaLibraryService) onCreate() method, initialize ExoPlayer and CastPlayer.CastPlayer by default unless RemoteCastPlayer is explicitly requested. See the "Build a CastPlayer" section in Getting started with CastPlayer.CastPlayer, pass the instance directly to MediaSession.Builder.RemoteCastPlayerUse RemoteCastPlayer only if explicitly requested by user.
Initialize MediaSession with localPlayer and set a SessionAvailabilityListener on RemoteCastPlayer to transfer playback state on Cast session availability changes:
class PlaybackService : MediaSessionService() { private var mediaSession: MediaSession? = null private lateinit var localPlayer: ExoPlayer private lateinit var remotePlayer: RemoteCastPlayer override fun onCreate() { super.onCreate() localPlayer = ExoPlayer.Builder(this).build() remotePlayer = RemoteCastPlayer.Builder(this).build() mediaSession = MediaSession.Builder(this, localPlayer).build() remotePlayer.setSessionAvailabilityListener( object : SessionAvailabilityListener { override fun onCastSessionAvailable() { transferPlaybackState(localPlayer, remotePlayer) } override fun onCastSessionUnavailable() { transferPlaybackState(remotePlayer, localPlayer) } } ) } private fun transferPlaybackState(previousPlayer: Player, newPlayer: Player) { if (previousPlayer.mediaItemCount > 0) { val transferStateBuilder = PlayerTransferState.builderFromPlayer(previousPlayer) if (previousPlayer.playbackState == Player.STATE_ENDED || previousPlayer.currentPosition == C.TIME_END_OF_SOURCE) { transferStateBuilder.setCurrentMediaItemIndex(0) transferStateBuilder.setCurrentPosition(0) } transferStateBuilder.build().setToPlayer(newPlayer) } previousPlayer.stop() previousPlayer.clearMediaItems() newPlayer.prepare() mediaSession?.setPlayer(newPlayer) } }
To complete this step, you MUST ensure the following:
See the "Add a MediaRouteButton Composable to the Player" section in Getting started with CastPlayer for Compose integration guidelines.
Use the MediaRouteButton composable from androidx.media3.cast package.
Don't use AndroidView in the Compose UI hierarchy.
Place MediaRouteButton in an area next to playback controls. Don't hide it behind system UI.
Don't use PlayerSurface for custom player UI. Use the Material3 Player composable.
Force recomposition on playback location shifts to ensure UI sync. Use key constraints on DeviceInfo changes:
@OptIn(UnstableApi::class)
@Composable
fun MainScreen() {
val player = rememberMediaController()
val deviceInfo = rememberDeviceInfo(player)
player?.let { activePlayer -> key(deviceInfo) { PlayerScreen(player = activePlayer) } }
}
@Composable
private fun rememberMediaController(): Player? {
// Logic to connect MediaController to MediaSession and release it
}
@Composable
private fun rememberDeviceInfo(player: Player?): DeviceInfo? {
var deviceInfo by remember(player) { mutableStateOf(player?.deviceInfo) }
DisposableEffect(player) {
val activePlayer = player ?: return@DisposableEffect onDispose {}
deviceInfo = activePlayer.deviceInfo
val listener = object : Player.Listener {
override fun onDeviceInfoChanged(info: DeviceInfo) {
deviceInfo = info
}
}
activePlayer.addListener(listener)
onDispose { activePlayer.removeListener(listener) }
}
return deviceInfo
}To complete this step, you MUST ensure the following:
For View-based UI setups, see the "Add UI elements" section in Getting started with CastPlayer.
Casting Activities must extend AppCompatActivity or FragmentActivity and use a Theme.AppCompat descendant.
Ensure the AppCompat theme has a visible ActionBar if adding MediaRouteButton to the options menu.
Replace all instances and imports of CastButtonFactory with MediaRouteButtonFactory.
Rebind PlayerView.player references upon onDeviceInfoChanged events to prevent black screens or UI freezes:
private val playerListener: Player.Listener =
object : Player.Listener {
override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
// Resetting to null bypasses PlayerView.setPlayer()'s instance equality check
// (this.player == player), forcing it to re-bind the video surface to the controller.
playerView.player = null
playerView.player = controller
}
}
Migration to Compose:
AndroidView to wrap the legacy PlayerView.Player composable and MediaRouteButton composable as per Getting started with CastPlayer.[!WARNING] Warning: Don't perform cleanup directly. Remove legacy files and dependencies only when explicitly requested by the user.
To complete this step, you MUST ensure the following:
libs.play.services.cast.framework) and MediaRouter (libs.androidx.mediarouter) dependencies.OptionsProvider classes and manifest entries if DefaultCastOptionsProvider is adopted.MediaTransferReceiver manifest declarations if present.RemoteMediaClient interfaces.PlayerView if the migration to Compose is complete.© arindamxd, Apache-2.0. 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 3 other files (references) in .agents/skills/media3-cast-integration of arindamxd/camerax-android.
Open the folder on GitHubat commit 7c36352
We found 4 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in arindamxd/camerax-android, which our catalogue first saw on October 7, 2026.
Media3 Cast Integration 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 |
|---|---|---|---|---|---|---|
| Media3 Cast Integration this skillarindamxd/camerax-android | 132 | 2 repos | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Compose Multiplatform Patternsmonta-app/ocpp-emulator | 180 | 5 repos | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Mobile QAtloncorp/tlon-apps | 107 | — | ~2.4k | Automated safety check: Pass | MIT | |
| Ha Android UIhome-assistant/android | 4k | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Android UI AutomationOpenMinis/MinisSkills | 444 | — | ~1.6k | Automated safety check: Pass | MIT | |
| Android Design Guidelinesehmo/platform-design-skills | 606 | — | ~9.7k | Automated safety check: Pass | MIT |
monta-app/ocpp-emulator
Compose Multiplatform and Jetpack Compose patterns for KMP projects — state management, navigation, theming, performance, and platform-specific UI.
tloncorp/tlon-apps
Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.
home-assistant/android
Home Assistant Android UI guidance. An agent skill from home-assistant/android.
OpenMinis/MinisSkills
Automate Android apps that have no public API or web version by driving the UI layer through the Accessibility Service.
ehmo/platform-design-skills
Material Design 3 and Android platform guidelines. An agent skill from ehmo/platform-design-skills.
ModinMobileSTS/SlayTheAmethystModded
Applies practical Jetpack Compose patterns to Android UI code: state hoisting, one-way data flow, side effects, modifiers, theming and testable composables.
arindamxd/camerax-android
A skill your agent uses to integrate the Jetpack Compose Styles API into an Android project.
arindamxd/camerax-android
Provides a complete workflow for implementing verified email retrieval on Android Credential Manager API.
arindamxd/camerax-android
A skill your agent uses to migrate your Jetpack Compose app to add adaptive edge-to-edge support and troubleshoot common issues.
arindamxd/camerax-android
Provide technical guidance for Android camera development with CameraX.
arindamxd/camerax-android
Provides instructions and architectural patterns for migrating Android TV applications from legacy Leanback UI Toolkit, Android Views, or Support Fragments to Jetpack Compose for TV (androidx.tv).
arindamxd/camerax-android
Provides a structured workflow for migrating an Android XML View to Jetpack Compose.
Works with
Categories
Implements Google Cast support in Android apps using Jetpack Media3. Media3 Cast Integration is an agent skill from arindamxd/camerax-android. Implements Google Cast support in Android apps using Jetpack Media3.
Media3 Cast Integration fits situations like: adding Cast functionality; migrating from legacy Cast SDK to Media3 Cast.
Run `npx skills add arindamxd/camerax-android --skill media3-cast-integration -a claude-code`. Or copy the skill folder (.agents/skills/media3-cast-integration in arindamxd/camerax-android) into .claude/skills/media3-cast-integration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add arindamxd/camerax-android --skill media3-cast-integration -a codex`. Or copy the skill folder (.agents/skills/media3-cast-integration in arindamxd/camerax-android) into .agents/skills/media3-cast-integration 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 arindamxd/camerax-android --skill media3-cast-integration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/media3-cast-integration, .gemini/skills/media3-cast-integration, .github/skills/media3-cast-integration and .opencode/skills/media3-cast-integration in your project.
SKILL.md names no scripts, command-line tools or credentials: Media3 Cast Integration is instructions for the agent only.
SKILL.md names 2 domains. As links in the text: developer.android.com and developers.google.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.
Media3 Cast Integration is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k 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 4.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Media3 Cast Integration: Compose Multiplatform Patterns (monta-app/ocpp-emulator, 180 stars), Mobile QA (tloncorp/tlon-apps, 107 stars), Ha Android UI (home-assistant/android, 4k stars) and Android UI Automation (OpenMinis/MinisSkills, 444 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
arindamxd (a GitHub user) maintains it in arindamxd/camerax-android, which has 132 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on October 2, 2026.
Source: arindamxd/camerax-android on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.