Provides idiomatic Kotlin implementation patterns including coroutine concurrency, Flow stream handling, multiplatform architecture, Compose UI construction, Ktor server setup, and type-safe DSL design. Use when building Kotlin applications requiring coroutines, multiplatform development, or Android with Compose. Invoke for Flow API, KMP projects, Ktor servers, DSL design, sealed classes, suspend function, Android Kotlin, Kotlin Multiplatform.
git clone https://github.com/Jeffallan/claude-skills.git--- name: kotlin-specialist description: Provides idiomatic Kotlin implementation patterns including coroutine concurrency, Flow stream handling, multiplatform architecture, Compose UI construction, Ktor server setup, and type-safe DSL design. Use when building Kotlin applications requiring coroutines, multiplatform development, or Android with Compose. Invoke for Flow API, KMP projects, Ktor servers, DSL design, sealed classes, suspend function, Android Kotlin, Kotlin Multiplatform. license: MIT metadata: author: https://github.com/Jeffallan version: "1.1.0" domain: language triggers: Kotlin, coroutines, Kotlin Multiplatform, KMP, Jetpack Compose, Ktor, Flow, Android Kotlin, suspend function role: specialist scope: implementation output-format: code related-skills: test-master --- # Kotlin Specialist Senior Kotlin developer with deep expertise in coroutines, Kotlin Multiplatform (KMP), and modern Kotlin 1.9+ patterns. ## Core Workflow 1. **Analyze architecture** - Identify platform targets, coroutine patterns, shared code strategy 2. **Design models** - Create sealed classes, data classes, type hierarchies 3. **Implement** - Write idiomatic Kotlin with coroutines, Flow, extension functions - *Checkpoint:* Verify coroutine cancellation is handled (parent scope cancelled on teardown) and null safety is enforced before proceeding 4. **Validate** - Run `detekt` and `ktlint`; verify coroutine cancellation handling and null safety - *If detekt/ktlint fails:* Fix all reported issues and re-run both tools before proceeding to step 5 5. **Optimize** - Apply inline classes, sequence operations, compilation strategies 6. **Test** - Write multiplatform tests with coroutine test support (`runTest`, Turbine) ## Reference Guide Load detailed guidance based on context: | Topic | Reference | Load When | |-------|-----------|-----------| | Coroutines & Flow | `references/coroutines-flow.md` | Async operations, structured concurrency, Flow API | | Multiplatform | `references/multiplatform-kmp.md` | Shared code, expect/actual, platform setup | | Android & Compose | `references/android-compose.md` | Jetpack Compose, ViewModel, Material3, navigation | | Ktor Server | `references/ktor-server.md` | Routing, plugins, authentication, serialization | | DSL & Idioms | `references/dsl-idioms.md` | Type-safe builders, scope functions, delegates | ## Key Patterns ### Sealed Classes for State Modeling ```kotlin sealed class UiState<out T> { data object Loading : UiState<Nothing>() data class Success<T>(val data: T) : UiState<T>() data class Error(val message: String, val cause: Throwable? = null) : UiState<Nothing>() } // Consume exhaustively — compiler enforces all branches fun render(state: UiState<User>) = when (state) { is UiState.Loading -> showSpinner() is UiState.Success -> showUser(state.data) is UiState.Error -> showError(state.message) } ``` ### Coroutines & Flow ```kotlin // Use structured concurrency — never GlobalScope class UserRepository(private val api: UserApi, private val scope: CoroutineScope) { fun userUpdates(id: String): Flow<UiState<User>> = flow { emit(UiState.Loading) try { emit(UiState.Success(api.fetchUser(id))) } catch (e: IOException) { emit(UiState.Error("Network error", e)) } }.flowOn(Dispatchers.IO) private val _user = MutableStateFlow<UiState<User>>(UiState.Loading) val user: StateFlow<UiState<User>> = _user.asStateFlow() } // Anti-pattern — blocks the calling thread; avoid in production // runBlocking { api.fetchUser(id) } ``` ### Null Safety ```kotlin // Prefer safe calls and elvis operator val displayName = user?.profile?.name ?: "Anonymous" // Use let to scope nullable operations user?.email?.let { email -> sendNotification(email) } // !! only when the null case is a true contract violation and documented val config = requireNotNull(System.getenv("APP_CONFIG")) { "APP_CONFIG must be set" } ``` ### Scope Functions ```kotlin // apply — configure an object, returns receiver val request = HttpRequest().apply { url = "https://api.example.com/users" headers["Authorization"] = "Bearer $token" } // let — transform nullable / introduce a local scope val length = name?.let { it.trim().length } ?: 0 // also — side-effects without changing the chain val user = createUser(form).also { logger.info("Created user ${it.id}") } ``` ## Constraints ### MUST DO - Use null safety (`?`, `?.`, `?:`, `!!` only when contract guarantees non-null) - Prefer `sealed class` for state modeling - Use `suspend` functions for async operations - Leverage type inference but be explicit when needed - Use `Flow` for reactive streams - Apply scope functions appropriately (`let`, `run`, `apply`, `also`, `with`) - Document public APIs with KDoc - Use explicit API mode for libraries - Run `detekt` and `ktlint` before committing - Verify coroutine cancellation is handled (cancel parent scope on teardown) ### MUST NOT DO - Block coroutines with `runBlocking` in production code - Use `!!` without documented justification - Mix platform-specific code in common modules - Skip null safety checks - Use `GlobalScope.launch` (use structured concurrency) - Ignore coroutine cancellation - Create memory leaks with coroutine scopes ## Output Templates When implementing Kotlin features, provide: 1. Data models (sealed classes, data classes) 2. Implementation file (extension functions, suspend functions) 3. Test file with coroutine test support 4. Brief explanation of Kotlin-specific patterns used ## Knowledge Reference Kotlin 1.9+, Coroutines, Flow API, StateFlow/SharedFlow, Kotlin Multiplatform, Jetpack Compose, Ktor, Arrow.kt, kotlinx.serialization, Detekt, ktlint, Gradle Kotlin DSL, JUnit 5, MockK, Turbine [Documentation](https://jeffallan.github.io/claude-skills/skills/language/kotlin-specialist/)
[{"step":"Define your requirements clearly. Determine if you need multiplatform support, coroutine-based concurrency, Flow streams, Compose UI, or Ktor server setup.","tip":"List the platforms you're targeting (Android, iOS, Web, Desktop) and the specific libraries you'll use (Ktor, Compose, Kotlinx Coroutines)."},{"step":"Start with the shared module structure. Create a `commonMain` source set for cross-platform code and platform-specific modules for Android/iOS/etc.","tip":"Use the Kotlin Multiplatform template in Android Studio or IntelliJ to set up the project structure automatically."},{"step":"Implement core interfaces and expect/actual declarations in the shared module. Move platform-specific implementations to their respective modules.","tip":"For Ktor clients, define your API interfaces in commonMain and implement them in platform-specific modules using the appropriate HTTP client (OkHttp for Android, NSURLSession for iOS)."},{"step":"Integrate with your UI framework. For Android, use Compose with ViewModel and StateFlow. For iOS, use SwiftUI with Kotlin/Native bindings.","tip":"Use `StateFlow.asStateFlow()` in ViewModels to expose immutable state to the UI layer."},{"step":"Add error handling and logging. Use Kotlin's `Result` type or sealed interfaces for error states in your Flow streams.","tip":"Consider using `catch` operators in Flow to handle exceptions gracefully and emit error states to the UI."}]
No install command available. Check the GitHub repository for manual installation instructions.
git clone https://github.com/Jeffallan/claude-skills/tree/main/skills/kotlin-specialistCopy the install command above and run it in your terminal.
Launch Claude Code, Cursor, or your preferred AI coding agent.
Use the prompt template or examples below to test the skill.
Adapt the skill to your specific use case and workflow.
Generate idiomatic Kotlin code for [SPECIFIC_TASK] using best practices for [CONTEXT]. Include coroutines, Flow, or Compose where applicable. Use [KOTLIN_VERSION] and [LIBRARY_VERSIONS] if specified. Example tasks: 'a multiplatform Ktor client for a REST API', 'a Compose screen with ViewModel and state hoisting', 'a KMP shared module with expect/actual declarations', or 'a type-safe DSL for configuration'.
```kotlin
// Multiplatform Ktor client for GitHub API (Kotlin 1.9.20, Ktor 2.3.7, Kotlinx Coroutines 1.7.3)
// Shared module (commonMain)
interface GitHubApi {
suspend fun fetchRepos(owner: String): List<Repo>
suspend fun fetchIssues(repo: String): List<Issue>
}
expect class GitHubApiClient() : GitHubApi
// Android/iOS implementation (platform-specific)
actual class GitHubApiClient actual constructor() : GitHubApi {
private val client = HttpClient(OkHttp) {
install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true }) }
}
override suspend fun fetchRepos(owner: String): List<Repo> = client.get("https://api.github.com/users/$owner/repos").body()
override suspend fun fetchIssues(repo: String): List<Issue> = client.get("https://api.github.com/repos/$repo/issues").body()
}
// Data classes (commonMain)
@Serializable
data class Repo(val id: Long, val name: String, val description: String?)
@Serializable
data class Issue(val number: Int, val title: String, val state: String)
// Usage in ViewModel (Android)
class RepoViewModel(private val api: GitHubApi) : ViewModel() {
private val _repos = MutableStateFlow<List<Repo>>(emptyList())
val repos: StateFlow<List<Repo>> = _repos.asStateFlow()
fun loadRepos(owner: String) = viewModelScope.launch {
_repos.value = api.fetchRepos(owner)
}
}
```
Key features demonstrated:
1. **Multiplatform Architecture**: Shared interface with platform-specific implementations using `expect/actual`
2. **Coroutines**: Proper use of `suspend` functions and `viewModelScope` for async operations
3. **Ktor Client**: Type-safe HTTP client with JSON serialization
4. **State Management**: Flow-based state in ViewModel with `StateFlow`
5. **Data Classes**: Kotlin serialization for cross-platform data transfer
This pattern ensures clean separation of concerns while maintaining type safety across platforms. The ViewModel handles business logic while the API client abstracts platform-specific networking details.skills-collection
Take a free 3-minute scan and get personalized AI skill recommendations.
Take free scan