
Kotlin Specialist
Implement Android UI with Jetpack Compose, Material 3, and ViewModel StateFlow patterns while you build your mobile app.
Overview
Kotlin-specialist is an agent skill for the Build phase that helps implement Android Jetpack Compose UIs with Material 3 and ViewModel StateFlow state management.
Install
npx skills add https://github.com/jeffallan/claude-skills --skill kotlin-specialistWhat is this skill?
- Jetpack Compose UI: Card, Column, MaterialTheme typography and color roles
- @Composable screens with modifiers, spacing, and Material 3 components
- ViewModel + MutableStateFlow / StateFlow uiState pattern with viewModelScope
- Repository-backed load flows with loading and error handling in uiState updates
- Kotlin-first Android patterns rather than XML layouts
Adoption & trust: 3.2k installs on skills.sh; 9.7k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are building an Android screen in Compose but need correct Material 3 structure, state hoisting, and ViewModel patterns without hunting docs.
Who is it for?
Indie Android developers using Claude or Cursor who want Compose + Kotlin snippets aligned with Google’s recommended architecture.
Skip if: iOS SwiftUI work, server-side Kotlin/Ktor APIs only, or teams standardized on legacy XML views with no Compose migration.
When should I use this skill?
Building or refactoring Android UI with Jetpack Compose, Material 3, and ViewModel-backed screen state.
What do I get? / Deliverables
You get idiomatic Compose composables and ViewModel uiState code you can drop into your app module and adapt to your repository.
- Compose UI code blocks
- ViewModel StateFlow scaffolding for screens
Recommended Skills
Journey fit
How it compares
Use as a mobile UI implementation skill, not a full project scaffold or Play Console launch checklist.
Common Questions / FAQ
Who is kotlin-specialist for?
Solo builders and small teams writing Android apps in Kotlin with Jetpack Compose and Material 3.
When should I use kotlin-specialist?
During Build while designing screens, binding ViewModels, and applying MaterialTheme patterns before Ship testing.
Is kotlin-specialist safe to install?
It provides code patterns only; review the Security Audits panel on this Prism page like any community skill.
SKILL.md
READMESKILL.md - Kotlin Specialist
# Android & Jetpack Compose ## Compose Basics ```kotlin import androidx.compose.runtime.* import androidx.compose.foundation.layout.* import androidx.compose.material3.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable fun UserProfile(user: User, onEdit: () -> Unit) { Card( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Column(modifier = Modifier.padding(16.dp)) { Text( text = user.name, style = MaterialTheme.typography.headlineMedium ) Text( text = user.email, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(8.dp)) Button(onClick = onEdit) { Text("Edit Profile") } } } } ``` ## State Management ```kotlin // ViewModel with StateFlow class UserViewModel( private val repository: UserRepository ) : ViewModel() { private val _uiState = MutableStateFlow(UserUiState()) val uiState: StateFlow<UserUiState> = _uiState.asStateFlow() fun loadUser(userId: String) { viewModelScope.launch { _uiState.update { it.copy(isLoading = true) } try { val user = repository.getUser(userId) _uiState.update { it.copy(user = user, isLoading = false) } } catch (e: Exception) { _uiState.update { it.copy(error = e.message, isLoading = false) } } } } } data class UserUiState( val user: User? = null, val isLoading: Boolean = false, val error: String? = null ) // Composable using ViewModel @Composable fun UserScreen( viewModel: UserViewModel = hiltViewModel(), userId: String ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(userId) { viewModel.loadUser(userId) } when { uiState.isLoading -> LoadingIndicator() uiState.error != null -> ErrorMessage(uiState.error!!) uiState.user != null -> UserProfile(uiState.user!!) } } ``` ## Material 3 Theme ```kotlin @Composable fun AppTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { val colorScheme = if (darkTheme) { darkColorScheme( primary = Purple80, secondary = PurpleGrey80, tertiary = Pink80 ) } else { lightColorScheme( primary = Purple40, secondary = PurpleGrey40, tertiary = Pink40 ) } MaterialTheme( colorScheme = colorScheme, typography = Typography, content = content ) } ``` ## Navigation ```kotlin import androidx.navigation.compose.* @Composable fun AppNavigation() { val navController = rememberNavController() NavHost( navController = navController, startDestination = "home" ) { composable("home") { HomeScreen( onNavigateToProfile = { userId -> navController.navigate("profile/$userId") } ) } composable( route = "profile/{userId}", arguments = listOf(navArgument("userId") { type = NavType.StringType }) ) { backStackEntry -> val userId = backStackEntry.arguments?.getString("userId") ProfileScreen( userId = userId ?: "", onBack = { navController.popBackStack() } ) } composable("settings") { SettingsScreen() } } } ``` ## LazyColumn (Lists) ```kotlin @Composable fun UserList( users: List<User>, onUserClick: (User) -> Unit ) { LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(16.dp), verticalArran