Jetbrains Blog
Marco Behler
4 Aug
JetBrains ships a preview VS Code/Cursor extension exposing IntelliJ IDEA's Java and Kotlin language intelligence via LSP, covering completion, navigation, refactoring, and Gradle/Maven/Bazel support; a separate Apache-2.0 Kotlin LSP stays free for pure Kotlin projects.
kotlinjetbrains
Pavel Votyakov
7 Aug
Postmortem on building mongkn, a Kotlin/Native cinterop MongoDB driver: four silent bugs (BSON type mismatch, missing @SerialName for _id, explicit BsonNull breaking sparse indexes, string timestamps breaking TTL indexes) that passed 294 tests yet broke in production, prompting integration-test-only rules for native storage layers.
kotlintestingkmp
Jetbrains Blog
Kerry Beetge
5 Aug
Interview with a DevSecOps engineer at a kids'-phone company on why inconsistent linting across Kotlin, TypeScript and React repos led them to adopt Qodana for unified static analysis, dependency scanning and license auditing to meet CIS/NIST security controls.
kotlinandroid-developers
Dora Badrinath
8 Aug
First entry in a beginner Android series arguing Kotlin developers should default to val over var, since read-only references communicate intent and prevent accidental mutation. Notes MVVM/Compose UI state models rely on val plus copy() rather than in-place mutation.
kotlinandroid-developers
Kotlin Blog
Kodee
4 Aug
JetBrains' monthly Kotlin roundup covers Kotlin's 15th birthday celebration, a new public benchmark for AI coding agents, the 2.4.10 release, BlueJ support, and RevenueCat's Shipaton 2026 KMP app contest.
kotlinkmp
Nemat
7 Aug
A rundown of advanced Kotlin questions asked in Staff-level Android interviews: inline/noinline/crossinline semantics, reified generics, interface and property delegation, value classes, sealed classes vs sealed interfaces, variance, type erasure, and context receivers. Frames these features as design tools for scalable APIs rather than trivia.
▸ VALUE CLASS WRAPPER
@JvmInline
value class UserId(val value: String)
kotlinvalue-classessealed-classescontext-receivers
Mohamed Nabil
3 Aug
Walks through a real race condition where the same chat voice-note gets processed twice after arriving via both a socket event and an API sync, then fixes it with a Mutex-guarded set of in-flight message IDs instead of one global lock, preserving concurrency across independent downloads.
▸ ATOMIC CLAIM MUTEX
private val activeDownloadsMutex = Mutex()
private val activeDownloadIds = mutableSetOf<String>()
private suspend fun claimDownload(messageId: String): Boolean =
activeDownloadsMutex.withLock {
activeDownloadIds.add(messageId)
}
coroutineskotlin
Nemat
3 Aug
Compares Kotlin coroutine synchronization primitives: Mutex enforces exclusive access to a critical section (one coroutine at a time via withLock), while Semaphore caps concurrent access to N coroutines via withPermit. Warns that Semaphore(N>1) still allows race conditions since it limits concurrency, not exclusivity.
▸ MUTEX VS SEMAPHORE
val mutex = Mutex()
mutex.withLock { counter++ }
val semaphore = Semaphore(3)
semaphore.withPermit {
// at most 3 coroutines run this at once
}
coroutineskotlin
Dima Danilov
4 Aug
Builds a mental model for Kotlin coroutine exception handling by separating three questions per coroutine: which builder determines how failure is observed, which parent Job is affected by it, and which scope function determines where it can be caught, distinguishing cancellation from failure propagation.
▸ CHILD CANCEL VS PARENT
val parent = launch {
val child = launch { delay(1_000) }
child.cancelAndJoin()
println("Child cancelled: ${child.isCancelled}")
println("Parent is still active: $isActive")
}
parent.join()
coroutineskotlin
Raphael Pantaleão
3 Aug
Kotlin 2.4.0 made context parameters stable, letting functions declare and receive ambient values (like tenant/trace IDs) without threading them through every signature. Compares them to ThreadLocals and constructor injection, arguing context parameters suit per-call values while constructor injection still wins for per-instance dependencies.
▸ CONTEXT PARAMETER API
data class RequestContext(
val tenant: String,
val traceId: String,
)
context(ctx: RequestContext)
fun loadOrders(): List<Order> =
repository.findByTenant(ctx.tenant)
kotlincontext-receivers
Lib Detekt
cortinico
4 Aug
Detekt 2.0.0-alpha.6 targets Kotlin 2.4.10, Gradle 9.6.1, AGP 9.3.1 and JDK 25; its Gradle task now runs type-resolution analysis on all Kotlin source sets by default, and the ktlint-wrapper rules module raises its minimum to JVM 17.
kotlingradle-plugin
Jamersomfabricio
5 Aug
Explains Kotlin's val/var distinction, clarifying that val only freezes the reference (not object contents) and contrasting read-only vs mutable collections. Recommends isolating mutation to a single manager class returning copies via toList() for safer, more predictable, concurrency-friendly state.
▸ ENCAPSULATE MUTABLE STATE
class ShoppingCartManager {
private val _items = mutableListOf<Product>()
fun getState(): ShoppingCartState {
return ShoppingCartState(
items = _items.toList(),
total = _items.sumOf { it.price }
)
}
}
kotlinkotlin-stdlib
Dmitry Glazunov
7 Aug
Kotlin 2.4.20-Beta2 adds four experimental stdlib functions — allEqual, allEqualBy, allDistinct, allDistinctBy — for collections, sequences and arrays, gated behind ExperimentalStdlibApi. They replace verbose toSet()/distinct() workarounds and fix edge cases like empty-collection equality returning true instead of false.
▸ NEW EQUALITY CHECKS
@OptIn(ExperimentalStdlibApi::class)
fun validateUpload(parts: List<UploadPart>) {
require(parts.isNotEmpty()) { "Upload must contain at least one part" }
require(parts.allEqualBy { it.uploadId }) { "Mixed upload IDs" }
require(parts.allDistinctBy { it.index }) { "Duplicate part index" }
}
kotlinkotlin-stdlib
halo
9 Aug
Covers Kotlin string templates: $variable and ${expression} syntax, calling functions and filtering collections inside interpolated strings, and the common pitfall where $obj.property parses as $obj followed by literal .property text.
▸ INTERPOLATION GOTCHA
val newStudent = Student(name = "Alex", scores = listOf(15, 25, 30))
println("Scores: $newStudent.scores")
println("Scores: ${newStudent.scores}")
kotlinkotlin-stdlib
Muhammad Ali Dev
8 Aug
Explains Kotlin's by lazy delegate: single-execution, cached initialization on first access, the three LazyThreadSafetyMode options (SYNCHRONIZED, PUBLICATION, NONE), how it differs from lateinit, and a memory-leak pitfall when a lazy property captures a short-lived context.
▸ LAZY PROPERTY DELEGATE
val heavyResource: HeavyClass by lazy {
HeavyClass()
}
kotlinkotlin-stdlib
Jetbrains Blog
Irina Mariasova
5 Aug
JetBrains' August Java/Kotlin roundup links a Kotlin Corner covering Kotlin turning 15, the Exposed SQL library, Amper's current state, value semantics in Kotlin, local lifetimes, and an open-sourced KotlinLLM project, alongside broader Java news.
kotlinexposed
Vusal Islamzada
7 Aug
Explains how the JVM's G1 garbage collector organizes the heap into thousands of small regions instead of fixed young/old blocks, using Remembered Sets to track cross-region references and a special path for oversized 'humongous' objects. Also covers tricolor marking and the SATB technique G1 uses to avoid losing live objects during concurrent collection.
kotlin
halo
8 Aug
Beginner explainer distinguishing Kotlin's const val, val, and var: compile-time constant, read-only reference, and mutable reference respectively. Clarifies that val only locks the reference, not the underlying object, and that const val values get inlined at compile time.
kotlin
Dev_Pratixa
3 Aug
Compares Flow, StateFlow, SharedFlow, and LiveData for exposing ViewModel data to Compose UIs, explaining when each fits: Flow for cold streams, StateFlow for persistent UI state, SharedFlow for one-time events, LiveData as the older lifecycle-aware alternative.
▸ STATEFLOW UI STATE
class LoginViewModel : ViewModel() {
private val _isLoggedIn = MutableStateFlow(false)
val isLoggedIn: StateFlow<Boolean> = _isLoggedIn
fun onLoginSuccess() {
_isLoggedIn.value = true
}
}
flowscoroutinesviewmodelmvvm