Kotlin Specialist
Kotlin development: coroutines, flows, Jetpack Compose, multiplatform (KMP), Spring Boot with Kotlin, testing patterns, and migration from Java.
A Kotlin expert covering the full ecosystem: coroutines and structured concurrency, StateFlow/SharedFlow for reactive state, Jetpack Compose UI composition and recomposition optimization, and Kotlin Multiplatform for sharing business logic across Android, iOS, and desktop. Guides Java-to-Kotlin migrations and Spring Boot applications using Kotlin idioms.
Added Mar 20, 2026
$npx skills add johnefemer/skillfish --skill kotlin-specialist What This Skill Can Do
Concrete capabilities you get when you install this skill.
Design coroutine scopes, dispatchers, and structured concurrency hierarchies
Implement StateFlow and SharedFlow for reactive ViewModel patterns
Build performant Jetpack Compose UIs with stable types and derivedStateOf
Share domain logic across Android and iOS with Kotlin Multiplatform
Write Spring Boot endpoints idiomatically with Kotlin DSLs and extension functions
Migrate Java classes to idiomatic Kotlin incrementally with null safety
Real Conversations
See how the Kotlin Specialist skill responds to actual requests. These are representative examples of what your AI agent will produce.
I'm building an Android app repository layer that fetches from a REST API and caches in Room. How should I structure the coroutines and handle errors cleanly?
Use the offline-first pattern with a sealed Result type for clean error propagation:
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()
object Loading : Result<Nothing>()
}
class UserRepository(
private val api: UserApi,
private val dao: UserDao,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO,
) {
fun getUser(id: String): Flow<Result<User>> = flow {
emit(Result.Loading)
// Emit cached data immediately
dao.getUserById(id)?.let { emit(Result.Success(it)) }
// Fetch fresh data
try {
val fresh = withContext(ioDispatcher) { api.getUser(id) }
dao.upsert(fresh.toEntity())
emit(Result.Success(fresh.toDomain()))
} catch (e: IOException) {
emit(Result.Error(e)) // only emits error if no cache available, or in addition to it
}
}
}
// ViewModel consumes with structured scope
class UserViewModel(private val repo: UserRepository) : ViewModel() {
val userState: StateFlow<Result<User>> = repo.getUser(userId)
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), Result.Loading)
}
The SharingStarted.WhileSubscribed(5000) keeps the flow alive 5 seconds after the last subscriber — surviving screen rotations without re-fetching.
Get Started
How to install and use this skill in your preferred environment.
Skills are designed for AI coding agents (Claude Code, Cursor, Windsurf) and IDE-based workflows where the agent can read files, run scripts, and act on your codebase.
Models & Context
Which AI models and context windows work best with this skill.
Recommended Models
Claude Sonnet 4 or GPT-4o for Kotlin/Compose patterns. KMP APIs are evolving — cross-check with kotlinlang.org for the latest multiplatform target configuration.
Context Window
SKILL.md ~5KB. Fits in 32K context; KMP project structures with shared and platform modules benefit from 64K+.
Pro tips for best results
Be specific
Include numbers — users, budget, RPS — so the skill can size the architecture.
Share constraints
Compliance needs, team size, and existing stack all improve the output.
Iterate
Start with a high-level design, then ask follow-ups for IaC, cost analysis, or security review.
Combine skills
Pair with companion skills below for end-to-end coverage.
Works Great With
These skills complement Kotlin Specialist for end-to-end coverage. Install them together for better results.
Ready to try Kotlin Specialist?
Install the skill and start getting expert-level guidance in your workflow — any agent, any IDE.
$npx skills add johnefemer/skillfish --skill kotlin-specialist