kotlin-specialist
jeffallan/claude-skills
Senior Kotlin developer expertise: coroutines, Flow, Kotlin Multiplatform, Compose, Ktor, and type-safe DSLs.
What is kotlin-specialist?
Provides idiomatic Kotlin implementation patterns for coroutine concurrency, reactive streams with Flow, multiplatform architecture, Jetpack Compose UI, Ktor servers, and type-safe DSL design. Use when building Kotlin applications requiring structured concurrency, KMP projects, Android with Compose, or server-side Kotlin.
- Design sealed classes and type hierarchies for state modeling
- Implement coroutines and Flow for async operations with structured concurrency
- Build Kotlin Multiplatform (KMP) projects with shared code and expect/actual patterns
- Construct Jetpack Compose UIs with ViewModel and Material3 integration
- Set up Ktor servers with routing, plugins, and authentication
- Create type-safe DSLs using scope functions and builder patterns
How to install kotlin-specialist
npx skills add https://github.com/jeffallan/claude-skills --skill kotlin-specialistHow to use kotlin-specialist
- 1.Analyze your architecture to identify platform targets and coroutine patterns
- 2.Design data models using sealed classes and data classes for type safety
- 3.Implement features using suspend functions, Flow, and structured concurrency
- 4.Run detekt and ktlint to validate code style and correctness
- 5.Optimize with inline classes and sequence operations as needed
- 6.Write multiplatform tests using runTest and Turbine for coroutine verification
Use cases
- Building reactive Android apps with Compose and coroutines
- Developing Kotlin Multiplatform libraries with shared business logic
- Creating async data flows with Flow API and StateFlow
- Setting up Ktor REST servers with structured concurrency
- Designing type-safe configuration DSLs and builders
- Kotlin developers building production applications
- Android engineers using Jetpack Compose
- Multiplatform library authors
- Backend developers using Ktor
- Teams adopting modern Kotlin 1.9+ patterns
kotlin-specialist FAQ
Use Flow for cold, one-shot async operations (e.g., API calls). Use StateFlow for hot, stateful data that multiple collectors need to observe (e.g., UI state). StateFlow always replays the latest value to new subscribers.
Always use structured concurrency with a CoroutineScope tied to a lifecycle (e.g., viewModelScope in Android). Cancel the parent scope on teardown. Never use GlobalScope.launch in production code.
Suspend functions can be paused and resumed without blocking threads. Use them for async operations like network calls. Regular functions block the thread. Suspend functions can only be called from other suspend functions or within a coroutine.
Only use !! when you have a documented contract guaranteeing non-null values and the null case is a true violation. Prefer safe calls (?.), elvis operator (?:), let scoping, or requireNotNull with a clear error message.
Create a commonMain source set for shared code, then platform-specific sets (androidMain, iosMain, etc.). Use expect/actual declarations to define platform-specific implementations while keeping the common interface in commonMain.
Full instructions (SKILL.md)
Source of truth, from jeffallan/claude-skills.
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
- Analyze architecture - Identify platform targets, coroutine patterns, shared code strategy
- Design models - Create sealed classes, data classes, type hierarchies
- 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
- Validate - Run
detektandktlint; 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
- Optimize - Apply inline classes, sequence operations, compilation strategies
- 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
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
// 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
// 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
// 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 classfor state modeling - Use
suspendfunctions for async operations - Leverage type inference but be explicit when needed
- Use
Flowfor reactive streams - Apply scope functions appropriately (
let,run,apply,also,with) - Document public APIs with KDoc
- Use explicit API mode for libraries
- Run
detektandktlintbefore committing - Verify coroutine cancellation is handled (cancel parent scope on teardown)
MUST NOT DO
- Block coroutines with
runBlockingin 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:
- Data models (sealed classes, data classes)
- Implementation file (extension functions, suspend functions)
- Test file with coroutine test support
- 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
Related skills
More from jeffallan/claude-skills and the wider catalog.

laravel-specialist
Build Laravel 10+ applications with Eloquent models, Sanctum auth, queues, APIs, and Livewire components.

golang-pro
Senior Go developer for concurrent systems, microservices, and production-grade performance optimization.

flutter-expert
Senior Flutter engineer for cross-platform apps with Riverpod, Bloc, GoRouter, and performance optimization.

php-pro
Senior PHP developer for modern PHP 8.3+, Laravel, Symfony with strict typing, PHPStan level 9, and enterprise patterns.

kubernetes-specialist
Deploy and manage Kubernetes workloads with secure manifests, RBAC, networking, and troubleshooting.

devops-engineer
Creates Dockerfiles, CI/CD pipelines, Kubernetes manifests, and infrastructure-as-code templates for deployment automation.