Kotlin
https://github.com/JetBrains/kotlin/releases/tag/v2.4.20-Beta1
Major changes:
1. Context parameters going Stable. Explicit context arguments move to Stable โ the headline of the release. KT-86089
2. Companion blocks & extensions. A new language capability landing across the whole toolchain: resolution, reflection (call/callBy), light classes, REPL/scripts, metadata. Enable it with the new (off-by-default) flag
3. Native: incremental compilation on by default. K/N builds are finally faster out of the box. KT-86657
4.
5. PowerAssert heading to initial release. Runtime ABI stabilized, runtime dependency added automatically. KT-86170 KT-85250
6. Lombok-style logging on Kotlin classes: @Slf4j, @Log4j2, @JBossLog, @Flogger, @CommonsLog, @XSlf4j, plus @Log and @ToString. KT-81622 KT-85762
7. Collection literals moving forward. Under
8. Name-based destructuring. Stabilization of the only-syntax variant (targeting 2.5). KT-86201
9. Kotlin/JS catches up. ES2015 syntax in the js() function, KDoc export to .d.ts, @JsExport for annotation classes. KT-21626 KT-56493
10. Stdlib. Common atomic types and a new StackTraceRecoverable interface. KT-62423 KT-86595
Bonus: official deprecation of the K1 compiler has begun (KT-75372), and experimental language version 2.6 was added (KT-85667).
2.4.20-Beta1https://github.com/JetBrains/kotlin/releases/tag/v2.4.20-Beta1
Major changes:
1. Context parameters going Stable. Explicit context arguments move to Stable โ the headline of the release. KT-86089
2. Companion blocks & extensions. A new language capability landing across the whole toolchain: resolution, reflection (call/callBy), light classes, REPL/scripts, metadata. Enable it with the new (off-by-default) flag
-Xcompanion-blocks-and-extensions. KT-84289 KT-851873. Native: incremental compilation on by default. K/N builds are finally faster out of the box. KT-86657
4.
when via invokedynamic on JVM 21+ by default. More compact bytecode, fewer synthetic classes. KT-780795. PowerAssert heading to initial release. Runtime ABI stabilized, runtime dependency added automatically. KT-86170 KT-85250
6. Lombok-style logging on Kotlin classes: @Slf4j, @Log4j2, @JBossLog, @Flogger, @CommonsLog, @XSlf4j, plus @Log and @ToString. KT-81622 KT-85762
7. Collection literals moving forward. Under
-Xcollection-literals: type inference in delegate expressions, support in annotations, of operator via companion block. KT-842958. Name-based destructuring. Stabilization of the only-syntax variant (targeting 2.5). KT-86201
9. Kotlin/JS catches up. ES2015 syntax in the js() function, KDoc export to .d.ts, @JsExport for annotation classes. KT-21626 KT-56493
10. Stdlib. Common atomic types and a new StackTraceRecoverable interface. KT-62423 KT-86595
Bonus: official deprecation of the K1 compiler has begun (KT-75372), and experimental language version 2.6 was added (KT-85667).
GitHub
Release Kotlin 2.4.20-Beta1 ยท JetBrains/kotlin
Changelog
Analysis API
KT-85418 Implement an API for accessing deserialized file annotations in Analysis API
KT-74448 K2. False positive MISSING_DEPENDENCY_SUPERCLASS in LinkedListTest.kt, kotlinx...
Analysis API
KT-85418 Implement an API for accessing deserialized file annotations in Analysis API
KT-74448 K2. False positive MISSING_DEPENDENCY_SUPERCLASS in LinkedListTest.kt, kotlinx...
๐ฅ7
Kotlin
https://github.com/JetBrains/kotlin/releases/tag/v2.4.10-RC
As usual, a bug-fix release โ but there's one interesting change I noticed:
Since the Kotlin Toolchain uses
The package itself (e.g.
A
2.4.10-RChttps://github.com/JetBrains/kotlin/releases/tag/v2.4.10-RC
As usual, a bug-fix release โ but there's one interesting change I noticed:
Since the Kotlin Toolchain uses
kotlin as its command name, the current kotlin command (which is the compiler) is being renamed to kotlinr. 2.4.10 is the first release that ships both: kotlin and kotlinr.The package itself (e.g.
brew install kotlin, sdk install kotlin) will be renamed to kotlinc. So the future end state for the ecosystem:
sdk install kotlin # install kotlin toolchain, command: kotlin
sdk install kotlinc # install kotlin compiler, command: kotlinr
A
kotlinc package but a kotlinr executable โ confusing, right?GitHub
Release Kotlin 2.4.10-RC ยท JetBrains/kotlin
Changelog
Compiler
KT-86939 JVM: IllegalStateException "No value for annotation parameter" when using const val in nested Java annotation array argument
KT-83766 K2: Wrong sourcePsi is s...
Compiler
KT-86939 JVM: IllegalStateException "No value for annotation parameter" when using const val in nested Java annotation array argument
KT-83766 K2: Wrong sourcePsi is s...
๐ค9๐ฅ1
Some updates to new features timelines:
KEEP-0449: Companion extensions and blocks - experimental 2.5.0, stable 2.6.0 (preliminary)
KEEP-0462: Rich Errors, aka Error Union Types - experimental 2.5.0
KEEP-0450: Typed Delegate Access - experimental 2.5.20
KEEP-0449: Companion extensions and blocks - experimental 2.5.0, stable 2.6.0 (preliminary)
KEEP-0462: Rich Errors, aka Error Union Types - experimental 2.5.0
KEEP-0450: Typed Delegate Access - experimental 2.5.20
GitHub
KEEP/proposals/KEEP-0449-companions-block-extension.md at main ยท Kotlin/KEEP
Kotlin Evolution and Enhancement Process. Contribute to Kotlin/KEEP development by creating an account on GitHub.
๐ฅ5๐ค1
Kotlin
https://github.com/JetBrains/kotlin/releases/tag/v2.4.10
What's new https://telegram.me/TheDailyKotlin/621
2.4.10 has been released ๐๏ธ๏ธ๏ธ๏ธ๏ธ๏ธhttps://github.com/JetBrains/kotlin/releases/tag/v2.4.10
What's new https://telegram.me/TheDailyKotlin/621
GitHub
Release Kotlin 2.4.10 ยท JetBrains/kotlin
Changelog
Backend. Wasm
KT-87066 K/Wasm: Not all files are presented in compiler output directory with multimodule-closed-world and incremental compilation
Compiler
KT-86939 JVM: IllegalStateExc...
Backend. Wasm
KT-87066 K/Wasm: Not all files are presented in compiler output directory with multimodule-closed-world and incremental compilation
Compiler
KT-86939 JVM: IllegalStateExc...
๐ฅ3๐ค1
KEEP-0466: Expect with fallback
TL;DR
โข Expect declarations may define a fallback implementation.
โข The fallback implementation implementation is used when there's no corresponding actual declaration in a platform for an expect.
โข Fallback implementation must define the declaration completely ("all-or-nothing" rule); leaving some parts unspecified is not allowed.
TL;DR
โข Expect declarations may define a fallback implementation.
โข The fallback implementation implementation is used when there's no corresponding actual declaration in a platform for an expect.
โข Fallback implementation must define the declaration completely ("all-or-nothing" rule); leaving some parts unspecified is not allowed.
Kotlin
https://github.com/JetBrains/kotlin/releases/tag/v2.4.20-Beta2
Major changes:
1. Swift Export: cross-language inheritance is here. The umbrella ticket for cross-language subtyping is closed: Swift types can subclass Kotlin classes โ with supercalls, properties, async members, default interface methods. Sealed classes are supported too. KT-66888 KT-80000
2. Full value classes (KEEP-0453) take shape. Short-form name-based destructuring, abstract value classes, and the old @JvmInline multi-field prototype is removed. Still experimental: builds using them are deliberately poisoned. KT-84904 KT-86018 KT-86849
3. KMP: fragment-aware incremental compilation on JVM. The OSIP-75 push: commonMain will no longer accidentally see jvmMain declarations during IC, removing the need for the non-incremental fallback. Landed behind a feature flag while the rollout continues. KT-87490 KT-86410
4. Wasm on all fronts. Three compilation modes (monolith / multimodule open & closed world), wasmtime as a WASI runtime in Gradle, index range checks on by default, and a prototype of suspend functions on top of the stack-switching proposal. KT-86919 KT-86633 KT-73452 KT-76207
5. Native: release builds with compiler caches. First step towards fast release builds: opt-in caches + module-local optimizations instead of full LTO. KT-80373
6. Browser tests move to Playwright. New JS browser-test DSL: webpack + mocha + playwright, configurable dev-server URL and custom browser executables. KT-86260 KT-87484
7. kotlin-reflect stops slowing you down.
8. stdlib & kotlin-test.
9. Xcode 27 support, new floors. Minimum deployment targets bump: iOS 15, macOS 12, watchOS 9 (armv7k is gone), tvOS 15. KT-87187
10. The great cleanup continues. Legacy JS backend sources are deleted, and @K1Deprecation now covers all public declarations of K1 modules. KT-70223 KT-86046
Bonus: the Eager Lambda Analysis language features got postponed (Unit conversions on arbitrary expressions โ indefinitely, KT-86877 KT-87439), and OPERATOR_RENAMED_ON_IMPORT was downgraded from error to warning (KT-83880).
2.4.20-Beta2https://github.com/JetBrains/kotlin/releases/tag/v2.4.20-Beta2
Major changes:
1. Swift Export: cross-language inheritance is here. The umbrella ticket for cross-language subtyping is closed: Swift types can subclass Kotlin classes โ with supercalls, properties, async members, default interface methods. Sealed classes are supported too. KT-66888 KT-80000
2. Full value classes (KEEP-0453) take shape. Short-form name-based destructuring, abstract value classes, and the old @JvmInline multi-field prototype is removed. Still experimental: builds using them are deliberately poisoned. KT-84904 KT-86018 KT-86849
3. KMP: fragment-aware incremental compilation on JVM. The OSIP-75 push: commonMain will no longer accidentally see jvmMain declarations during IC, removing the need for the non-incremental fallback. Landed behind a feature flag while the rollout continues. KT-87490 KT-86410
4. Wasm on all fronts. Three compilation modes (monolith / multimodule open & closed world), wasmtime as a WASI runtime in Gradle, index range checks on by default, and a prototype of suspend functions on top of the stack-switching proposal. KT-86919 KT-86633 KT-73452 KT-76207
5. Native: release builds with compiler caches. First step towards fast release builds: opt-in caches + module-local optimizations instead of full LTO. KT-80373
6. Browser tests move to Playwright. New JS browser-test DSL: webpack + mocha + playwright, configurable dev-server URL and custom browser executables. KT-86260 KT-87484
7. kotlin-reflect stops slowing you down.
typeOf() and friends no longer degrade when kotlin-reflect appears on the classpath โ the thing that used to bite Ktor and kotlinx.serialization. KT-736578. stdlib & kotlin-test.
allDistinct()/allDistinctBy{} (a 2019 request!), JUnit5-style lazy assertion messages, and the new @EqualityBound annotation. KT-30270 KT-31305 KT-867669. Xcode 27 support, new floors. Minimum deployment targets bump: iOS 15, macOS 12, watchOS 9 (armv7k is gone), tvOS 15. KT-87187
10. The great cleanup continues. Legacy JS backend sources are deleted, and @K1Deprecation now covers all public declarations of K1 modules. KT-70223 KT-86046
Bonus: the Eager Lambda Analysis language features got postponed (Unit conversions on arbitrary expressions โ indefinitely, KT-86877 KT-87439), and OPERATOR_RENAMED_ON_IMPORT was downgraded from error to warning (KT-83880).
GitHub
Release Kotlin 2.4.20-Beta2 ยท JetBrains/kotlin
Changelog
Analysis API
KT-86546 Check suspicious when over ConeKotlinType in ConeTypeCompatibilityChecker
KT-65417 K2 IDE: KTOR false positive expect-actual matching error on enum class because of...
Analysis API
KT-86546 Check suspicious when over ConeKotlinType in ConeTypeCompatibilityChecker
KT-65417 K2 IDE: KTOR false positive expect-actual matching error on enum class because of...
๐ฅ10
KotlinLLM: LLM-generated bodies, committed as Kotlin source
JetBrains Research has open-sourced KotlinLLM under Apache 2.0 โ a research prototype for delegating runtime logic to an LLM from Kotlin code, without keeping the model in the request path.
The unit is a Smart macro: an ordinary Kotlin call whose body is generated source code. Two are exposed โ
The argument against the obvious alternative is stated plainly: calling the model on every invocation is slow, non-deterministic and costly, and it makes the application depend on an LLM service at runtime. So KotlinLLM commits to three properties instead. The call site is explicit, so an LLM-backed feature is visible in review. The behaviour is persistent โ saved as ordinary Kotlin source under
The evolution loop is the interesting part. The app runs under JDI with regenerate hooks registered as breakpoints. When the generated logic meets a scenario it cannot handle, it is required to fall through to a hook rather than silently return something wrong. Execution suspends, the plugin captures runtime values and type information from the frame, an LLM agent inspects the code, writes a narrow update into the generated source, compiles it, redefines the class in the running VM, and the original call is retried against the new implementation.
Two evaluations. Spring Petclinic Kotlin, adapted with 18
The constraints are honest. Kotlin/JVM only, because the evolution loop depends on JVM class redefinition through JDI. IntelliJ IDEA 2025.2.x, JDK 21, an OpenAI key in
It is a research prototype, not a production tool. But it inverts the usual pattern in a way worth thinking about: the model writes the function once, and the JVM runs it forever.
GitHub ยท KotlinConf 2026 talk ยท Recording ยท Write-up
JetBrains Research has open-sourced KotlinLLM under Apache 2.0 โ a research prototype for delegating runtime logic to an LLM from Kotlin code, without keeping the model in the request path.
The unit is a Smart macro: an ordinary Kotlin call whose body is generated source code. Two are exposed โ
asLlm<F, T>(from, hint) turns unstructured input into typed Kotlin values, and mockLlm<T>() builds stateful interface implementations to use as test doubles.val issuesApiUrl: String = asLlm(repoInput, hint = "GitHub API URL: get all issues, including closed")val issues: List<Issue> = asLlm(response, hint = "Return all beginner-friendly issues for this repository")The argument against the obvious alternative is stated plainly: calling the model on every invocation is slow, non-deterministic and costly, and it makes the application depend on an LLM service at runtime. So KotlinLLM commits to three properties instead. The call site is explicit, so an LLM-backed feature is visible in review. The behaviour is persistent โ saved as ordinary Kotlin source under
com.jetbrains.kotlinllm.generated, so it can be committed, reviewed, tested and shipped like any other code. And it is portable: once generated, the code runs as plain Kotlin without the plugin, with no extra latency or cost.The evolution loop is the interesting part. The app runs under JDI with regenerate hooks registered as breakpoints. When the generated logic meets a scenario it cannot handle, it is required to fall through to a hook rather than silently return something wrong. Execution suspends, the plugin captures runtime values and type information from the frame, an LLM agent inspects the code, writes a narrow update into the generated source, compiles it, redefines the class in the running VM, and the original call is retried against the new implementation.
Two evaluations. Spring Petclinic Kotlin, adapted with 18
asLlm call sites: 24/24 application scenarios completed after Smart macro evolution, a 100% hot-reload success rate, and roughly 1% runtime overhead. A GitHub Beginner Issue Radar reached ~0.89 recall on ground-truth beginner labels across 30,000+ issues from 20 repositories.The constraints are honest. Kotlin/JVM only, because the evolution loop depends on JVM class redefinition through JDI. IntelliJ IDEA 2025.2.x, JDK 21, an OpenAI key in
.kotlinllm. Generated updates are deliberately narrow โ the agent does not get to rewrite arbitrary project files.It is a research prototype, not a production tool. But it inverts the usual pattern in a way worth thinking about: the model writes the function once, and the JVM runs it forever.
GitHub ยท KotlinConf 2026 talk ยท Recording ยท Write-up
GitHub
GitHub - JetBrains-Research/kotlinllm-plugin: KotlinLLM is an IntelliJ IDEA plugin prototype for experimenting with LLM-drivenโฆ
KotlinLLM is an IntelliJ IDEA plugin prototype for experimenting with LLM-driven Smart macros in Kotlin, enabling code generation, runtime updates, and hot-reloading. - JetBrains-Research/kotlinllm...
๐ฅ5๐ค4
Kotlin
The release candidate is out. Its changelog is the delta since Beta2 โ 30 entries, at least 24 of them fixes โ so this is the shape 2.4.20 will ship in.
Major changes:
1. Kotlin/Native incremental compilation is off again. Switched on by default for Beta1 and Beta2 as a stabilization experiment, it is turned back off for the RC โ the only carry-over ticket in this changelog. Still opt-in via
2. The 2.4.0 Gradle sync regression is fixed: a 400+ module KMP project reported sync at 74.8s โ 105.4s (+41%), Gradle execution alone up 76%. Dependency maps and host-specific metadata are now cached per source set โ KT-87790
3.
4. Compose compiler: cross-module getter and setter calls miscompiled into spurious runtime errors, a composable-singleton bug with type parameters, and a crash on a super call to a defaulted
5.
6. J2KLIB, the klib-producing compiler that emits no bytecode, gets its own changelog section: dependency deserialization drops from
7. Build tooling. The compiler measured user and CPU time around every class file read, a large Linux penalty; that now needs
8. Wasm tooling setup no longer fails on the outdated bundled
Bonus: 2.4.20 learns to complain about
2.4.20-RCThe release candidate is out. Its changelog is the delta since Beta2 โ 30 entries, at least 24 of them fixes โ so this is the shape 2.4.20 will ship in.
Major changes:
1. Kotlin/Native incremental compilation is off again. Switched on by default for Beta1 and Beta2 as a stabilization experiment, it is turned back off for the RC โ the only carry-over ticket in this changelog. Still opt-in via
kotlin.incremental.native=true โ KT-866572. The 2.4.0 Gradle sync regression is fixed: a 400+ module KMP project reported sync at 74.8s โ 105.4s (+41%), Gradle execution alone up 76%. Dependency maps and host-specific metadata are now cached per source set โ KT-87790
3.
ClassCastException: Float cannot be cast to Unit when a suspend call's result is discarded in a when branch, seen in a plain LaunchedEffect. A Unit-returning suspend function can be resumed with a non-Unit value; the RC restores the defensive discard an earlier soundness fix removed โ KT-874994. Compose compiler: cross-module getter and setter calls miscompiled into spurious runtime errors, a composable-singleton bug with type parameters, and a crash on a super call to a defaulted
@Composable function in another module โ b/537617330, b/543684938, KT-880285.
NoWhenBranchMatchedException on Native for an exhaustive when over a sealed interface; a CCE on a member extension property delegated to a property reference; and scripts can again use a type from an @file:Import-ed script โ KT-85403, KT-87983, KT-879586. J2KLIB, the klib-producing compiler that emits no bytecode, gets its own changelog section: dependency deserialization drops from
ALL to WITH_INLINE_BODIES, and Beta2's unbound SuspendFunctionN symbols, which broke all suspend code, are fixed โ KT-88176, KT-883067. Build tooling. The compiler measured user and CPU time around every class file read, a large Linux penalty; that now needs
-Xdetailed-perf. KGP reverted the Beta1 task-path logging prefix IntelliJ's parser could not handle, and the per-build BuildMetricsService leak that grew daemon memory is gone โ KT-87868, KT-87256, KT-880848. Wasm tooling setup no longer fails on the outdated bundled
yarn.lock that broke offline builds, and the Swift PM lock file is no longer ignored when a dependency moves from exact() to from() โ KT-88115, KT-88154Bonus: 2.4.20 learns to complain about
.kar files on the compilation classpath. Kotlin Archive is a proposed format bundling KMP metadata and non-JVM klibs into one artifact, an answer to Maven Central's limits. The format isn't here โ only the diagnostic, so consumers get a message instead of silence once dependencies start publishing archives โ KT-87911GitHub
Release Kotlin 2.4.20-RC ยท JetBrains/kotlin
Changelog
Backend. J2KLIB
KT-88165 Add Support for -XheaderModeType=compilation to improve header compilation performance
KT-86239 [JKLIB] Investigate which type system context is needed in JklibI...
Backend. J2KLIB
KT-88165 Add Support for -XheaderModeType=compilation to improve header compilation performance
KT-86239 [JKLIB] Investigate which type system context is needed in JklibI...
๐ฅ3
Michail Zareฤenskij: Every language with generics has intersection types
๐ฅ3๐ค1
Resilient sync: Gradle stops taking the IDE down with it
Until now one broken subproject or convention plugin aborted the entire sync โ a 100-project build lost completion and highlighting exactly when you needed them to fix the build. Resilient sync changes the contract: the new
Gradle blog
Until now one broken subproject or convention plugin aborted the entire sync โ a 100-project build lost completion and highlighting exactly when you needed them to fix the build. Resilient sync changes the contract: the new
BuildController.fetch(...) in the Tooling API returns the models that did resolve alongside structured failure info instead of throwing, so the IDE keeps working code fully usable and marks only what's actually broken. Nothing to enable โ Gradle 9.7 plus IntelliJ IDEA 2026.2 switch it on by themselves.Gradle blog
blog.gradle.org
Resilient Sync: Your IDE Keeps Helping even when your Build is Broken
Gradle 9.7 and IntelliJ IDEA 2026.2 bring resilient sync to IDE users. When part of your build fails to configure, Gradle still hands the IDE models for everything that succeeded, so you keep code completion...
๐ฅ11๐ค1
Kotlin Toolchain
Kotlin Toolchain 0.12.0 is the project's biggest release yet. First, the headline capabilities: KMP publishing, incremental JVM builds, a runnable Wasm target and IDE-free Hot Reload.
Major changes:
1. KMP library publication lands in preview. The toolchain compiles KMP metadata, generates
2. Kotlin incremental compilation for JVM targets, through the Build Tools API that the toolchain already used for non-incremental compiler calls. It is on by default with Kotlin 2.4 and newer. Compiler warnings are replayed when a compilation is served from the cache, instead of disappearing after the first run โ KTC-4511, KTC-4491
3.
4. Compose Hot Reload works without the IDE. The standalone CLI watches the filesystem and reloads even after build-model changes. A Compose Hot Reload MCP server ships too, so agents can drive the reload loop โ KTC-5475, KTC-5486
5. JVM libraries work in JVM+Android shared fragments. Ordinary JVM dependencies โ including local
6. Project-root-relative
7. DataFrame and Power Assert are one line of config.
The CLI got friendlier. Completion knows
0.12.0 โ build, run, publish (1/2)Kotlin Toolchain 0.12.0 is the project's biggest release yet. First, the headline capabilities: KMP publishing, incremental JVM builds, a runnable Wasm target and IDE-free Hot Reload.
Major changes:
1. KMP library publication lands in preview. The toolchain compiles KMP metadata, generates
kotlin-project-structure-metadata.json, assembles the all-metadata JAR and emits Gradle .module metadata. Native interop is covered too: cinterop KLIBs are commonized and published. Compose resources are not included yet โ KTC-719, KTC-5437, KTC-56982. Kotlin incremental compilation for JVM targets, through the Build Tools API that the toolchain already used for non-incremental compiler calls. It is on by default with Kotlin 2.4 and newer. Compiler warnings are replayed when a compilation is served from the cache, instead of disappearing after the first run โ KTC-4511, KTC-4491
3.
wasm-js/app can be built and run. Build output contains the Wasm binary, JS loaders, resources and an import map; kotlin run starts a Ktor static server and opens the browser. Transitive NPM dependencies are installed with pnpm, making libraries such as kotlinx-datetime work, and the Compose Multiplatform template now includes a Wasm app โ KTC-5569, KTC-5570, KTC-5572, KTC-56834. Compose Hot Reload works without the IDE. The standalone CLI watches the filesystem and reloads even after build-model changes. A Compose Hot Reload MCP server ships too, so agents can drive the reload loop โ KTC-5475, KTC-5486
5. JVM libraries work in JVM+Android shared fragments. Ordinary JVM dependencies โ including local
jvm/lib modules โ are now visible directly from code shared by the two targets โ KTC-4474, KTC-55026. Project-root-relative
// paths. No more ../../foo in dependency blocks: paths are copy-pasteable and template-friendly, and moving a module no longer rewrites its own references to other modules โ KTC-21397. DataFrame and Power Assert are one line of config.
settings.kotlin.dataframe: enabled switches on the experimental DataFrame compiler plugin, and Power Assert no longer needs its runtime library declared by hand โ KTC-4881, KTC-5500The CLI got friendlier. Completion knows
kotlin do commands and -m/--module values; run offers an interactive module picker and inherits terminal I/O, so TUI apps work โ KTC-5608, KTC-5610, KTC-4691, KTC-5596GitHub
Release 0.12.0 ยท JetBrains/kotlin-toolchain
Full Changelog: v0.11.1...v0.12.0
See our release blog post (coming soon) for the highlights, and to learn about the tooling improvements.
Breaking changes
KTC-5221 โ Update default JDK version to...
See our release blog post (coming soon) for the highlights, and to learn about the tooling improvements.
Breaking changes
KTC-5221 โ Update default JDK version to...
๐ฅ3
Kotlin Toolchain
Part one covered the headline capabilities of Kotlin Toolchain 0.12.0. Part two: new baselines and platform defaults, broader dependency compatibility, safer publishing and a much better IDE plugin.
Major changes:
1. The baseline moves forward. The default JDK is 25 and the CLI now requires JDK 17; minimum Kotlin is 2.2.20, default 2.4.10. Android
2. Platform and CLI cleanup.
3. Android SDK configuration becomes forward-compatible. API levels are integers instead of a closed enum, API 37 works, minor compile SDK versions are supported, and the Android Build Tools version is configurable โ KTC-5623, KTC-5626
4. Migrating from Maven gets smoother.
5. Maven and AAR resolution handles more real-world metadata. Dependency groups with
6. Publishing is harder to break. KLIB checksums and signatures now pass Maven Central, published checksum algorithms are configurable, and publishing to Maven Local is incrementally cached and quieter โ KTC-5680, KTC-5483
7. The IDE closes major gaps. Android and common-fragment Compose previews, Compose resources completion and navigation, and code insight for the DataFrame compiler plugin land in the Kotlin Toolchain plugin for IntelliJ IDEA 2026.2.1 โ KTC-5394, KTC-4449, KTC-5440, KTC-5530
Diagnostics got sharper. They point to precise source ranges, catch incompatible JDK/Kotlin combinations earlier and render task errors cleanly; tests get a real progress widget โ KTC-4846, KTC-5006, KTC-5515, KTC-4233
0.12.0 โ migration, compatibility, IDE (2/2)Part one covered the headline capabilities of Kotlin Toolchain 0.12.0. Part two: new baselines and platform defaults, broader dependency compatibility, safer publishing and a much better IDE plugin.
Major changes:
1. The baseline moves forward. The default JDK is 25 and the CLI now requires JDK 17; minimum Kotlin is 2.2.20, default 2.4.10. Android
minSdk becomes 24, with new defaults for Ktor 3.5.2, Compose 1.11.1 and Spring Boot 4.1.0 โ KTC-5708, KTC-57122. Platform and CLI cleanup.
ios/app no longer supports iosX64; macosX64 leaves the defaults for macos/app, and watchosArm32 is deprecated. The old --root, --build-output and --shared-caches-root options are gone; publish standardizes on -m/--module and asks for --transitive or --non-transitive when the selected modules depend on other local ones โ KTC-5462, KTC-57023. Android SDK configuration becomes forward-compatible. API levels are integers instead of a closed enum, API 37 works, minor compile SDK versions are supported, and the Android Build Tools version is configurable โ KTC-5623, KTC-5626
4. Migrating from Maven gets smoother.
convert-project gained --enable-compatibility-plugins, so Maven plugins come out ready to run instead of enabled: false one by one. Profile activation is fixed too: the unix family now matches macOS, and all activation criteria must hold, not just one โ KTC-5200, KTC-56425. Maven and AAR resolution handles more real-world metadata. Dependency groups with
type=pom, classified artifacts published beside packaging=pom, nested BOMs and AARs without classes.jar now resolve โ KTC-5270, KTC-55836. Publishing is harder to break. KLIB checksums and signatures now pass Maven Central, published checksum algorithms are configurable, and publishing to Maven Local is incrementally cached and quieter โ KTC-5680, KTC-5483
7. The IDE closes major gaps. Android and common-fragment Compose previews, Compose resources completion and navigation, and code insight for the DataFrame compiler plugin land in the Kotlin Toolchain plugin for IntelliJ IDEA 2026.2.1 โ KTC-5394, KTC-4449, KTC-5440, KTC-5530
Diagnostics got sharper. They point to precise source ranges, catch incompatible JDK/Kotlin combinations earlier and render task errors cleanly; tests get a real progress widget โ KTC-4846, KTC-5006, KTC-5515, KTC-4233
Telegram
The Daily Kotlin
Kotlin Toolchain 0.12.0 โ build, run, publish (1/2)
Kotlin Toolchain 0.12.0 is the project's biggest release yet. First, the headline capabilities: KMP publishing, incremental JVM builds, a runnable Wasm target and IDE-free Hot Reload.
Major changes:
1.โฆ
Kotlin Toolchain 0.12.0 is the project's biggest release yet. First, the headline capabilities: KMP publishing, incremental JVM builds, a runnable Wasm target and IDE-free Hot Reload.
Major changes:
1.โฆ
๐ฅ2๐ค2
kortex: Kotlin Toolchain skill updated for 0.12
The
Install it in Claude Code:
Installation instructions for Codex and Junie are available in the repository README.
Have fun with Kotlin!
GitHub
The
kotlin-toolchain skill in kortex now supports Kotlin Toolchain 0.12. Support for projects still pinned to 0.11 remains available.Install it in Claude Code:
/plugin marketplace add Heapy/kortex/plugin install kortex@kortexInstallation instructions for Codex and Junie are available in the repository README.
Have fun with Kotlin!
GitHub
GitHub
GitHub - Heapy/kortex: Agent Skills for Kotlin Development
Agent Skills for Kotlin Development. Contribute to Heapy/kortex development by creating an account on GitHub.
๐ค1
Kotlin
Out, a week after RC2. One entry, one Critical fix โ a
2.4.20-RC3Out, a week after RC2. One entry, one Critical fix โ a
ClassCastException from suspend conversion, broken since Beta1 โ KT-88953. The release is around the corner.GitHub
Release Kotlin 2.4.20-RC3 ยท JetBrains/kotlin
Changelog
Compiler
KT-88953 CCE caused by suspend conversion of nullable argument to nullable expected type
Compiler
KT-88953 CCE caused by suspend conversion of nullable argument to nullable expected type
๐ฅ2๐ค1
Kotlin
2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes. The next two cover stdlib and platforms, then build tooling and fixes.
Major changes:
1.
2. Explicit context arguments and name-based destructuring. Both are marked Stable for language version 2.5. In 2.4.20, the default language version is 2.4, so they still require
3. Companion blocks and extensions. The new flag is
4. Collection literals. With
5. Full value classes (KEEP-0454) remain experimental. The old
6. Eager lambda analysis.
7. Lombok logging annotations. Kotlin classes now support
8. K1 deprecation. Public declarations in K1 modules now carry
9. Compiler CLI. Removed arguments and declarations such as
Experimental
Correction to our Beta1 post. PowerAssert's initial release was in 2.4.0, and common atomic types arrived in 2.1.20. Lombok's
2.4.20 (1/3)2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes. The next two cover stdlib and platforms, then build tooling and fixes.
Major changes:
1.
when via invokedynamic. This optimization is now Stable and enabled by default on JVM 21+. The compiler uses a typeSwitch bootstrap for type checks in when, replacing a series of instanceof checks. The -Xwhen-expressions=indy flag is no longer needed โ KT-780792. Explicit context arguments and name-based destructuring. Both are marked Stable for language version 2.5. In 2.4.20, the default language version is 2.4, so they still require
-Xexplicit-context-arguments and -Xname-based-destructuring=only-syntax. The destructuring flag also supports selecting an earlier migration phase โ KT-86089, KT-862013. Companion blocks and extensions. The new flag is
-Xcompanion-blocks-and-extensions. Changes include member resolution, support for the invoke operator and Java light classes. References to static members of generic classes can omit type arguments: GenericClass::staticMember โ KT-85187, KT-84289, KT-849564. Collection literals. With
-Xcollection-literals, the compiler now infers types in delegate expressions, uses the new resolution logic in annotations and supports companion block of operators. Control-flow analysis now handles lambdas inside literals โ KT-84333, KT-85535, KT-84295, KT-830405. Full value classes (KEEP-0454) remain experimental. The old
@JvmInline multi-field prototype and -Xvalue-classes flag have been removed. Value classes support short-form name-based destructuring. Builds using the feature produce binaries marked as pre-release โ KT-86849, KT-86018, KT-868956. Eager lambda analysis.
-Xeager-lambda-analysis enables overload resolution by return type for calls with several lambda arguments. Type parameters bounded by Throwable can be inferred as their upper bound, removing the need for explicit arguments in calls such as compute<T, Throwable> { }. Unit conversions on arbitrary expressions were removed from the flag and postponed indefinitely โ KT-85593, KT-82961, KT-874397. Lombok logging annotations. Kotlin classes now support
@Slf4j, @Log4j, @Log4j2, @CommonsLog, @Flogger, @JBossLog and @XSlf4j. The plugin reports ARGUMENT_IS_NOT_SUPPORTED for annotation parameters it ignores โ KT-81622, KT-868428. K1 deprecation. Public declarations in K1 modules now carry
@K1Deprecation. The PSI-mode switch, -Xuse-fir-lt=false, is deprecated and scheduled for removal in the 2.5 series โ KT-86046, KT-862849. Compiler CLI. Removed arguments and declarations such as
val _ = unitCall() now produce warnings. The runner is also available as kotlinr to avoid a name conflict with Kotlin Toolchain's kotlin command. The existing kotlin runner remains available โ KT-86473, KT-84618, KT-86930Experimental
kotlinc native image. The first GraalVM build is available in the GitHub release assets for Linux, macOS and Windows. It is a drop-in replacement for kotlinc with faster startup, and bundles the Serialization, Compose, All-open, no-arg, SAM with receiver, Assignment, Lombok and Power-assert plugins โ KT-82373.Correction to our Beta1 post. PowerAssert's initial release was in 2.4.0, and common atomic types arrived in 2.1.20. Lombok's
@ToString support is still in progress.The JetBrains Blog
Kotlin 2.4.20 Released - The JetBrains Blog
The Kotlin 2.4.20 release is out! This release brings performance improvements, bug fixes, and tooling updates, and more. Take a look!
๐ฅ2
Kotlin
The second part of our 2.4.20 notes covers the standard library, Kotlin/Native, Swift export, Wasm and JS.
Major changes:
1. Stdlib.
2. Swift export. Swift classes can extend exported Kotlin classes and implement Kotlin interfaces using Swift libraries. This supports supercalls, properties, async members and default interface methods. Sealed hierarchies are exposed as Swift enums through a generated
3. SwiftPM. The
4. Native. Incremental compilation is back to opt-in and has Beta status. Enable it with
5. Wasm compilation modes.
6. Wasm checks and binary size. Array range checks are enabled by default, with an optimization pass to remove redundant checks. Fun interfaces and lambdas share a base class per function type. The commit reports 10โ15% smaller production binaries; the docs report 5โ10% for the KotlinConf app. Superclass companions now initialize before subclass companions, as on JVM โ KT-73452, KT-83159, KT-40768
7. Wasm interop and coroutines. Top-level
8. JS. The new Experimental browser-test DSL,
Corrections to our Beta1 post. ES2015 syntax in
2.4.20 (2/3)The second part of our 2.4.20 notes covers the standard library, Kotlin/Native, Swift export, Wasm and JS.
Major changes:
1. Stdlib.
StackTraceRecoverable (KEEP-0461) lets exceptions with extra constructor arguments define how kotlinx.coroutines copies them for stack-trace recovery, without a coroutines dependency. Collections, sequences and arrays gain allEqual/allEqualBy and allDistinct/allDistinctBy. kotlin-test assertions accept lazy message lambdas, as in JUnit 5. All these APIs are Experimental โ KT-86595, KT-10380, KT-30270, KT-313052. Swift export. Swift classes can extend exported Kotlin classes and implement Kotlin interfaces using Swift libraries. This supports supercalls, properties, async members and default interface methods. Sealed hierarchies are exposed as Swift enums through a generated
sealedType() function, allowing exhaustive switch statements โ KT-66888, KT-86406, KT-86890, KT-800003. SwiftPM. The
assemble<Name>XCFramework task now generates a Package.swift with the framework's SwiftPM dependencies. Applying the CocoaPods plugin displays a suggestion to migrate to SwiftPM import. The release also fixes a task-scheduling deadlock during SwiftPM import โ KT-84420, KT-86047, KT-876674. Native. Incremental compilation is back to opt-in and has Beta status. Enable it with
kotlin.incremental.native=true. JetBrains plans to enable it by default in the next releases. Initial cache support for -opt builds requires kotlin.native.binary.enableReleaseBinaryCache in the compiler and kotlin.internal.native.enableReleaseBinaryCache in Gradle. Optimization passes still need adapting before release builds can avoid full LTO. Virtual-call trampolines have been reworked. cinterop adds a CValuesRef overload for C-string parameters when the called function retains the pointer โ KT-86657, KT-80373, KT-85925, KT-866545. Wasm compilation modes.
kotlin.wasm.compilationMode selects monolith (default), multimodule-open-world, multimodule-closed-world or multimodule-closed-world-only-in-dev. The last option uses multimodule compilation for faster dev rebuilds and monolith for production. wasmWasi also supports wasmtime() as a runtime without a Node bootstrap โ KT-86919, KT-87258, KT-866336. Wasm checks and binary size. Array range checks are enabled by default, with an optimization pass to remove redundant checks. Fun interfaces and lambdas share a base class per function type. The commit reports 10โ15% smaller production binaries; the docs report 5โ10% for the KotlinConf app. Superclass companions now initialize before subclass companions, as on JVM โ KT-73452, KT-83159, KT-40768
7. Wasm interop and coroutines. Top-level
require() inside @JsFun now produces an error. Use @JsModule or import(). The generated wasmExports JS API is deprecated; use kotlin.wasm.unsafe.wasmMemory to replace wasmExports.memory. This release also includes a prototype implementation of suspend functions using the stack-switching proposal โ KT-86192, KT-86242, KT-86245, KT-762078. JS. The new Experimental browser-test DSL,
browser { test { chromium(); firefox(); webkit() } }, uses Playwright, Mocha and webpack to replace Karma. -Xsuspend-lambda-exporting exports suspend lambdas as JS async functions. Applying @JsExport.Ignore to a data class constructor now suppresses copy()/componentN() warnings. Annotation classes can also be exported โ KT-86260, KT-80188, KT-86273, KT-85599Corrections to our Beta1 post. ES2015 syntax in
js() was released in 2.4.0. KDoc export to .d.ts is now targeted for 2.5.0 in YouTrack. Its commit is present in the 2.4.20 source tree as part of the Analysis API-based .d.ts generator. Neither feature appears in this changelog โ KT-21626, KT-56493Telegram
The Daily Kotlin
Kotlin 2.4.20 (1/3)
2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes.โฆ
2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes.โฆ
Kotlin
The final part of our 2.4.20 notes covers build tooling, performance and bug fixes.
Major changes:
1. Build Tools API for JS, Wasm and metadata. The Gradle plugin can use BTA for these compilations. Enable it with
2. KMP incremental compilation on JVM. The compiler records incremental compilation metadata per fragment, so
3. Gradle. KGP is fully compatible with Gradle 7.6.3 through 9.7.0. Compiler diagnostics use their own IDs in the Problems API, such as
4. Gradle performance. Caching dependency maps and host-specific metadata per source set fixes the 2.4.0 sync regression, which added 41% to sync time in a 400-module KMP project. The daemon no longer leaks
5. npm and webpack. npm lock files are now task inputs, so dependency updates invalidate the webpack cache. webpack is updated to 5.108.1; check direct uses of
6. J2KLIB produces klibs for JVM compilation. With
7. Compiler performance. Having kotlin-reflect on the classpath no longer slows
8. Crash fixes since 2.4.10. Discarding a suspend result no longer causes
9. Incremental compilation fixes. Builds now fail when an anonymous class is missing a new abstract member from another module. Classpath removal is detected when the removed type appears only in a dependency's method signature.
Kotlin Archive. The Gradle plugin now reports an error explaining what to do when a
2.4.20 (3/3)The final part of our 2.4.20 notes covers build tooling, performance and bug fixes.
Major changes:
1. Build Tools API for JS, Wasm and metadata. The Gradle plugin can use BTA for these compilations. Enable it with
kotlin.js.runViaBuildToolsApi=true, kotlin.wasm.runViaBuildToolsApi=true and kotlin.metadata.runViaBuildToolsApi=true. BTA is planned to be enabled by default in 2.5.0 โ KT-78214, KT-78216, KT-805092. KMP incremental compilation on JVM. The compiler records incremental compilation metadata per fragment, so
commonMain no longer resolves against jvmMain class files during recompilation. This requires build tools to pass -Xfragment-incremental-classpath. Without it, the previous behaviour remains โ KT-86409, KT-86410, KT-870573. Gradle. KGP is fully compatible with Gradle 7.6.3 through 9.7.0. Compiler diagnostics use their own IDs in the Problems API, such as
REDUNDANT_CLI_ARG. Daemon failures are also reported there. @DelicateKotlinGradlePluginApi marks APIs that require checking the documentation before use โ KT-87992, KT-85568, KT-85709, KT-874814. Gradle performance. Caching dependency maps and host-specific metadata per source set fixes the 2.4.0 sync regression, which added 41% to sync time in a 400-module KMP project. The daemon no longer leaks
BuildMetricsService instances after each build. Build metrics now include configuration time โ KT-87790, KT-88084, KT-849575. npm and webpack. npm lock files are now task inputs, so dependency updates invalidate the webpack cache. webpack is updated to 5.108.1; check direct uses of
terser-webpack-plugin and import.meta in CommonJS files when upgrading. The bundled yarn.lock has been updated to fix offline Wasm setup failures โ KT-84724, KT-87647, KT-881156. J2KLIB produces klibs for JVM compilation. With
-XheaderModeType=compilation, header klibs without inline functions or value classes skip FIR2IR. Dependency deserialization now uses WITH_INLINE_BODIES in place of ALL โ KT-88165, KT-881767. Compiler performance. Having kotlin-reflect on the classpath no longer slows
typeOf() down. Measuring thread CPU time for every class-file read now requires -Xdetailed-perf. Fixes also address slow compilation with a mockk import and a deserialization regression introduced in 2.3.20 โ KT-73657, KT-87868, KT-66469, KT-856478. Crash fixes since 2.4.10. Discarding a suspend result no longer causes
ClassCastException: Float cannot be cast to Unit. The RC3 fix addresses a CCE from suspend conversion of a nullable argument. Native fixes include NoWhenBranchMatchedException for an exhaustive when over a sealed interface, and a StackOverflowError during cast optimization when nullable locals are assigned to each other โ KT-87499, KT-88953, KT-85403, KT-883169. Incremental compilation fixes. Builds now fail when an anonymous class is missing a new abstract member from another module. Classpath removal is detected when the removed type appears only in a dependency's method signature.
RequiresOptIn level changes propagate through transitive dependencies โ KT-85074, KT-85740, KT-60584Kotlin Archive. The Gradle plugin now reports an error explaining what to do when a
.kar file appears on the compilation classpath. Support for the format, which bundles KMP metadata and non-JVM klibs into one artifact, is planned for a later release โ KT-87911.watchosArm32 status. The docs list deprecation ahead of removal in 2.5.0. The soft-deprecation commit was reverted the next day, so the 2.4.20 compiler target table and Gradle DSL contain no deprecation โ KT-87463. The docs also state that Kotlin/Native now prohibits AtomicFU atomic operations inside public inline functions; we found no matching commit in the 2.4.10..2.4.20 range.Telegram
The Daily Kotlin
Kotlin 2.4.20 (1/3)
2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes.โฆ
2.4.20 is out, with the What's new page for the official summary. The release tag points to the same commit as RC3. Compared with 2.4.10, it includes 3,939 commits and 747 changelog tickets. This post covers language and compiler changes.โฆ