<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kotlin : A concise multiplatform language developed by JetBrains | The JetBrains Blog</title>
	<atom:link href="https://blog.jetbrains.com/kotlin/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.jetbrains.com</link>
	<description>Developer Tools for Professionals and Teams</description>
	<lastBuildDate>Fri, 30 Oct 2026 12:02:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.jetbrains.com/wp-content/uploads/2026/09/icon-512.webp</url>
	<title>Kotlin : A concise multiplatform language developed by JetBrains | The JetBrains Blog</title>
	<link>https://blog.jetbrains.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kodee’s Kotlin Roundup: Shipaton 2026 Winners, Kotlin 2.5.0-Beta2, and KotlinConf 2027</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/kodee-s-kotlin-roundup-shipaton-2026-winners-kotlin-2-5-0-beta2-and-kotlinconf-2027/</link>
		
		<dc:creator><![CDATA[Kodee]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 12:02:33 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/KT-social-BlogFeatured-1280x720-1-3.png</featuredImage>		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[kotlin-roundup]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=750101</guid>

					<description><![CDATA[Hi everyone! It’s been a busy few weeks since my last roundup: the Shipaton 2026 winners are in, and three Kotlin Multiplatform apps took the Ship Kotlin Everywhere Award. In other news, Kotlin 2.5.0 is taking shape with its second Beta, KotlinConf 2027 is officially heading to Kraków with the call for speakers open, and [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Hi everyone! It’s been a busy few weeks since my last roundup: the Shipaton 2026 winners are in, and three Kotlin Multiplatform apps took the Ship Kotlin Everywhere Award. In other news, Kotlin 2.5.0 is taking shape with its second Beta, <a href="https://kotlinconf.com/" target="_blank" rel="noopener">KotlinConf 2027 is officially heading to Kraków</a> with the call for speakers open, and the new State of Kotlin in 2026 report shows where the language stands after 15 years. Here’s what stood out to me most:</p>


            <div class="newsletter">
                            <h2>Kodee-approved spotlight</h2>
                                                            <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/Kotlin-Release-X-LinkedIn-FB-Bluesky-1200x675-1-3.webp" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>Ship Kotlin Everywhere winners at RevenueCat Shipaton 2026</h3>
                                                        <p>Out of 3,985 Shipaton submissions, three standout projects took home JetBrains’ Ship Kotlin Everywhere awards. What caught my eye is that the same Kotlin Multiplatform and Compose Multiplatform toolkit yielded three completely different results.</p>
<p>🥇 BoatBrawl by Rehaan Cubes and Ashwin K M<br />
🥈 AfterFade by Kanon Fujita<br />
🥉 Lumeo by Piotr Prus</p>
<p>A huge congratulations to the winners, and to everyone who shipped an app. I’m off to start a new project of my own!</p>
                                                            <a href="https://www.revenuecat.com/blog/company/shipaton-2026-winners/#ship-kotlin-everywhere" class="btn" target="_blank" rel="noopener">Meet the Shipaton 2026 winners</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/KM-social-BlogFeatured-1280x720-1-1.png" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>Start your next KMP app with Kotlin Toolchain 0.13</h3>
                                                        <p>Kotlin Toolchain 0.13 brings `kotlin new` for interactive project creation, smoother iOS setup, SwiftPM dependency support, and faster Kotlin/Native rebuilds. We recommend it for most new KMP projects. Give it a try!</p>
                                                            <a href="https://blog.jetbrains.com/kotlin/2026/10/start-your-next-kmp-app-with-kotlin-toolchain-0-13/" class="btn" target="_blank">See what’s new in Toolchain 0.13</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/X-800x418-1.png" alt="State of Kotlin in 2026">
                                                                            <div class="newsletter__post-text">
                                                            <h3>The State of Kotlin in 2026 report</h3>
                                                        <p>Kotlin turned 15 this year, and the new report offers a fascinating look at how the ecosystem has grown. More than half of Kotlin developers report working on backend projects. Among surveyed Kotlin developers, 93% use at least one AI coding tool, and 81% say AI-generated Kotlin code is fully correct or requires only minor fixes. What surprised you most?</p>
                                                            <a href="https://kotlinlang.org/assets/state-of-kotlin-2026.pdf" class="btn" target="_blank" rel="noopener">Read the State of Kotlin 2026 report </a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/meta-kotlinconf-img.png" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>KotlinConf 2027 is coming to Kraków</h3>
                                                        <p>Save the dates! KotlinConf 2027 is heading to Kraków, Poland, April 21–23. April 21 is workshop day, followed by two conference days. Have an experience, tool, or Kotlin lesson worth sharing? The call for speakers is open, with submissions due November 27. I’d love to see you on stage or somewhere in the audience!</p>
                                                            <a href="https://kotlinconf.com/" class="btn" target="_blank" rel="noopener">Explore KotlinConf 2027</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/JB-social-BlogFeatured-1280x720-1-11.png" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>The Kotlin Multiplatform Contest is open: Win a trip to KotlinConf </h3>
                                                        <p>Students and recent graduates, turn your idea into a cross-platform project with Kotlin Multiplatform!<br />
The authors of the top three projects will each win a trip to KotlinConf 2027 in Kraków, Poland. Authors of all other valid entries will receive Kotlin souvenirs. Submissions are open until December 7, 2026.</p>
                                                            <a href="https://kotlinconf.com/contest/" class="btn" target="_blank" rel="noopener">Check out</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/KT-social-BlogFeatured-1280x720-1-2.webp" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>Kotlin 2.5.0-Beta2 and Kotlin 2.4.21</h3>
                                                        <p>Kotlin 2.5.0-Beta2 landed on October 21. It brings stable name-based destructuring in only-syntax mode, an unused return value checker, Java 28 support, and Swift export in Beta with a new DSL. Kotlin/Native incremental compilation is also now enabled by default on Apple targets. Prefer a maintenance release? <a href="https://github.com/JetBrains/kotlin/releases/tag/v2.4.21" target="_blank" rel="noopener noreferrer">Kotlin 2.4.21</a> arrived in October with bug fixes.</p>
                                                            <a href="https://kotlinlang.org/docs/whatsnew-eap.html" class="btn" target="_blank" rel="noopener">Try Kotlin 2.5.0-Beta2</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/KT-social-BlogFeatured-1280x720-1-1.png" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>The Kotlin compiler will require JDK 17 or newer</h3>
                                                        <p>The minimum JDK version required to run the Kotlin compiler is changing. In Kotlin 2.5.0-Beta1, running the compiler on a JDK older than 17 triggers a warning. In Kotlin 2.5.0-Beta2 and 2.5.0, it triggers an error, with a flag to temporarily continue using an older JDK. Starting with Kotlin 2.5.20-Beta1, JDK 17 or newer is required. If your machines or CI still use an older JDK, now is a good time to upgrade.</p>
                                                            <a href="https://youtrack.jetbrains.com/issue/KT-88173" class="btn" target="_blank" rel="noopener">Share your feedback on YouTrack</a>
                                                    </div>
                    </article>
                                    <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/klibsionew.jpg" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>KMP library spotlight</h3>
                                                        <p>Looking for the right libraries for your next multiplatform app? On Klibs.io, you can compare Voyager, Decompose, and Circuit for Compose Multiplatform navigation. Or try Ktorfit to describe HTTP APIs with a familiar Retrofit-style interface while using Ktor under the hood. You can also let your AI agent do the checking – the Klibs.io MCP server gives it direct access to the multiplatform library catalog.</p>
                                                            <a href="https://klibs.io/" class="btn" target="_blank" rel="noopener">Discover libraries on Klibs.io</a>
                                                    </div>
                    </article>
                                    </div>
    


<h1 class="wp-block-heading"><strong>Where you can learn more</strong></h1>



<ul class="wp-block-list">
<li><a href="https://jb.gg/e5bb41" target="_blank" rel="noreferrer noopener">Kotlin Developer Survey</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/09/the-companions-to-come/" target="_blank" rel="noreferrer noopener">The Companions to Come</a></li>



<li><a href="https://dev.to/cobrainer/the-jvm-speaks-ai-cobrainers-journey-with-kotlin-koog-and-exposed-386h" target="_blank" rel="noreferrer noopener">The JVM Speaks AI: Cobrainer’s Journey with Kotlin, Koog, and Exposed</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/10/kotlinconf-recap-lessons-from-verifone-s-architect-on-kotlin-in-mission-critical-payments/" target="_blank" rel="noreferrer noopener">KotlinConf Recap: Lessons from Verifone’s Architect on Kotlin in Mission-Critical Payments</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2026/10/what-makes-a-great-kotlinconf-proposal/" target="_blank" rel="noreferrer noopener">What Makes a Great KotlinConf Proposal?</a></li>



<li><a href="https://blog.jetbrains.com/amper/2026/10/amper-is-now-the-kotlin-toolchain-moving-to-the-kotlin-blog/" target="_blank" rel="noreferrer noopener">Amper Is Now the Kotlin Toolchain: Moving to the Kotlin Blog</a><br></li>
</ul>



<h1 class="wp-block-heading"><strong>YouTube highlights</strong></h1>



<ul class="wp-block-list">
<li><a href="https://www.youtube.com/watch?v=gHxvCWA5mtY" target="_blank" rel="noreferrer noopener">Swift Export: Where We Stand | Pamela Hill-Galloway</a></li>



<li><a href="https://www.youtube.com/watch?v=QqTdGg2wYxY" target="_blank" rel="noreferrer noopener">Building AI-Powered Web Apps in Kotlin/Wasm | Zalim Bashorov</a></li>



<li><a href="https://www.youtube.com/watch?v=He8J34KHEY4" target="_blank" rel="noreferrer noopener">Kotlin’s Name-Based Destructuring</a></li>



<li><a href="https://www.youtube.com/watch?v=UhRfN7fx5rs" target="_blank" rel="noreferrer noopener">What’s New in Kotlin 2.4.20</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google Summer of Code 2026 With the Kotlin Foundation: Recap</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/google-summer-of-code-2026-with-kotlin/</link>
					<comments>https://blog.jetbrains.com/kotlin/2026/10/google-summer-of-code-2026-with-kotlin/#respond</comments>
		
		<dc:creator><![CDATA[Ksenia Shneyveys]]></dc:creator>
		<pubDate>Thu, 15 Oct 2026 15:03:05 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/Google_Summer_of_Code_2026_Recap_2560x1440.png</featuredImage>		<category><![CDATA[education]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[gsoc]]></category>
		<category><![CDATA[open-source]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=746576</guid>

					<description><![CDATA[Google Summer of Code 2026 has wrapped up! This was the Kotlin Foundation’s fourth year participating in GSoC, bringing new contributors into the Kotlin open-source ecosystem through hands-on projects and mentorship. This year, two projects successfully reached completion, tackling two areas of the ecosystem: improving recursion support in the Kotlin/Wasm backend and building a global [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Google Summer of Code 2026 has wrapped up! This was the <a href="https://summerofcode.withgoogle.com/programs/2026/organizations/kotlin-foundation" data-type="link" data-id="https://summerofcode.withgoogle.com/programs/2026/organizations/kotlin-foundation" target="_blank" rel="noreferrer noopener">Kotlin Foundation</a>’s fourth year participating in GSoC, bringing new contributors into the Kotlin open-source ecosystem through hands-on projects and mentorship.</p>



<p>This year, two projects successfully reached completion, tackling two areas of the ecosystem: <a href="https://gist.github.com/ternbusty/28bf25ac426e9954b550afc02407453f" target="_blank" rel="noreferrer noopener">improving recursion support in the Kotlin/Wasm backend</a> and building a global <a href="https://kotlin-education-landscape.labs.jb.gg/" target="_blank" rel="noreferrer noopener">picture of where Kotlin is taught</a>.</p>



<p>Congratulations to <strong>Ayako Hayasaka</strong> and <strong>Mark Seif Khalil</strong>, and a huge thank-you to our mentors for supporting them throughout the program!</p>



<p>Here&#8217;s more on what they accomplished.</p>



<h1 class="wp-block-heading">Tail call support in the Kotlin/Wasm backend</h1>



<p><strong>Contributor:</strong> Ayako Hayasaka<br><strong>Mentor:</strong> Charlie Zhang (JetBrains)</p>



<p>Ayako’s project added support for WebAssembly tail-call instructions to the Kotlin/Wasm backend. The compiler can now detect calls in tail position and emit return_call or return_call_ref, helping recursive Kotlin/Wasm programs avoid increasing the call stack.</p>



<p>In Ayako’s benchmarks, several recursive patterns became 1.7–4.3x faster at a recursion depth of 10,000. At a depth of one million, the same programs crashed without tail calls and completed successfully with them.</p>



<p>Testing the change on real-world projects also revealed an unexpected performance regression in V8. Ayako traced it to a missing optimization for return_call, submitted a fix, and had the <a href="https://ternbusty.github.io/posts/v8-return-call-wki-bug.html" target="_blank" rel="noreferrer noopener">patch merged into V8</a>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">    <div class="blockquote">
                    <blockquote><p>“What surprised me the most was that Ayako, after implementing the new WebAssembly instructions and using them in the Kotlin backend, actually found a bug in the Google V8 engine. Not only did she report the bug, she fixed it as well.”</p></blockquote>
            <div class="blockquote__author">
                                <div class="blockquote__author-info">
                                            <strong class="blockquote__author-title">Charlie Zhang</strong>
                                                        </div>
            </div>
            </div>
</blockquote>



<p>Ayako has continued working on follow-up optimizations and other approaches to supporting recursive code beyond the original GSoC project.</p>



<p>For Ayako, GSoC 2026 was also a chance to work much more closely on language and runtime internals than in her everyday work.</p>


    <div class="blockquote">
                    <blockquote><p>“In my day job, I rarely get to touch the internals of a language, so I simply had a lot of fun with this opportunity. While investigating the slowdown, I had to read not only the compiler but also V8, and I realized how much there is to learn beyond the code I usually work on.”</p></blockquote>
            <div class="blockquote__author">
                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="blockquote__author-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/2026-06-28-17.38.09-EDIT.jpg" alt="Ayako Hayasaka GSoC 2026">
                                <div class="blockquote__author-info">
                                            <strong class="blockquote__author-title">Ayako Hayasaka</strong>
                                                        </div>
            </div>
            </div>



<p>Read Ayako’s full story → <a href="https://gist.github.com/ternbusty/28bf25ac426e9954b550afc02407453f" target="_blank" rel="noreferrer noopener">Final project report</a></p>



<h1 class="wp-block-heading">Mapping the global Kotlin education landscape</h1>



<p><strong>Contributor:</strong> Mark Seif Khalil<br><strong>Mentors:</strong> Ksenia Shneyveys (JetBrains) and Elizaveta Artser (JetBrains)</p>



<p>Mark’s project set out to create a structured overview of where and in what context Kotlin is being taught, considering that the information is spread across websites, course curricula, repositories, learning platforms, and other sources. The project brought that fragmented information together and created a structured and automated way to gather this data.</p>



<p>Over the course of GSoC 2026, Mark explored different sources and approaches to collecting this information, built a database, and developed a process for parsing and structuring data from multiple sources.&nbsp;</p>


    <div class="blockquote">
                    <blockquote><p>“The biggest thing I learned is when to stop pushing on something that is not working and change my approach. This is a lesson I will keep with me in every project.”</p></blockquote>
            <div class="blockquote__author">
                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="blockquote__author-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/Mark-Seif-Photo.jpeg" alt="Mark Seif Khalil GSoC 2026">
                                <div class="blockquote__author-info">
                                            <strong class="blockquote__author-title">Mark Seif Khalil</strong>
                                                        </div>
            </div>
            </div>



<p>The resulting project gives us a reusable foundation for monitoring Kotlin’s presence in education and identifying trends and gaps.</p>


    <div class="blockquote">
                    <blockquote><p>“What impressed us both the most about Mark was his ability to take an initially exploratory idea and bring his own vision for the research while continuously incorporating our feedback. Mark turned this scattered information into a resource we can actually use to understand Kotlin education worldwide.”</p></blockquote>
            <div class="blockquote__author">
                                <div class="blockquote__author-info">
                                            <strong class="blockquote__author-title">Ksenia Shneyveys, Elizaveta Artser</strong>
                                                        </div>
            </div>
            </div>



<p>Read Mark’s full story → <a href="https://github.com/markoeltiger/kotlin-education-landscape/tree/main" target="_blank" rel="noreferrer noopener">Kotlin Education Landscape<br></a><a href="https://youtu.be/20_CsSYvnwY" target="_blank" rel="noreferrer noopener">Watch Mark’s GSoC reflection</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Interested in contributing to Kotlin through a future Google Summer of Code – or mentoring a project yourself?</p>



<p>Join the <a href="https://surveys.jetbrains.com/s3/kotlin-slack-sign-up" target="_blank" rel="noreferrer noopener">#gsoc channel in the Kotlin Slack</a> to meet the community, ask questions, and follow future GSoC announcements.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.jetbrains.com/kotlin/2026/10/google-summer-of-code-2026-with-kotlin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What Makes a Great KotlinConf Proposal?</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/what-makes-a-great-kotlinconf-proposal/</link>
		
		<dc:creator><![CDATA[Jelena Ilic]]></dc:creator>
		<pubDate>Thu, 15 Oct 2026 09:11:39 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/Blog-Post.png</featuredImage>		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[kotlinconf]]></category>
		<category><![CDATA[kotlinconf-2027]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=745924</guid>

					<description><![CDATA[The KotlinConf 2027 Call for Papers is now open! We invite developers from across the Kotlin community to bring their ideas, experiences, and expertise to the stage in Kraków. Do you have a Kotlin lesson or discovery that could help other developers? Perhaps you solved a difficult technical problem, introduced Kotlin into an existing codebase, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The KotlinConf 2027 Call for Papers is now open! We invite developers from across the Kotlin community to bring their ideas, experiences, and expertise to the stage in Kraków.</p>



<p>Do you have a Kotlin lesson or discovery that could help other developers? Perhaps you solved a difficult technical problem, introduced Kotlin into an existing codebase, built something unexpected, or learned valuable lessons from an approach that did not go according to plan.</p>



<p>That experience could become a KotlinConf talk.</p>



<p align="center"><a class="ek-link jb-download-button" title="Submit your KotlinConf2027 proposal" href="https://sessionize.com/kotlinconf-2027" target="_blank" rel="noopener">Submit your proposal</a></p>



<p>However, turning an idea into a convincing conference proposal can be challenging, especially if you’ve never submitted one before. How do you know whether your experience is worth sharing? What do reviewers notice first? How detailed should your abstract be? And how can you make a familiar topic stand out?</p>



<p>To help you prepare your submission, we asked Kotlin developers, developer advocates, experienced speakers, and KotlinConf program committee members what makes a strong proposal. Alongside practical advice for shaping your title, abstract, and takeaways, we have added a new section answering an especially important question: What do reviewers notice first when they open a proposal?</p>



<h2 class="wp-block-heading">First-time speaker? Submit your idea anyway!</h2>



<p>It’s easy to assume that a KotlinConf talk must begin with a groundbreaking discovery, a major production system, or years of speaking experience. In reality, a valuable talk can begin with a simple idea or a lesson learned while solving an everyday development problem.</p>



<p>You don’t need to know everything about Kotlin – you need something useful to share and a clear idea of who it could help.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/pamela.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/pamelaahill">X</a>, <a href="https://bsky.app/profile/pamelaahill.bsky.social" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/pamelaahill" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Submit your idea anyway! There have been some wildly successful talks at KotlinConf that started out as just a simple idea.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>If you’re unsure whether your topic would interest anyone, discuss it with the people around you. Explain the idea to colleagues, friends, members of a user group, or people in the Kotlin community. Their questions and reactions can help you understand which parts are most valuable.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marcin.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Marcin Mycek. Product Manager, Kotlin Build Tools</h4>
                                                <p><a href="https://nl.linkedin.com/in/mycek" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">If you can find one interested person, there are probably more! If you can find at least two people around you who find the topic interesting and can listen for more than five minutes, it is already a decent candidate.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Previous conference experience is not required. A clear, authentic proposal based on something you understand and care about can be more compelling than a polished proposal with little substance behind it.</p>



<h2 class="wp-block-heading">Start with the story you want to tell</h2>



<p>Before writing the title or opening the submission form, identify the central story behind your talk.</p>



<p>“A talk about coroutines” or “a session about Kotlin Multiplatform” describes a subject, but it doesn’t explain what makes the session valuable.</p>



<p>Ask yourself:</p>



<ul class="wp-block-list">
<li>What problem, question, or opportunity did you encounter?</li>



<li>Why was it important or difficult?</li>



<li>What did you try?</li>



<li>What surprised you?</li>



<li>What succeeded and what did not?</li>



<li>What did you learn that other developers could apply?</li>
</ul>



<p>Your story doesn’t need to come from a large company or a system used by millions of people. A focused lesson from a small project can be just as useful if it offers an original insight or explains a difficult subject clearly.</p>



<p>Try summarizing the idea in one sentence, for example:</p>



<p><em>This talk will show [audience] how we [solved or explored something], what we learned, and how they can apply those lessons.</em></p>



<p>If you can’t complete that sentence clearly, the idea may need a little more development before you start writing the proposal.</p>



<h2 class="wp-block-heading">What do reviewers notice first?</h2>



<p>The title may be the first line reviewers read, but the overall level of care quickly becomes visible.</p>



<p>Reviewers consider not only whether the topic is interesting, but also whether the speaker can explain it clearly. A thoughtful title, focused description, concrete takeaways, and careful formatting show that you have spent time developing your idea.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/pamela.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/pamelaahill">X</a>, <a href="https://bsky.app/profile/pamelaahill.bsky.social" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/pamelaahill" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">I can sum it up by saying that the care you take in writing the proposal is probably more obvious than people think. If I can see that you took the time to come up with a catchy or descriptive title that works well with the content, I am more comfortable giving you a thumbs-up to speak at KotlinConf. If your description is so short or so long, or so clearly AI-generated, that you cannot express your idea clearly and neatly, I will probably not vote positively for your talk.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>This doesn’t mean you need to use complicated language or create a perfect marketing pitch. It means giving reviewers enough information to understand your idea and showing that the proposal represents your own experience and voice.</p>



<p>Marcin Moskała’s <em>Taming Asynchronous Beasts: Debugging and Performance Tuning in a Coroutine World</em> provides a good example of a precise promise: “You’ll learn how to effectively use built-in tools, recognize problematic patterns, and implement proven optimization strategies.”</p>



<h2 class="wp-block-heading">Write a clear and informative title</h2>



<p>A strong title should give reviewers, and eventually attendees, an accurate idea of what the talk will cover.</p>



<p>Creativity can make a title memorable, but clarity should come first. Avoid titles that rely entirely on a joke, reference, or metaphor without explaining the subject.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/pamela.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/pamelaahill">X</a>, <a href="https://bsky.app/profile/pamelaahill.bsky.social" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/pamelaahill" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">A carefully-selected title can make all the difference! Audience members often lack the time or attention span to read more than the title when deciding whether to attend a talk. Prefer clarity over a catchy or fun title that doesn’t give a good idea of what the talk is about in a nutshell.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Compare the following title examples:</p>



<p>Too broad:<br><em>Our Multiplatform Journey</em></p>



<p>More informative:<br><em>What We Learned Migrating Our Mobile App to Kotlin Multiplatform</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Too vague:<br><em>Coroutines Gone Wild</em></p>



<p>More informative:<br><em>Debugging Coroutine Performance Problems in Production</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Too general:<br><em>Building Better APIs</em></p>



<p>More informative:<br><em>Designing Type-Safe Kotlin APIs That Are Difficult to Misuse</em></p>



<p>A good title usually communicates at least two of the following:</p>



<ul class="wp-block-list">
<li>The main topic</li>



<li>The problem or question</li>



<li>The context in which it was explored</li>



<li>The practical benefit for attendees</li>



<li>The expected experience level</li>
</ul>



<p>You can still use humor or wordplay, but make sure the title does not hide what the session is actually about.</p>



<h2 class="wp-block-heading">Build your abstract around a clear journey</h2>



<p>Your abstract doesn’t need to contain your entire presentation. However, it should provide enough detail for reviewers to understand the problem, the direction of the talk, and its value.</p>



<p>Two or three focused paragraphs will usually communicate more than either a single vague sentence or a very long description covering every detail.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/sebastian.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Sebastian Sellmair. Software Developer and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/Sellmair">X</a>, <a href="https://bsky.app/profile/sellmair.dev" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.youtube.com/@s.sellmair" target="_blank" rel="noopener">YouTube </a></p>
<p><i><span style="font-weight: 400;">Talking at KotlinConf is a great experience and a huge achievement for any Kotlin developer. While choosing a great title, having highly polished animations, and curating high-quality memes might enhance your talk, the most important thing is having a story worth telling. Do you have something novel and technically interesting to present? Can you break down a topic in a way that is engaging and truly fun? Can you inspire fellow developers?</span></i></p>
<p>&nbsp;</p>
                    </div>
                            </div>
        </div>
    </div>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marton.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/zsmb13">X</a>, <a href="https://bsky.app/profile/zsmb.co" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/zsmb13" target="_blank" rel="noopener">LinkedIn </a></p>
<p><i><span style="font-weight: 400;">While we don’t need a full script for your talk as the abstract, we’re also unlikely to accept a talk where the abstract is just a single sentence. Two or three paragraphs are usually enough to provide meaningful detail.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>A simple structure can help:</p>



<h3 class="wp-block-heading"><strong>The context</strong></h3>



<p>Introduce the situation and the audience likely to recognize it.</p>



<h3 class="wp-block-heading"><strong>The challenge</strong></h3>



<p>Explain the problem, limitation, or question that motivated the work.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/jodie.jpeg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Jodie Burchell. Developer Advocate and Data Scientist</h4>
                                                <p><a href="https://www.linkedin.com/in/jodieburchell" target="_blank" rel="noopener">LinkedIn</a>, <a href="https://fosstodon.org/@t_redactyl" target="_blank" rel="noopener">Mastodon</a>, <a href="https://bsky.app/profile/t-redactyl.bsky.social" target="_blank" rel="noopener">BlueSky</a></p>
<p><i><span style="font-weight: 400;">Hook your audience by telling them the problem you’re going to be solving. People love mystery books for a reason, and that’s because they build up a bit of suspense before they jump into the solution. A great proposal will do the same thing.</span></i></p>
<p>&nbsp;</p>
                    </div>
                            </div>
        </div>
    </div>



<h3 class="wp-block-heading"><strong>The approach</strong></h3>



<p>Describe what you explored, implemented, compared, or discovered.</p>



<h3 class="wp-block-heading"><strong>The outcome</strong></h3>



<p>Clarify what attendees will learn and how they can use it.</p>



<p>A strong takeaway can be as concrete as the one from Tadeas Kriz’s <em>Dependencies and Kotlin/Native</em>: “Learn how native dependencies interact, how they are loaded, and the unexpected complexities of the native world.”</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/chantal.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Chantal Loncle. Software Developer, Exposed, JetBrains </h4>
                                                <p><a href="https://ca.linkedin.com/in/chantal-mp-loncle" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Avoid vague promises. Instead, use action verbs and specific outcomes to describe the exact capabilities and transformations the audience will gain. Will they leave your talk feeling that their time was well spent? If so, what practical knowledge, immediately applicable skills, or high-value tools will they take with them?</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>For example:</p>



<p><em>Maintaining separate Android and iOS implementations allowed our teams to move independently, but it also resulted in duplicated business logic and inconsistent behavior between the applications.</em></p>



<p><em>In this session, we’ll examine how we introduced Kotlin Multiplatform gradually, beginning with one shared feature rather than attempting a complete migration. We’ll discuss how we selected the first component, structured the shared code, tested it across platforms, and worked with the existing native applications.</em></p>



<p><em>You’ll leave with a practical framework for evaluating where to introduce shared code, which challenges to expect, and how to plan an incremental Kotlin Multiplatform adoption without rebuilding your entire application.</em></p>



<p>The example establishes the problem, explains what the session will cover, and gives the audience a reason to attend. It doesn’t reveal every detail, but it makes a concrete promise.</p>



<h2 class="wp-block-heading">Think like an attendee</h2>



<p>A strong proposal doesn’t focus only on what the speaker wants to present. It also explains what the audience will gain.</p>



<p>Ask yourself:</p>



<ul class="wp-block-list">
<li>Who is this session for?</li>



<li>What knowledge should attendees already have?</li>



<li>What problem will the talk help them solve?</li>



<li>What will they understand or be able to do afterward?</li>



<li>Why should they choose this session over another talk happening at the same time?</li>
</ul>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/svetlana.jpeg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Svetlana Isakova. Team Lead in Kotlin Developer Advocacy, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/sveta_isakova">X</a></p>
<p><i><span style="font-weight: 400;">When submitting a talk, think like an attendee. Would you want to sit through this? What’s in it for the audience? That’s why we ask about key takeaways. What do you want people to learn, try, do, or feel inspired by?</span></i></p>
<p>&nbsp;</p>
                    </div>
                            </div>
        </div>
    </div>



<p>Avoid broad promises such as:</p>



<ul class="wp-block-list">
<li>“You will learn best practices.”</li>



<li>“We will explore Kotlin Multiplatform.”</li>



<li>“This talk will cover coroutines.”</li>
</ul>



<p>Instead, describe specific outcomes:</p>



<ul class="wp-block-list">
<li>Attendees will learn how to identify and debug three common coroutine performance problems.</li>



<li>Attendees will understand how we structured shared code across Android and iOS.</li>



<li>Attendees will be able to evaluate whether the approach fits their own project.</li>



<li>Attendees will learn which parts of our migration worked, which did not, and what we would change today.</li>
</ul>



<p>Specific takeaways make the proposal easier to evaluate. If the talk is selected, they also help attendees decide whether it is relevant to them.</p>



<h2 class="wp-block-heading">Make a familiar topic feel fresh</h2>



<p>Your subject doesn’t have to be completely new. Many valuable conference talks revisit established technologies from perspectives that have not been explored in the same way before.</p>



<p>If you are proposing a popular topic, identify what makes your version distinctive. This could be:</p>



<ul class="wp-block-list">
<li>A real production case</li>



<li>An unusual scale or environment</li>



<li>A surprising result</li>



<li>A failed approach and what it taught you</li>



<li>A comparison between several possible solutions</li>



<li>A gradual migration rather than a greenfield implementation</li>



<li>An unconventional use of Kotlin</li>



<li>A personal experience that challenges a common assumption</li>



<li>A particularly clear way of explaining a difficult concept</li>
</ul>



<p>For example, “Introduction to Kotlin Multiplatform” is broad and familiar. “What Broke When We Introduced Kotlin Multiplatform Into a Seven-Year-Old Mobile App” offers a specific context and creates curiosity.</p>



<p>Be honest about trade-offs. A talk doesn’t need to present a flawless success story. Explaining what failed, what changed, and what you would do differently can be especially useful to other developers.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/chantal.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Chantal Loncle. Software Developer, Exposed, JetBrains </h4>
                                                <p><a href="https://ca.linkedin.com/in/chantal-mp-loncle" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Bringing a real, practical narrative to a familiar topic can strengthen a proposal. Be honest about what broke, what made your team unhappy, or what you would do differently if you could turn back the clock. A familiar issue can feel fresh when you look at it from the perspective of someone who will encounter the same problem for the first time tomorrow.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Rather than providing another general overview, build the talk around one specific pain point or discovery and introduce broader themes only where they support that story. A takeaway that attendees can immediately apply to their work can also help distinguish the proposal from a basic tutorial.</p>



<h2 class="wp-block-heading">Keep the proposal relevant to KotlinConf</h2>



<p>KotlinConf welcomes talks about backend development, Android, multiplatform development, web, desktop, AI, language design, tooling, libraries, developer experience, and other parts of the Kotlin ecosystem.</p>



<p>Whatever your area, the role Kotlin plays in the story should be clear.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marton.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/zsmb13">X</a>, <a href="https://bsky.app/profile/zsmb.co" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/zsmb13" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Keep in mind that your talk should be related to Kotlin! For example, not every Android talk is necessarily a good fit for the KotlinConf audience. Or talks about Jetpack Compose often cover things that work the exact same way with Compose Multiplatform, and the latter is much more likely to be accepted at KotlinConf!</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>An Android topic, for example, is not automatically a KotlinConf topic. The proposal becomes more relevant when it explains how Kotlin influenced the solution, explores a Kotlin-specific technical decision, or provides lessons that Kotlin developers can apply.</p>



<p>Ask yourself:</p>



<ul class="wp-block-list">
<li>Why is this a Kotlin story?</li>



<li>Which parts of the experience are especially relevant to Kotlin developers?</li>



<li>Would the proposal still be essentially the same if Kotlin were removed from it?</li>
</ul>



<p>If the answer to the final question is yes, strengthen the connection to Kotlin before submitting.</p>



<p>Anshika Koul’s <em>Kotlin Multiplatform’s Cross-Platform Brilliance at Norway’s 377-Year-Old National Postal Service</em> offers a clear example of a Kotlin-centered takeaway: “We’ll learn how KMP provides a unified framework for code sharing and execution across various platforms to solve the challenge of different codebases targeting different runtimes.”</p>



<h2 class="wp-block-heading">Sound confident, but stay true to yourself</h2>



<p>Your proposal should show that you understand what you want to share and why it matters.</p>



<p>This doesn’t mean exaggerating your expertise or pretending that you have no doubts. It means presenting the idea as a clear statement rather than repeatedly questioning its value.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marcin.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Marcin Mycek. Product Manager, Kotlin Build Tools</h4>
                                                <p><a href="https://nl.linkedin.com/in/mycek" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Keep statements as statements and questions as questions. It is normal to doubt yourself; everybody does, but a common mistake is to let it show in the text, for example, by changing statements into questions. Read your submission, or even better, ask someone else to read it, and ask yourself: Does this person sound convinced about what they want to tell?</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>For example:</p>



<p>Uncertain:<br><em>Could Kotlin Multiplatform possibly help teams reduce duplicated business logic? In this talk, we might find out.</em></p>



<p>More confident:<br><em>In this talk, I’ll show how our team used Kotlin Multiplatform to reduce duplicated business logic, including where sharing code helped and where it did not.</em></p>



<p>Confidence should not erase your personality. The proposal should still sound like you.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marcin.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Marcin Mycek. Product Manager, Kotlin Build Tools</h4>
                                                <p><a href="https://nl.linkedin.com/in/mycek" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Stay true to yourself! It is important to make sure that your submission can be understood by others. A great practice is to give it to a few people you trust and ask what they understood from it and how it made them feel. However, keep your soul in it. A lot of great talks are quirky, do not follow every best practice, and people are there for it.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Advice and templates can help you organize your thoughts, but they shouldn’t make every proposal sound identical. Your perspective, language, humor, and enthusiasm are part of what makes the submission memorable.</p>



<h2 class="wp-block-heading">Show reviewers how you communicate</h2>



<p>Examples of previous talks help reviewers understand your presentation style and energy. If you have recordings from conferences, meetups, webinars, or livestreams, include the most relevant ones.</p>



<p>If you’re a first-time speaker and don’t have a formal recording, you can record yourself explaining part of the proposed talk. A simple laptop recording is enough. It doesn’t need professional lighting, editing, or production.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/svetlana.jpeg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Svetlana Isakova. Team Lead in Kotlin Developer Advocacy, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/sveta_isakova">X</a></p>
<p><i><span style="font-weight: 400;">Examples of your talks help us make better choices. If you’re a first-time speaker and don’t have recordings, no worries! You can simply record yourself (even just part of your proposed talk) on your laptop and share the link. We would really appreciate it.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Depending on the topic, you can also include:</p>



<ul class="wp-block-list">
<li>A technical article</li>



<li>An open-source project</li>



<li>Documentation you have written</li>



<li>A short technical demonstration</li>



<li>A podcast or meetup appearance</li>



<li>Other work connected to the proposed session</li>
</ul>



<p>These materials support your proposal, but they don’t replace a clear title, abstract, and set of takeaways. Reviewers should still be able to understand the session from the submission itself.</p>



<h2 class="wp-block-heading">Choose the format that fits the idea</h2>



<p>Not every subject needs a full-length session.</p>



<p>A focused lesson, experiment, side project, or surprising discovery may work better as a lightning talk. A subject that involves significant technical context, several connected lessons, or a detailed demonstration may require a regular session.</p>



<p>Choose the format according to the amount of meaningful material you have. If you need to repeat yourself or add unnecessary content to fill a regular session, consider proposing a lightning talk instead.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marton.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/zsmb13">X</a>, <a href="https://bsky.app/profile/zsmb.co" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/zsmb13" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Don’t forget that we also accept lightning talks! If you feel like your content would have to be padded to fill a regular session, it might be more enjoyable as a lightning talk.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>You can also submit more than one proposal if you have several distinct ideas. Each submission should have its own story, audience, and takeaways rather than being a minor variation of another proposal.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/pamela.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Pamela Hill-Galloway. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/pamelaahill">X</a>, <a href="https://bsky.app/profile/pamelaahill.bsky.social" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/pamelaahill" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Submit more than one talk! It gives you more chances to join in on the KotlinConf fun.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<h2 class="wp-block-heading">Review the proposal before submitting</h2>



<p>Once you have completed your draft, step away from it and return later from the perspective of someone encountering the idea for the first time.</p>



<p>Check whether your proposal answers the following questions:</p>



<ul class="wp-block-list">
<li>Can someone understand the subject from the title?</li>



<li>Is the connection to Kotlin clear?</li>



<li>Does the abstract identify a real problem, question, or story?</li>



<li>Is it clear who the session is for?</li>



<li>Are the takeaways concrete?</li>



<li>Does the proposal explain what makes your perspective different?</li>



<li>Is the scope realistic for the selected format?</li>



<li>Does the writing sound confident and authentic?</li>



<li>Have you checked the spelling, grammar, links, and formatting?</li>



<li>Does the proposal sound like the person who will deliver the talk?</li>
</ul>



<p>Ask someone else to review it, too. Rather than simply asking whether they like it, ask them to describe what they think the talk will cover and what they expect to learn. Their answer will show whether the proposal communicates what you intended.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/chantal.jpg" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Chantal Loncle. Software Developer, Exposed, JetBrains</h4>
                                                <p><a href="https://ca.linkedin.com/in/chantal-mp-loncle" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Double-check that the intended audience level aligns with the description and expected takeaways. Review the proposal from the perspective of someone you hope will be in the audience. Does it make sense as it is, or is it missing context that may be obvious to you but not to the reviewer or the future audience they are keeping in mind?</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<p>AI tools may help you check grammar or organize your thoughts, but the final proposal should reflect your own experience, ideas, and voice. A polished abstract without specific or authentic insight won’t be as convincing as one that clearly represents the speaker behind it.</p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/marton.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Márton Braun. Developer Advocate, KotlinConf Program Committee member, and KotlinConf speaker</h4>
                                                <p><a href="https://x.com/zsmb13">X</a>, <a href="https://bsky.app/profile/zsmb.co" target="_blank" rel="noopener">BlueSky</a>, <a href="https://www.linkedin.com/in/zsmb13" target="_blank" rel="noopener">LinkedIn</a></p>
<p><i><span style="font-weight: 400;">Your submission should show that you’ve put some thought and energy into preparing it. Check your submission for formatting issues and typos, and please don’t submit abstracts that were generated by LLMs.</span></i></p>
                    </div>
                            </div>
        </div>
    </div>



<h2 class="wp-block-heading">Your Kotlin story could take the stage</h2>



<p>You don’t need to know everything about Kotlin or have years of conference experience to submit a proposal. You need a useful story, an understanding of who it can help, and a clear explanation of why it matters.</p>



<p>Not every strong proposal can be selected. Conference programs must balance subjects, formats, experience levels, and audience interests. If your submission is not accepted, continue refining the idea, sharing your knowledge, and looking for other opportunities to present it.</p>



<p>Your experience might be exactly what another Kotlin developer needs to hear.</p>



<p>The KotlinConf 2027 Call for Papers is open! Share your experience, ideas, and Kotlin expertise with the community in Kraków.</p>



<p align="center"><a class="ek-link jb-download-button" title="Submit your KotlinConf2027 proposal" href="https://sessionize.com/kotlinconf-2027" target="_blank" rel="noopener">Submit your proposal</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>KotlinConf Recap: Lessons from Verifone&#8217;s Architect on Kotlin in Mission-Critical Payments</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/kotlinconf-recap-lessons-from-verifone-s-architect-on-kotlin-in-mission-critical-payments/</link>
		
		<dc:creator><![CDATA[Alina Dolgikh]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 11:03:00 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/image-167.png</featuredImage>		<category><![CDATA[backend]]></category>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[kotlinconf]]></category>
		<category><![CDATA[kotlin-conf-2026]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=746126</guid>

					<description><![CDATA[This article was written by an external contributor. Yuri Geronimus&#8217;s four-year-old son once asked him what his job was. Yuri told him he writes books: books that describe what he wants to change in the physical world. His son didn&#8217;t fully get it.&#160; Neither would most engineers: if you understand the words in your application [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><em>This article was written by an external contributor.</em></p>


    <div class="about-author ">
        <div class="about-author__box">
            <div class="row">
                                                            <div class="about-author__box-img">
                            <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/Ad2dLe2AFcCKCJdw59PhuWW6LDAPMatti4HwN63rGpA-1.webp" alt="" loading="lazy">
                        </div>
                                        <div class="about-author__box-text">
                                                    <h4>Aniket Bhattacharyea</h4>
                                                <p>Aniket is a Mathematics postgraduate who has a passion for computers and software. He likes to explore various areas related to coding and works as a web developer using Ruby on Rails and Next.JS.</p>
<p><a href="https://abhattacharyea.dev/" target="_blank" rel="noopener">Website</a></p>
                    </div>
                            </div>
        </div>
    </div>



<p>Yuri Geronimus&#8217;s four-year-old son once asked him what his job was. Yuri told him he writes books: books that describe what he wants to change in the physical world. His son didn&#8217;t fully get it.&nbsp;</p>



<p>Neither would most engineers: if you understand the words in your application code, you build good systems. If you don&#8217;t, you build bugs.</p>



<p>That&#8217;s the spine of <a href="https://www.youtube.com/watch?v=XFwhtftwp6s" target="_blank" rel="noreferrer noopener">Yuri Geronimus&#8217;s KotlinConf 2026 talk</a>, &#8220;Kotlin as a Safety Net: Type-Driven Reliability in the Finance Industry&#8221;. Yuri is an architect at Verifone, where he works across payment terminals, gateways, and the systems that connect them to banks and regulators in the EMEA region. His method, in one line: write code in the exact words of the regulator or card network specs, and let the compiler enforce it. Enforce not by discipline, but by the compiler.</p>



<h2 class="wp-block-heading">Watch the KotlinConf 2026 talk</h2>



<p>Watch Yuri Geronimus&#8217;s KotlinConf 2026 talk to learn how Kotlin helps build reliable payment systems.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Kotlin as a Safety Net Type Driven Reliability in the Finance Industry | Yuri Geronimus" src="https://www.youtube.com/embed/XFwhtftwp6s?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>


            <div class="newsletter">
                                                            <article class="newsletter__post">
                                                                                    <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" class="newsletter__post-img" src="https://blog.jetbrains.com/wp-content/uploads/2026/10/kotlin-enterprise-playbook-highlight.png" alt="">
                                                                            <div class="newsletter__post-text">
                                                            <h3>A Legacy Modernization Strategy and Business Case Playbook for Enterprise Kotlin Adoption</h3>
                                                                                                                    <a href="https://kotlinlang.org/lp/enterprise-playbook/" class="btn" target="_blank" rel="noopener">Read the Playbook</a>
                                                    </div>
                    </article>
                                    </div>
    


<h2 class="wp-block-heading"><strong>The world behind the terminal</strong></h2>



<p>Before the patterns, Yuri set the stakes. A &#8220;payment&#8221; isn&#8217;t one app. It&#8217;s a mobile sales app, a point-of-sale app, a payment terminal running on a locked-down OS, payment gateways, terminal management systems, merchant platforms, and, underneath it all, processors, banks, and regulators. Each country carries thousands of pages of specifications and roughly 1,000 scenarios that must be met before anything reaches production.</p>



<p>Some of those terminals have to keep working offline for up to 40 days, by regulation, because in the country they operate in, a payment terminal is critical infrastructure on the same level as a gas station or a pharmacy. Payment teams also have to satisfy contradictory rules from different regulators governing the same shared infrastructure: one country requires a behavior, another forbids it, and both must be enforced in the same codebase. That&#8217;s the environment the type system has to hold up in. Not a demo. Production, worldwide, for decades, not a year.</p>



<h2 class="wp-block-heading"><strong>Six ways one word breaks a payment system</strong></h2>



<p>Yuri walked through real incident patterns from his 15 years in payments and banks, each one traced back to a single missing or misused word:</p>



<ul class="wp-block-list">
<li>An incorrect field caused a reversal, and someone else&#8217;s money landed in the wrong account.</li>



<li>A mandatory field was made nullable &#8220;just in case&#8221;. When a firmware update stopped sending it, the code fell back to a default, and part of the terminal fleet stopped processing payments.</li>



<li>A card number ended up in a log line and a stack trace: a disclosure obligation, and a real compliance problem.</li>



<li>An authorization was approved while the fraud check timed out, and money was stolen.</li>



<li>A request timed out, but the authorization had succeeded upstream, and the customer paid twice.</li>
</ul>



<p>Each of these traces back to the same root cause: somewhere, the code disagreed with the specification about what a word meant, and nothing forced that disagreement into the open before it reached production.</p>



<h2 class="wp-block-heading"><strong>The method: write the spec, then let the compiler check your work</strong></h2>



<p>Yuri described this as a set of patterns, not a framework. Ten of them, all doing the same job: making illegal states impossible to construct, not just invalid ones you catch later.</p>



<h3 class="wp-block-heading"><strong>1. Value classes for spec nouns</strong></h3>



<p>Fraud and risk models carry dozens of similarly shaped IDs: merchant ID, terminal ID, acquirer ID, and more, several of which are literally identical in format due to regulation. As plain strings, nothing stops a refactor or copy-paste from swapping two of them, and the transaction silently routes to the wrong acquirer, for example. Yuri’s fix is a value class per ID.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@JvmInline value class MerchantId(val value: String)
@JvmInline value class AcquirerId(val value: String)
@JvmInline value class AmountMinor(val value: String)

data class AuthRequest(val merchantId: MerchantId, val acquirerId: AcquirerId, val amount: AmountMinor)

fun demo(merchantId: MerchantId, acquirerId: AcquirerId, amount: AmountMinor) {
    AuthRequest(merchantId, acquirerId, amount)   // ✅ compiles
    // AuthRequest(acquirerId, merchantId, amount)   // ❌ type mismatch: swapped arguments do not compile
}</pre>



<p>Swap the arguments now, and the code doesn&#8217;t compile. The mistake that used to reach production becomes a build error on the engineer&#8217;s own machine.</p>



<h3 class="wp-block-heading"><strong>2. Validate factories</strong></h3>



<p>Every external field, whether it comes from a bank&#8217;s API or a terminal&#8217;s firmware, arrives as an untyped string that might not mean what the spec assumes. Yuri’s pattern parses it immediately into a sealed result at the boundary rather than trusting it downstream.<br></p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@JvmInline value class RawStan(val value: String)   // untrusted input
@JvmInline value class Stan(val value: String)      // validated, per spec

sealed interface ParsedStan {
    data class Valid(val stan: Stan) : ParsedStan
    sealed interface Invalid : ParsedStan {
        val rawStan: RawStan
        data class WrongLength(override val rawStan: RawStan) : Invalid
        data class NotNumeric(override val rawStan: RawStan) : Invalid
    }

    companion object {
        fun of(rawStan: RawStan): ParsedStan = when {
            rawStan.value.length != 6         -> Invalid.WrongLength(rawStan)
            !rawStan.value.all(Char::isDigit) -> Invalid.NotNumeric(rawStan)
            else                              -> Valid(Stan(rawStan.value))
        }
    }
}

fun authorize(rawStan: RawStan): AuthResponse =
    when (val parsed = ParsedStan.of(rawStan)) {
        is ParsedStan.Valid   -> gateway.authorize(parsed.stan)   // happy path
        is ParsedStan.Invalid -> reject(parsed)                   // structured rejection
    }   // no else, no try/catch, no Result&lt;T> to unwrap – exhaustiveness is enforced

fun demo(raw: RawStan) {
    when (val parsed = ParsedStan.of(raw)) {   // bad input is a value, not an exception
        is ParsedStan.Valid               -> gateway.authorize(parsed.stan)
        is ParsedStan.Invalid.WrongLength -> reject(parsed)
        is ParsedStan.Invalid.NotNumeric  -> reject(parsed)
        // forget any of the cases → ❌ 'when' expression must be exhaustive
    }
}</pre>



<p>This approach Yuri thinks is a very good practice: it doesn’t throw exceptions; it helps prevent the not-best approach with <code>Result&lt;T&gt;</code>, which hides the business domain, and prevents runCatching pitfalls in coroutines</p>



<h3 class="wp-block-heading"><strong>3. Non-null types at the boundary</strong></h3>



<p>Many times, mandatory fields are marked nullable “just in case”, which requires juggling with silent fallbacks that often hide the real culprit. Yuri suggests leveraging Kotlin’s null-safety to fail loudly in one place:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data class KernelResult(val tvr: TerminalVerificationResults) // ← not Optional, not nullable

fun fromFirmware(raw: FirmwareResponse) = KernelResult(
    tvr = requireNotNull(raw.tvr) { "TVR null - firmware contract violated" }
)
// One loud failure at the boundary. Never a silent fallback downstream

fun demo(raw: FirmwareResponse) {
    // raw.tvr ?: TerminalVerificationResults()   // ❌ "just in case" fallback: silently hides the broken contract
    val result = fromFirmware(raw)   // one loud failure here, at the single parsing point where it is monitored
    val tvr: TerminalVerificationResults = result.tvr   // non-null: nothing downstream has to guard against it
}</pre>



<p>This is the fix for the terminal-fleet outage: the field that was made nullable &#8220;just in case&#8221; never got a silent default again. It fails once, loudly, at the one predictable place it&#8217;s parsed, where it can be monitored, instead of failing quietly somewhere downstream where nobody is watching for it.</p>



<h3 class="wp-block-heading"><strong>4. Mask sensitive data by default</strong></h3>



<p>Card numbers travel through logs and stack traces as plain strings, and that&#8217;s a disclosure obligation waiting to happen. Yuri wraps the value in a class with a private constructor and overrides toString(), so the safe behavior is the default.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Illustration of the idea: in production this is hidden much deeper (PCI scope, key management, encryption)
@JvmInline
value class Pan private constructor(private val value: String) {
    override fun toString() = "PAN[****]"                         // ← always safe
    fun masked(): String = TODO("Pan.masked: masking according to spec")
    fun toNetwork() = value                                       // deliberate, grep-able

    companion object {
        fun of(raw: String): Pan? = TODO("Pan.of: the only way in – validate length, digits and Luhn, then construct")
    }
}

fun demo(card: Pan) {
    logger.info("Processing card $card")   // → "Processing card PAN[****]". Safe by default
    val onWire = card.toNetwork()          // the real value only through an explicit, grep-able call
}</pre>



<p>An accidental log.info(&#8220;processing $pan&#8221;) now prints four masked digits. Getting the real value out, the one thing that&#8217;s genuinely needed to talk to the network, requires an explicit, auditable call. Nothing about that path is invisible anymore. Small note from Yuri: in real systems it hid much deeper.</p>



<h3 class="wp-block-heading"><strong>5. Give every state its own class, not just its own name</strong></h3>



<p>A transaction that&#8217;s been refunded should never be able to call refund again, but a single mutable Transaction class with a status field relies on someone remembering to check that status everywhere. Yuri&#8217;s next-level version gives each state its own data class, so the method cannot change transaction state from the wrong data class; this ensures that a transition that shouldn’t happen (for example, refunding a reversed transaction) is blocked by the compiler.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import TransactionStatus.Captured
import TransactionStatus.FullyRefunded
import TransactionStatus.Reversed
import java.time.Instant

// One class per state: each state carries only the data that is valid in it
sealed interface TransactionStatus {
    data class Captured(val amount: AmountMinor)    : TransactionStatus
    data class FullyRefunded(val at: Instant)       : TransactionStatus
    data class Reversed(val reason: ReversalReason) : TransactionStatus
}

// Refund exists only on Captured: that is where the spec allows it
fun Captured.fullRefund(refundReason: RefundReason) = RefundAuthorization(amount, refundReason)

fun demo(captured: Captured, refunded: FullyRefunded, reversed: Reversed, reason: RefundReason) {
    captured.fullRefund(reason)   // ✅ compiles
    // refunded.fullRefund(reason)   // ❌ unresolved reference: a refunded transaction cannot be refunded again
    // reversed.fullRefund(reason)   // ❌ unresolved reference: a reversed transaction cannot be refunded
}</pre>



<h3 class="wp-block-heading"><strong>6. Immutability and named transition</strong>s</h3>



<p>This continues the previous pattern. Make the class with your business data immutable and give every transition a name. The name is a verb from the spec. Any method that shouldn&#8217;t be callable simply doesn&#8217;t exist:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@ConsistentCopyVisibility  // Kotlin 2.0.20+: copy() is as private as the constructor
data class PurchasedAuthorization private constructor(
    val stan: Stan,
    val amount: AmountMinor,
) : Authorization {
    fun fullRefund(refundReason: RefundReason) = RefundAuthorization(stan, amount, refundReason)
    // no reverseAuthorization(): the spec does not allow it for a purchase
}

fun demo(purchaseAuthorization: PurchasedAuthorization, reason: RefundReason) {
    purchaseAuthorization.fullRefund(reason)         // ✅ compiles
    // purchaseAuthorization.reverseAuthorization()  // ❌ compile error: unresolved reference 'reverseAuthorization'
}</pre>



<p>Yuri called this his favorite pattern because it affects how engineers read a spec. This changes how engineers think and speak about the business domain.</p>



<h3 class="wp-block-heading"><strong>7. Delete the else branch</strong></h3>



<p>If a specification lists every case explicitly and never says &#8220;otherwise,&#8221; then an else in the code is inventing a case the spec doesn&#8217;t describe. His team had handled only full refunds. When partial refunds became a real scenario, the old else branch would have absorbed it silently: compiles fine, tests pass, and it&#8217;s wrong in production. Delete the else, and the same new case becomes a compile error that points to every place needing an update.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">fun authorize(request: AuthorizationRequest): Authorization = when (request) {
    is PurchaseRequest   -> purchase(request)
    is FullRefundRequest -> fullRefund(request)
    // ← no else. Adding a new state BREAKS compilation here
}

fun demo(purchase: PurchaseRequest, refund: FullRefundRequest) {
    authorize(purchase)   // ✅ compiles
    authorize(refund)
    // spec adds: class PartialRefundRequest : AuthorizationRequest
    // → ❌ authorize() stops compiling: 'when' must be exhaustive
}</pre>



<p>The business drifts constantly quarterly and monthly in payment in one country, and for the whole EMEA region &#8211; it becomes daily at Yuri’s scale. An exhaustive when turns every drift into a list of exactly what needs to change, rather than a bug report from a customer who was charged the wrong amount.</p>



<h3 class="wp-block-heading"><strong>8. Choose the coroutine scope the spec implies</strong></h3>



<p>Yuri’s Black Friday example: authorization, risk management, and fraud checks used to run as three independent calls, each in its own try/catch. If fraud management ran slowly under load, the transaction could still be approved while the fraud check silently failed, and stolen cards could start getting approved. Kotlin gives two structured concurrency scopes that look similar and behave completely differently, and the spec, not convenience, should decide which one you use.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import kotlinx.coroutines.*
// coroutineScope = fail-fast.   ← partial success is an incident: one failure cancels the rest
// In production each call also gets its own timeout, and a timeout is an outcome, not a thrown exception
// (full version with tests: production/08_coroutine_scopes)
suspend fun authorize(req: Request) = coroutineScope {
    val auth  = async { acquirer.authorize(req) }
    val risk  = async { riskEngine.score(req) }
    val fraud = async { fraudService.check(req) }
    Outcome.from(auth.await(), risk.await(), fraud.await())
}
// supervisorScope = isolate.    ← partial success is the goal
// Note: runCatching also catches CancellationException. In production rethrow it
// (e.g. `catch (e: CancellationException) { throw e }`) so cancelling the parent still works.
suspend fun fanOut(event: Event) = supervisorScope {
    listOf(
        async { runCatching { sms(event) } },
        async { runCatching { analytics(event) } },
        async { runCatching { feed(event) } },
    ).awaitAll()   // never throws: each failure is a Result.failure in the list
}</pre>



<p>Here, <code>coroutineScope</code> fails fast: if the fraud check fails, authorization and risk are canceled as well, and nothing is silently approved. A supervisorScope would let siblings keep running independently, which is the right call for something like fan-out notifications, where one failure shouldn&#8217;t cancel the rest. The question isn&#8217;t which scope is more idiomatic. It&#8217;s what the spec says should happen when one branch fails.</p>



<h3 class="wp-block-heading"><strong>9. Model timeout as a domain outcome, not an exception</strong></h3>



<p>A gateway call that times out isn&#8217;t necessarily a failure. The acquirer may have already processed it; the client just didn&#8217;t hear back in time. Catching that as a generic exception and moving on erases the difference between &#8220;nothing happened&#8221; and &#8220;something happened, we&#8217;re just not sure what&#8221;. Yuri’s fix models a Timeout as a first-class outcome in the domain.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import AuthorizationOutcome.Approved
import AuthorizationOutcome.Declined
import AuthorizationOutcome.TimedOut

sealed interface AuthorizationOutcome {
    data class Approved(val authCode: AuthCode)    : AuthorizationOutcome
    data class Declined(val reason: DeclineReason) : AuthorizationOutcome
    data object TimedOut                           : AuthorizationOutcome // ← spec verb, named in domain
}

fun demo(req: Req) {
    when (val outcome = processAuth(req)) {
        is Approved -> settleTransaction(outcome.authCode)
        is Declined -> notifyCardHolder(outcome.reason)
        is TimedOut -> reconcile(req)  // not retry: it may have succeeded upstream
    }
}</pre>



<p><code>TimedOut</code> isn&#8217;t the absence of an answer. It&#8217;s a distinct state that routes to a reconciliation query rather than a retry, because a naive retry after a timeout that actually succeeded upstream is exactly how a customer ends up charged twice.</p>



<h3 class="wp-block-heading"><strong>10. Make the tests something a regulator can read</strong></h3>



<p>Yuri’s least expected pattern targets certification tests, not application code. A typical certification suite runs a thousand tests at roughly 200 lines each, and, in his words, not even an architect can read that. The team rewrote the tests as Kotlin DSL. Written that way, a certification specialist who has never written Kotlin can read the test, follow the logic against the specification, and sign off on it directly. The test stops being an artifact only test engineers can verify and becomes a specification the business and certification specialists can review.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">val purchaseOverFloorLimit = scenario("Purchase with tap card above floor limit must go online") {
    terminal { floorLimit = 50.EUR }
    posRequest  { purchase(amount = 75.EUR) }
    tap { card = TestCards.visaWithOnlinePIN }

    expect {
        terminalDecision  mustBe  GoOnline
        outcome           mustBe  Approved
    }
}</pre>



<h2 class="wp-block-heading"><strong>What actually moved</strong></h2>



<p>Yuri is specific about the outcomes: development ran 2.7 times faster, and certification passed with only one defect and on the first attempt, unusual enough that regulators asked what had changed. The resulting codebase was about 30% smaller. Code review shifted from hunting for missed state checks to comparing code against the specification sentence by sentence, because the compiler now catches the class of bug reviewers used to look for by hand. Onboarding a new engineer used to take two or three weeks before they understood enough of a 5,000-page specification and a legacy codebase to ship anything. Afterward, new hires opened a production pull request within days. Engineers could also move between device teams and backend teams, something a split codebase in two different languages had made difficult. The last effect Yuri called out was that engineers started speaking the business&#8217;s language well enough to talk directly with product managers, sales, and regulators, occasionally proposing changes to the regulations themselves.</p>



<h2 class="wp-block-heading"><strong>Payments modernization without a rewrite</strong></h2>



<p>Yuri is direct about the mistake most teams make: treating migration as one project, a rewrite in Kotlin. His systems run 25-year-old Java and C++ code processing live transactions every second, with no acceptable downtime, so a rewrite was never on the table. Framed as a refactor-vs-rewrite decision, the answer for a live payments platform is almost always refactor. His alternative is four tracks that run in parallel, not in sequence.</p>



<ol class="wp-block-list">
<li><strong>Optimize the existing codebase first</strong>, in Java or C++, without touching the language; modernize code structure now &#8211; shared layout, clean architecture, screaming architecture &#8211; even before any Kotlin lands.</li>



<li><strong>Shift to acceptance-test-driven development</strong>, not unit-test-driven. Nobody outside the engineering team cares what&#8217;s inside a function; everybody cares about the end-to-end behavior.</li>



<li><strong>Build fitness functions</strong> to check compliance, security, scalability, and other “-lities” that run alongside the migration rather than being assessed at the end.</li>



<li><strong>Migrate incrementally</strong>: new adapters first, then new domain models, then the legacy code that changes most often, working to reduce the number of &#8220;shared ports&#8221; to zero. Kotlin&#8217;s interop with Java is what makes this incremental path possible at all: a new adapter can sit alongside unmodified Java code without a dual-maintenance period.</li>
</ol>



<p>Running all four at once, according to Yuri, is what makes a payments modernization effort safe and cost-effective in a regulated environment. Running them in sequence is what makes migrations stall.</p>



<h2 class="wp-block-heading"><strong>Migration is an investment decision, not a language preference</strong></h2>



<p>Yuri pointed out who needs convincing in an enterprise: it isn&#8217;t the engineering team. He referenced <a href="https://www.youtube.com/watch?v=w7e4g86EyXk" target="_blank" rel="noopener">a talk from Uber&#8217;s team the day before his</a>, at the same event, making a similar point: even a company known for moving fast treats language migration as an investment decision once it&#8217;s operating at enterprise scale. A credible business case has to account for the costs of running old and new systems in parallel, the costs of decommissioning what&#8217;s being replaced, the learning curve for the team, and the risk of the transition itself. Getting the migration approved is not the same as its adoption. Without an operating model for how the migration actually runs day-to-day, Yuri was blunt: there&#8217;s no happy ending waiting at the end of it.</p>



<p>He pointed to a resource for that exact gap: a <a href="https://kotlinlang.org/lp/enterprise-playbook/" target="_blank" rel="noreferrer noopener">22-page playbook on the Kotlin site</a>, published two days before this talk, covering, in his words, &#8220;the part that everybody skips&#8221;.</p>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1791809546909" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>What is Yuri Geronimus&#8217;s core method, in one sentence?</strong></h3>
<div class="rank-math-answer ">

<p>Write code in the literal words of the specification and let the compiler enforce them, rather than relying on discipline or documentation to catch gaps between the two.</p>

</div>
</div>
<div id="faq-question-1791809559945" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Do you have to rewrite a legacy Java or C++ system to use these patterns?</strong></h3>
<div class="rank-math-answer ">

<p>No. Yuri explicitly argues against treating migration as a rewrite project. His four tracks run in parallel: optimizing the existing codebase, shifting to acceptance testing, more focus on fitness functions, and migrating incrementally, starting with adapters and the domain models, then going from the most-often-changed parts.</p>

</div>
</div>
<div id="faq-question-1791809566348" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Why doesn&#8217;t discipline or code review catch these bugs instead?</strong></h3>
<div class="rank-math-answer ">

<p>At the scale Yuri operates, 20 teams worldwide, discipline doesn&#8217;t scale evenly. A compiler check applies identically everywhere, every time, regardless of who&#8217;s on call or how careful any one reviewer is that day.</p>

</div>
</div>
<div id="faq-question-1791809576890" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Further reading</strong></h3>
<div class="rank-math-answer ">

<p>Yuri Geronimus writes more broadly on Kotlin in payments and fintech in his <a href="https://yurigeronimus.medium.com/kotlin-in-payment-gateways-and-fintech-a-strategic-fit-for-2026-architectures-f049a01059f9" target="_blank" rel="noopener">own posts on Medium</a>. For the business case and operating model he referenced in the talk, the resource is JetBrains&#8217; <a href="https://kotlinlang.org/lp/enterprise-playbook/" target="_blank" rel="noopener">enterprise Kotlin adoption playbook</a>, also written with Yuri Geronimus.</p>

</div>
</div>
</div>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Start Your Next KMP App With Kotlin Toolchain 0.13</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/start-your-next-kmp-app-with-kotlin-toolchain-0-13/</link>
		
		<dc:creator><![CDATA[Anton Makeev]]></dc:creator>
		<pubDate>Wed, 07 Oct 2026 10:21:46 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/KM-social-BlogFeatured-1280x720-1-1.png</featuredImage>		<category><![CDATA[multiplatform]]></category>
		<category><![CDATA[kotlin]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=744876</guid>

					<description><![CDATA[The Kotlin Toolchain is a unified entry point into Kotlin. It lets you build JVM, Android, iOS, multiplatform, and server-side applications with a simple declarative configuration. With the release of v0.13, we now recommend the Kotlin Toolchain for most new Kotlin Multiplatform (KMP) projects. Earlier this year, we promoted the Kotlin Toolchain to Alpha. Since [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The Kotlin Toolchain is a unified entry point into Kotlin. It lets you build JVM, Android, iOS, multiplatform, and server-side applications with a simple declarative configuration.</p>



<p>With the release of v0.13, we now recommend the Kotlin Toolchain for most new Kotlin Multiplatform (KMP) projects.</p>



<p>Earlier this year, we <a href="https://blog.jetbrains.com/amper/2026/06/kotlin-toolchain-0-11/" target="_blank" rel="noreferrer noopener">promoted the Kotlin Toolchain to Alpha</a>. Since then, our Slack channels and issue tracker have been very active. So many of you in the community have joined us to create a great build experience for Kotlin. Thank you – your continuous feedback helped us get here!</p>



<p><em>Not using the Kotlin Toolchain yet? Experience automated environment setup and an intuitive CLI that works well with your AI agents.</em></p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotlin-toolchain.org" target="_blank" rel="noopener"><i class="download-icon"></i>Install Kotlin Toolchain</a></p>



<p><em>To access the latest Kotlin Toolchain features from your IDE, use </em><a href="https://www.jetbrains.com/idea/" target="_blank" rel="noreferrer noopener"><em>IntelliJ IDEA 2026.2.3</em></a><em>,  Android Studio Rabbit 1 | 2026.2.1 (or newer). Make sure the latest version of the </em><a href="https://plugins.jetbrains.com/plugin/31850-kotlin-toolchain" target="_blank" rel="noreferrer noopener"><em>Kotlin Toolchain plugin</em></a><em> is installed.</em></p>



<h2 class="wp-block-heading">How the Kotlin Toolchain simplifies getting started</h2>



<p>Getting started with Kotlin Multiplatform often means working with unfamiliar platforms. Android developers might be discovering iOS for the first time, while other teams are expanding to web or desktop. Every platform comes with its own tools to install and build configurations to understand.</p>



<p>The Kotlin Toolchain changes that. It is a single CLI entry point for configuring the environment, creating, building, testing, and publishing your KMP apps and libraries. It comes with a declarative project configuration and set of all necessary tools – everything you need in one place.</p>



<p>In recent releases, we’ve refined the CLI and IDE experiences, added support for web and cinterop, and made many other improvements based on your feedback. Our internal dogfooding and positive community feedback have given us the confidence to recommend it for new projects!</p>



<p>We’ll feature the Kotlin Toolchain in our KMP getting started guides, web and IDE project wizards. These updates will make it easier for both developers and AI agents to select the Kotlin Toolchain when it&#8217;s most appropriate for the task at hand.</p>



<h2 class="wp-block-heading">Direct support for agentic workflows</h2>



<p>From early on, we designed the Kotlin Toolchain to be reliable and easy to use for both developers and IDEs. It turns out that the automatic environment setup, declarative configurations, and clear, actionable error messages provide an ideal foundation for AI agents as well.</p>



<p>We’ve taken this further by introducing a Hot Reload MCP server and dedicated AI agent skills, included in the official AI agent skills for Kotlin. You can install them with:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">npx skills add kotlin/kotlin-agent-skills</pre>



<p>Eventually, these skills will be delivered directly through the Kotlin Toolchain. In our benchmarks, AI agents already generate and maintain Kotlin Toolchain projects <a href="https://github.com/JetBrains/kotlin-toolchain/tree/main/ai-evals/results" target="_blank" rel="noreferrer noopener">more reliably while consuming fewer tokens</a>.</p>



<h2 class="wp-block-heading">What’s new in the 0.13 release</h2>



<h3 class="wp-block-heading">New project creation with <code>kotlin new</code></h3>



<p>Version 0.13 introduces the <code>kotlin new</code> command, offering an interactive setup flow similar to the <a href="https://kmp.jetbrains.com/?android=true&amp;ios=true&amp;iosui=compose&amp;includeTests=true" target="_blank" rel="noreferrer noopener">Kotlin Multiplatform Wizard</a>. Note that the <code>kotlin init</code> command remains available; it has been updated to match the behavior of <code>kotlin new</code>, but it generates project files directly inside your current directory.</p>



<p>When you run <code>kotlin new</code>, the first prompt asks you to select your application type:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" fetchpriority="high" decoding="async" src="https://admin.blog.jetbrains.com/wp-content/uploads/2026/10/01-kotlin-new-application-type.png" alt="" class="wp-image-745063"/></figure>



<p>For Kotlin Multiplatform applications, you can choose your target platforms in the second step:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://admin.blog.jetbrains.com/wp-content/uploads/2026/10/02-kotlin-new-target-platforms.png" alt="" class="wp-image-745074"/></figure>



<h3 class="wp-block-heading"><strong>Better onboarding UX for iOS applications</strong></h3>



<p>Setting up iOS applications on a clean machine is now significantly smoother:</p>



<ul class="wp-block-list">
<li>Better Xcode installation diagnostics: Get clear, actionable messages regarding Xcode license acceptance and first-run status.</li>



<li>iOS simulator runtimes are downloaded automatically when needed. An iOS simulator is created automatically if none exists.</li>
</ul>



<h3 class="wp-block-heading"><strong>Download progress reporting in the CLI</strong></h3>



<p>The TUI now displays rich download progress bars when the Kotlin Toolchain downloads required tools, such as JDKs, Android SDK components, iOS runtimes, and compilers.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://admin.blog.jetbrains.com/wp-content/uploads/2026/10/03-tool-download-progress.gif" alt="" class="wp-image-745102"/></figure>



<h3 class="wp-block-heading"><strong>Android improvements</strong></h3>



<p>In previous versions, the Android SDK was automatically provisioned when running <code>kotlin build</code> or <code>kotlin run</code> but not when opening the project in an IDE. If you opened a project in your IDE before running a build, missing SDKs could cause setup errors.</p>



<p>We have aligned CLI and IDE behavior, and the Kotlin Toolchain now automatically provisions missing Android SDK components on project import.</p>



<p>Additionally, we’ve also tightened validation for namespace and application ID definitions so you don’t accidentally publish app or library builds with sample IDs like <code>com.example.app</code>.</p>



<h3 class="wp-block-heading"><strong>Sync status in the IDE editor</strong></h3>



<p>You can now monitor the current IDE sync status inside your file editor:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://admin.blog.jetbrains.com/wp-content/uploads/2026/10/04-ide-sync-status.png" alt="" class="wp-image-745085"/></figure>



<h3 class="wp-block-heading"><strong>SPM import</strong></h3>



<p>The Kotlin Toolchain now supports Swift Package Manager dependencies for Apple platforms.</p>



<p>Modules with Apple platform support (e.g. <code>kmp/lib</code>, <code>ios/app</code>) can import Objective-C APIs from Objective-C and Swift code using SwiftPM dependencies:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">product: ios/app

dependencies:
  - swiftPackage:
      repository: "https://github.com/firebase/firebase-ios-sdk.git"
      version: "12.17.0"
      products: [ "FirebaseCore", "FirebaseFirestore", "FirebaseAnalytics" ]
</pre>



<p>Imported Objective-C APIs are namespaced using the swiftPMImport prefix and ending with the module name:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// app/src/app.kt
import swiftPMImport.app.FIRAnalytics
import swiftPMImport.app.FIRApp</pre>



<p>Kotlin Toolchain also supports local SwiftPM packages using the <code>localSwiftPackage</code> key. See our <a href="https://kotlin-toolchain.org/dev/user-guide/dependencies/#swiftpm-dependencies" target="_blank" rel="noreferrer noopener">documentation</a> for more details.</p>



<h3 class="wp-block-heading"><strong>Multiplatform library publication improvements</strong></h3>



<p>When publishing multiplatform libraries, your Compose Resources and SwiftPM dependencies metadata are published along with your build artifacts.</p>



<p>Compose Resources are also resolved from third-party multiplatform libraries.</p>



<h3 class="wp-block-heading"><strong>Kotlin/Native compiler caches</strong></h3>



<p>Kotlin/Native rebuilds just got faster. With <a href="https://youtrack.jetbrains.com/issue/KTC-5422/Support-Kotlin-Native-compiler-caches-in-Kotlin-Toolchain" target="_blank" rel="noopener">KTC-5422</a>, the Kotlin Toolchain caches compiled native dependencies and reuses them across builds and even across projects. Project code gets per-file caches, letting the compiler rebuild only the affected code during linking. Once the caches are populated, small edits mean less work and faster edit–build–run cycles for native apps and tests.</p>



<p>The feature uses the existing <code>settings.kotlin.compileIncrementally</code> setting and supports non-optimized debug binaries on compatible targets. Compilation to <code>.klib</code> files continues to run in full.</p>



<h2 class="wp-block-heading"><strong>What’s next for the Kotlin Toolchain and KMP</strong></h2>



<p>We have some exciting milestones on our roadmap, including:</p>



<ul class="wp-block-list">
<li>Installing the Kotlin Toolchain via <code>brew install kotlin</code>.</li>



<li>Providing AI skills out of the box.</li>



<li>Supporting Swift Export as it stabilizes.</li>



<li>Streamlining and automating app store publishing workflows.<br></li>
</ul>



<p>Much of our immediate focus will be on understanding new user feedback and closing existing gaps, including those for existing Gradle projects, before recommending migrations.</p>



<p>To achieve this, we want to hear from you! As we refine the functionality, some changes may require adjustments to your projects, and we’ll do our best to support you through those migrations and make them as smooth as possible.</p>



<p>Join the conversation in the <a href="https://slack-chats.kotlinlang.org/c/kotlin-toolchain" target="_blank" rel="noreferrer noopener">#kotlin-toolchain Slack channel</a> (get invite: <a href="https://kotl.in/slack" target="_blank" rel="noreferrer noopener">kotl.in/slack</a>) or share your suggestions and ideas in <a href="https://youtrack.jetbrains.com/issues/KTC" target="_blank" rel="noreferrer noopener">JetBrains YouTrack</a>. Your input and use cases help shape the future of the Kotlin Toolchain!</p>



<h2 class="wp-block-heading"><strong>Install Kotlin Toolchain 0.13.0</strong></h2>



<p>Ready to give the Kotlin Toolchain a go? Check out our <a href="https://kotlin-toolchain.org/latest/getting-started/" target="_blank" rel="noreferrer noopener">Getting started</a> guide to dive into code examples, tutorials, or our comprehensive user guide.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://kotlin-toolchain.org/latest/" class="btn " target="" rel="noopener">Install Kotlin Toolchain</a>
                                    </div>
    </div>







<p>Already using the Kotlin Toolchain? Simply run <code>kotlin update</code> in your terminal to upgrade.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Discontinuing Swift Language IDE Support in the Kotlin Multiplatform Plugin</title>
		<link>https://blog.jetbrains.com/kotlin/2026/10/discontinuing-swift-language-ide-support-in-the-kotlin-multiplatform-plugin/</link>
		
		<dc:creator><![CDATA[Anton Makeev]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 10:46:19 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/KM-social-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[multiplatform]]></category>
		<category><![CDATA[kotlin-multiplatform]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=744281</guid>

					<description><![CDATA[Starting with IntelliJ IDEA 2026.3 and Android Studio Rabbit 2 &#124; 2026.2.2, we’re discontinuing Swift language IDE features in the Kotlin Multiplatform (KMP) plugin. This includes editing, syntax highlighting, and navigation within Swift files and between Swift and Kotlin. Running iOS applications and debugging Kotlin code on iOS will remain fully supported. Kotlin/Native functionality, such [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Starting with IntelliJ IDEA 2026.3 and Android Studio Rabbit 2 | 2026.2.2, we’re discontinuing Swift language IDE features in the Kotlin Multiplatform (KMP) plugin. This includes editing, syntax highlighting, and navigation within Swift files and between Swift and Kotlin.</p>



<p>Running iOS applications and debugging Kotlin code on iOS will remain fully supported. Kotlin/Native functionality, such as <a href="https://kotlinlang.org/docs/native-swift-export.html" target="_blank" rel="noreferrer noopener">Swift Export</a> and <a href="https://kotlinlang.org/docs/multiplatform/multiplatform-spm-import.html" target="_blank" rel="noreferrer noopener">importing Swift packages into Kotlin projects</a>, is not affected. </p>



<p>The existing Swift functionality will remain available in earlier versions of IntelliJ IDEA, Android Studio, and the Kotlin Multiplatform plugin, though these older versions will not receive further updates.</p>



<h2 class="wp-block-heading"><strong>Background</strong></h2>



<p>We originally developed Swift support for AppCode (our since-discontinued iOS IDE) and for working directly with Xcode projects. This technology was later adapted for Fleet’s polyglot capabilities and, most recently, for working with mixed Kotlin–Swift codebases using the Kotlin Multiplatform plugin.</p>



<p>While analyzing feature adoption, we found that active usage was limited and steadily declining. Our telemetry and user research showed that most iOS developers working on KMP projects prefer using Xcode for Swift development, while teams that primarily work in the Kotlin Multiplatform plugin increasingly use Kotlin and Compose Multiplatform.</p>



<p>Maintaining this Swift tooling, which inherited its core architecture from AppCode, requires substantial ongoing effort to stay compatible with continuous changes in Swift, Xcode, and the IntelliJ Platform. While we previously considered expanding Kotlin–Swift IDE support in the plugin, after weighing the necessary engineering investment against actual usage numbers we decided not to continue.</p>



<h2 class="wp-block-heading"><strong>Looking ahead</strong></h2>



<p>We do not currently plan to replace these features. Moving forward, we will continue evaluating workflows and focus on providing excellent Kotlin tooling in IntelliJ IDEA and Android Studio and improving the KMP experience for iOS developers.<br><br>We would like to thank everyone who used Swift IDE features, especially those who have been with us since the AppCode days, and to all the contributors who put so much dedication into building and refining Swift support over the years.</p>



<p>Yours,&nbsp;</p>



<p>The Kotlin team</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/kotlin/2026/10/discontinuing-swift-language-ide-support-in-the-kotlin-multiplatform-plugin/</url>
                    </language>
                	</item>
		<item>
		<title>The Companions to Come</title>
		<link>https://blog.jetbrains.com/kotlin/2026/09/the-companions-to-come/</link>
		
		<dc:creator><![CDATA[Alejandro Serrano Mena]]></dc:creator>
		<pubDate>Wed, 30 Sep 2026 10:33:03 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/KT-social-BlogFeatured-1280x720-1-2.png</featuredImage>		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[news]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=743559</guid>

					<description><![CDATA[We are working on extensions to our companions mechanism to unlock new code patterns and improve interoperability across different platforms. This post outlines these new features and provides preliminary guidance on migration. Companion blocks and extensions Many programming languages provide a notion of class or type members – functionality that does not belong to each [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We are working on extensions to our companions mechanism to unlock new code patterns and improve interoperability across different platforms. This post outlines these new features and provides preliminary guidance on migration.</p>



<h2 class="wp-block-heading">Companion blocks and extensions</h2>



<p>Many programming languages provide a notion of class or type members – functionality that does not belong to each particular value of a class, but to the class itself. Constants, utilities, and factory methods are often in this group.<br></p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">val v1 = Vector(1.0, 2.0)             // a regular vector
val v2 = Vector.ZERO                  // the constant zero vector
val v3 = Vector.unit(angle = PI / 2)  // unit vector with an angle </pre>



<p>Previously, <a href="https://kotlinlang.org/docs/object-declarations.html#companion-objects" target="_blank" rel="noopener">companion objects</a> were used to define these members. From Kotlin 2.5.0 on, you can also use an experimental companion block, which is very close syntactically, but with profound changes in compilation.<br></p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data class Vector(val x: Double, val y: Double) {
  companion {
    val ZERO = Vector(0.0, 0.0)
  }
}</pre>



<p>In fact, these members may not be defined directly on the class itself. You can also use an experimental companion extension to declare new class members in a type, even if you don&#8217;t control them.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">companion fun Vector.unit(angle: Double) = Vector(cos(angle), sin(angle))</pre>



<p>The design of companion blocks and extensions overcomes the limitations imposed by companion objects. First of all, you can define companion extensions for any class or interface – whether you control it or not, whether it originally comes from Kotlin or from Java, or whether it has a companion object or not.&nbsp;<br><br>Second, the compilation strategy resembles that of static members in other platforms. For example, on the JVM, companion blocks are compiled as static members. This has additional implications for Kotlin Multiplatform: you can now define expected companion block members and actualize them using a Java class that contains static members.</p>



<p><em>If you want to know more about this upcoming language feature, the corresponding </em><a href="https://github.com/Kotlin/KEEP/blob/main/proposals/KEEP-0449-companions-block-extension.md" target="_blank" rel="noopener"><em>KEEP proposal</em></a><em> contains all the information.</em></p>



<h2 class="wp-block-heading">Using experimental companions</h2>



<p>Companion blocks and extensions are experimental features <strong>available starting Kotlin 2.5.0-Beta1</strong>. That means that you need to pass an additional compiler flag to use the feature:</p>



<ul class="wp-block-list">
<li><code>-Xcompanion-blocks</code> to allow companion blocks.</li>



<li><code>-Xcompanion-blocks-and-extensions</code> to allow both companion blocks and extensions.<br></li>
</ul>



<p>Using the second feature causes the compiler to produce pre-release binaries, which means libraries using companion extensions may not be consumed as dependencies until the feature becomes stable. This restriction does not apply to exposing companion blocks, although consumers of such blocks still need to enable the companion blocks feature.</p>



<h2 class="wp-block-heading">What about my companion objects?&nbsp;</h2>



<p>This leads to a natural question: What is the role of companion objects in a language with companion blocks and extensions? There are two answers to this question:</p>



<ul class="wp-block-list">
<li>On the one hand, most usages of companion objects would be better served by companion blocks, so new code may prefer the latter to the former.</li>



<li>On the other hand, there are a few use cases that are only served by companion objects. For example, if your companion needs to implement a particular interface, companion objects are the only possibility, since they compile to a full-fledged class.<br></li>
</ul>



<p>There&#8217;s no need to migrate, though. Companion objects are an integral part of Kotlin, and support for them is fully guaranteed.&nbsp;</p>



<p>If you prefer to move to companion blocks, removing the <code>object</code> keyword should be enough in most cases – but note that the project and any code depending on it need to be recompiled. Other tooling in the ecosystem may not be ready for companion blocks, although we’re trying to ensure major players provide this support as soon as possible.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The State of Kotlin in 2026 Report</title>
		<link>https://blog.jetbrains.com/kotlin/2026/09/state-of-kotlin-2026-report/</link>
		
		<dc:creator><![CDATA[Daria Voronina]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 12:38:29 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/X-800x418-1.png</featuredImage>		<category><![CDATA[news]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[backend]]></category>
		<category><![CDATA[kotlin-multiplatform]]></category>
		<category><![CDATA[multiplatform]]></category>
		<category><![CDATA[state-of-kotlin]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=743045</guid>

					<description><![CDATA[In 2026, Kotlin turned fifteen. Over those fifteen years, Kotlin has built a mature ecosystem, been adopted by companies around the world, and established a large and active developer community. Fifteen years is long enough to understand which technology trends lasted and which didn’t. This report looks back at Kotlin’s first fifteen years to see [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>In 2026, Kotlin turned fifteen. Over those fifteen years, Kotlin has built a mature ecosystem, been adopted by companies around the world, and established a large and active developer community.</p>



<p>Fifteen years is long enough to understand which technology trends lasted and which didn’t. This report looks back at Kotlin’s first fifteen years to see what they reveal about how the language matured, while answering questions like: “Is Kotlin here to stay?”, “Can Kotlin scale across platforms?”, and “How does Kotlin fit into the AI era?”</p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotlinlang.org/assets/state-of-kotlin-2026.pdf?utm_source=blog&#038;utm_medium=referral&#038;utm_campaign=state-of-kotlin-26" target="_blank" rel="noopener"><i class="download-icon"></i>View Report</a></p>



<div data-wp-interactive="core/file" class="wp-block-file"><object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://blog.jetbrains.com/wp-content/uploads/2026/09/state-of-kotlin-2026-compressed.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of State of Kotlin in 2026."></object><a id="wp-block-file--media-a30706cf-a57b-4267-8f5d-16c8d75da8fe" href="https://blog.jetbrains.com/wp-content/uploads/2026/09/state-of-kotlin-2026-compressed.pdf" target="_blank" rel="noreferrer noopener">State of Kotlin in 2026</a></div>



<p>Today, developers worldwide use Kotlin across a diverse range of applications, including mobile, backend, and multiplatform. The language is also finding its place in the rapidly evolving AI space, where Kotlin’s strengths, like static typing, null safety, and coroutines, take on new relevance. Kotlin is actively participating in the shift toward AI-assisted development: Among surveyed Kotlin developers, 93% use at least one AI coding tool, while 81% already use or are likely to try AI coding agents. An equal share – 81% – say that AI-generated Kotlin code is fully correct or requires only minor fixes.</p>



<p>The <em>State of Kotlin in 2026</em> report combines data from JetBrains research with independent industry data and real-world adoption evidence. Some findings confirmed what we expected; others challenged some familiar assumptions. While the language remains deeply established in Android development, more than half of Kotlin developers now report working on backend projects, highlighting how far its usage has expanded beyond mobile.</p>



<p>Together, these findings point to a broader story: Kotlin’s evolution isn’t just about growth, but about how diverse its usage has become, spanning backend, multiplatform, AI-assisted development, and more. At the same time, the developer community itself has grown more experienced.</p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotlinlang.org/state-of-kotlin-2026/?utm_source=blog&#038;utm_medium=button&#038;utm_campaign=state-of-kotlin-26" target="_blank" rel="noopener"><i class="download-icon"></i>State of Kotlin in 2026: Explore the highlights</a></p>



<p>See what the data tells us about how Kotlin has evolved and where its ecosystem stands today.</p>



<p>Read the full report → <a href="https://kotlinlang.org/assets/state-of-kotlin-2026.pdf?utm_source=blog&amp;utm_medium=referral&amp;utm_campaign=state-of-kotlin-26" data-type="link" data-id="https://kotlinlang.org/assets/state-of-kotlin-2026.pdf?utm_source=blog&amp;utm_medium=referral&amp;utm_campaign=state-of-kotlin-26" target="_blank" rel="noreferrer noopener">Download the State of Kotlin in 2026 PDF</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A More Reliable Compilation Scheme for Kotlin Multiplatform Modules</title>
		<link>https://blog.jetbrains.com/kotlin/2026/09/a-more-reliable-compilation-scheme-for-kotlin-multiplatform-modules/</link>
		
		<dc:creator><![CDATA[Aleksey Zamulla]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 09:38:26 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/KM-social-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[compiler]]></category>
		<category><![CDATA[experimental-features]]></category>
		<category><![CDATA[kotlin-multiplatform]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=742576</guid>

					<description><![CDATA[The current compilation approach to Kotlin Multiplatform projects works, but sometimes can lead to unexpected or hard-to-predict behavior. For example: With Kotlin 2.5.0-Beta1, we introduced an optional &#8220;separate compilation&#8221; approach to KMP that solves both problems: make the compilation results consistent with IDE analysis, and point more consistently to problematic calls of library code from [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The current compilation approach to Kotlin Multiplatform projects works, but sometimes can lead to unexpected or hard-to-predict behavior. For example:</p>



<ul class="wp-block-list">
<li>The IDE analysis disagrees with the compiler on an overload, type inference, or whether the code should compile at all – with the IDE being <strong>stricter</strong> than the compiler.</li>



<li>Your <code>commonTest</code> code can unexpectedly call something from a platform source set, breaking your assumptions.</li>
</ul>



<p>With Kotlin 2.5.0-Beta1, we introduced an optional &#8220;separate compilation&#8221; approach to KMP that solves both problems: make the compilation results consistent with IDE analysis, and point more consistently to problematic calls of library code from common source sets. As a bonus, this approach enables us to implement <a href="https://kotlinlang.org/docs/gradle-compilation-and-caches.html#incremental-compilation" target="_blank" rel="noopener">incremental compilation</a> for common source sets.</p>



<p>The separate compilation feature is <a href="https://kotlinlang.org/docs/components-stability.html#stability-levels-explained" target="_blank" rel="noopener">Experimental</a> and disabled by default. To opt in, add the following compiler option to your <code>gradle.properties</code> file (note the <a href="#known-issues">known issues</a>):</p>



<pre class="EnlighterJSRAW">kotlin.kmp.separateCompilation=true</pre>



<p>Let&#8217;s look closer at the problem and the solution.</p>



<h2 class="wp-block-heading">How multiplatform declarations are resolved within a module</h2>



<p>Within a module, multiplatform code performs predictably:</p>



<pre class="EnlighterJSRAW">// jvmMain
fun foo() {}

// commonMain
fun test() {
    foo() // Unresolved reference in IDE and during compilation
}</pre>



<p>The compiler and the IDE agree: The code in <code>commonMain</code> is also compiled to other platforms, for example, to Kotlin/JS, and there might not be a <code>fun foo()</code> declaration in <code>jsMain</code>. <a href="https://kotlinlang.org/docs/multiplatform/multiplatform-expect-actual.html" target="_blank" rel="noopener">Expect/actual declarations</a> exist precisely to solve this problem: explicitly tie platform-specific declarations to common ones.</p>



<p>You would expect that the reference is also flagged as unresolved when the <code>foo()</code> function is declared in a dependency (a module in the same project or a binary artifact like Kotlin standard library or <code>kotlinx-coroutines</code>). Unfortunately, with the current compilation scheme that&#8217;s where the IDE and the compiler disagree.</p>



<h2 class="wp-block-heading">How multiplatform declarations are resolved between modules</h2>



<p>To understand where the problems stem from, let&#8217;s look closer at the current compilation setup.</p>



<h3 class="wp-block-heading">Kotlin Multiplatform compilation setup</h3>



<p>In a KMP project, a module with common code usually consists of several source sets: in the example above it&#8217;s a shared source set (<code>commonMain</code>) and a platform source set for a declared target (<code>jvmMain</code> for Kotlin/JVM).</p>



<p>With that setup, the compiler can produce the following artifacts:</p>



<ul class="wp-block-list">
<li>A platform artifact for each platform source set like <code>jvmMain</code> – <code>*.jar</code> on JVM, <code>*.klib</code> on other platforms.</li>



<li>A metadata KLIB for each common or intermediate source set (like <code>commonMain</code> or <code>nativeMain</code>). A metadata KLIB contains all declarations from the compiled source set without bodies.</li>
</ul>



<p>So where do the problems start?</p>



<h3 class="wp-block-heading">Common code is compiled against platform artifacts; IDE disagrees</h3>



<p>During compilation of a platform source set, both the code inside it (<code>jvmMain</code>) <strong>and</strong> the code in all relevant shared source sets (<code>commonMain</code> and other <a href="https://kotlinlang.org/docs/multiplatform/multiplatform-hierarchy.html#default-hierarchy-template" target="_blank" rel="noopener">intermediate source sets</a>) is compiled against the platform artifacts of its dependencies. Here code from <code>commonMain</code> has a chance to implicitly resolve to a <code>jvmMain</code> declaration.</p>



<p>If you expect this to happen, you&#8217;re probably fine. It would be more transparent and predictable, however, if <code>commonMain</code> could only call declarations from the dependency&#8217;s <code>commonMain</code> (as listed in the dependency&#8217;s metadata KLIB).</p>



<p>This is exactly what the code analysis in IntelliJ IDEA already assumes. As <code>jvmMain</code> declarations are not included in the KLIB metadata, IntelliJ IDEA reports the unresolved reference error when <code>commonMain</code> refers to something not declared in common code explicitly:</p>



<pre class="EnlighterJSRAW">// lib/jvmMain
class Foo

// app/commonMain
fun main() {
    Foo() // Unresolved reference in the IDE, no error during compilation
}</pre>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Current-compilation-with-IDEA-1.jpg" alt="" class="wp-image-742856"/></figure>



<p>The same mechanism is also in play with <code>commonTest</code> source sets, because tests also &#8220;depend&#8221; on main code: <code>commonTest</code> compiled against <code>jvmMain</code> can successfully call a declaration from platform code, instead of being restricted to declarations in <code>commonMain</code>. IDE reports the same unresolved reference problem:</p>



<pre class="EnlighterJSRAW">// app/jvmMain
class Foo

// app/commonTest
fun main() {
    Foo() // &quot;Unresolved reference&quot; in the IDE, no error during compilation
}</pre>



<p>Let&#8217;s see how separate compilation solves these problems.</p>



<h2 class="wp-block-heading">How separate compilation solves the problem</h2>



<p>KMP separate compilation makes the compiler behave stricter (aligning with the IDE expectation) when compiling common source sets of KMP projects. This makes the overall experience more predictable, although you may need to adjust your old code for stricter compile-time checks.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Separate-compilation-1.jpg" alt="" class="wp-image-742867"/></figure>



<p>Let&#8217;s look at specific code examples and what happens to them with the switch between compilation schemes.</p>



<h3 class="wp-block-heading">Red code in IDE, no error during compilation</h3>



<p>When you turn on separate compilation, this code stops compiling, because compiler now resolves common code calls strictly using metadata KLIB declarations:</p>



<pre class="EnlighterJSRAW">// lib/jvmMain
class Foo

// app/commonMain
fun main() {
    Foo() // Unresolved reference in IDE, now also a compilation error
}</pre>



<p>The fix is to show an explicit connection: declare an <code>expect class</code> in <code>lib/commonMain</code> and make the platform <code>Foo</code> class an <code>actual class</code>:</p>



<pre class="EnlighterJSRAW">// lib/commonMain
expect class Foo()

// lib/jvmMain
actual class Foo

// app/commonMain
fun main() {
    Foo() // ok
}</pre>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Fixed-version-if-your-code-is-broken-by-separate-compilation.jpg" alt="" class="wp-image-742878"/></figure>



<p>Same for <code>commonTest</code>: with separate compilation, the test code won&#8217;t resolve to a platform call in <code>jvmMain</code>. If that&#8217;s what you want to test, declare the corresponding <code>expect</code> in <code>commonMain</code>:</p>



<pre class="EnlighterJSRAW">// app/jvmMain
actual class Foo

// app/commonMain
expect class Foo

// app/commonTest
fun main() {
    Foo() // Ok, calls Foo from jvmMain
}</pre>



<h3 class="wp-block-heading">IDE and compiler don&#8217;t agree on selected overload</h3>



<p>When several overloads are declared in <code>lib/commonMain</code> and <code>lib/jvmMain</code>, the IDE currently interprets the call from <code>app/commonMain</code> differently from the compiler:</p>



<pre class="EnlighterJSRAW">// lib/commonMain
fun foo(x: Any) = &quot;common&quot;

// lib/jvmMain
fun foo(x: String) = &quot;platform&quot;

// app/commonMain
fun main() {
    // &quot;Go to declaration&quot; on foo() jumps to lib/commonMain,
    // but at runtime &quot;platform&quot; is printed
    println(foo(&quot;&quot;))
}</pre>



<p>The IDE resolves the <code>foo("")</code> call to the declaration <code>fun foo(x: Any)</code> in <code>lib/commonMain</code>, as it assumes that common code can only depend on common declarations. But during the actual compilation <code>app/commonMain</code> currently sees both declarations and chooses the more specific overload <code>fun foo(x: String)</code>. At runtime, &#8220;platform&#8221; is printed.</p>



<p>With the new compilation scheme, the call is resolved to <code>fun foo(x: Any)</code> in <code>lib/commonMain</code> and at runtime, and &#8220;common&#8221; is printed.</p>



<h3 class="wp-block-heading">Unexpected type inference</h3>



<p>A trickier problem can occur when the error is triggered not at the <code>app/commonMain</code> call site, but in platform code. In the following example the IDE actually sees no problem, but the JVM compilation fails.</p>



<p><code>actual</code> classes are allowed to have different supertypes than their <code>expect</code> counterparts, so you can reasonably arrive at the following code structure:</p>



<pre class="EnlighterJSRAW">// eventsLib/commonMain
interface Event { val name: String }

expect class ClickEvent(target: String) : Event { override val name: String }
expect class ScrollEvent(offset: Int) : Event { override val name: String }

// eventsLib/jvmMain — serialized events get queued or stored in a session
actual class ClickEvent actual constructor(target: String) : Event, Serializable { /* ... */ }
actual class ScrollEvent actual constructor(offset: Int) : Event, Serializable { /* ... */ }

// app/commonMain
fun currentEvent() = if (clicked()) ClickEvent(&quot;buy&quot;) else ScrollEvent(120)

fun report() = currentEvent().name // e: Unresolved reference &#039;name&#039; only on the JVM</pre>



<p>The IDE only matches <code>commonMain</code> declarations, which allows it to (correctly) infer the return type of <code>currentEvent()</code> as <code>Event</code> and resolve the <code>.name</code> reference.</p>



<p>On JVM, however, the library declares an additional supertype for each <code>actual</code> class. When compiling <code>app</code> for the JVM, the compiler currently resolves common code against the <code>eventsLib</code> JAR which has the <code>eventsLib/jvmMain</code> version of the classes. With the two supertypes, the return type inference for the <code>currentEvent()</code> call arrives at <code>Any</code>, which doesn&#8217;t have a <code>.name</code>, and the JVM compilation fails.</p>



<p>With the separate compilation enabled, <code>app/commonMain</code> code is resolved only against <code>eventsLib/commonMain</code> declarations. So when compiling the JVM target of <code>app</code>, the compiler already has the resolved common code and has inferred the <code>Event</code> return type for the <code>currentEvent()</code> function. The JVM compilation runs separately, doesn&#8217;t have to infer anything, and finishes successfully.</p>



<h2 class="wp-block-heading">How to enable separate compilation</h2>



<p>The separate compilation feature is <a href="https://kotlinlang.org/docs/components-stability.html#stability-levels-explained" target="_blank" rel="noopener">Experimental</a> and disabled by default. To opt in, add the following compiler option to your <code>gradle.properties</code> file (note the known issues below):</p>



<pre class="EnlighterJSRAW">kotlin.kmp.separateCompilation=true</pre>



<h2 class="wp-block-heading" id="known-issues">Known issues</h2>



<p>For separate compilation to work correctly in KMP projects, it is important that authors of multiplatform libraries publish the metadata KLIBs. This is the default behavior for publishing tasks of the KMP Gradle plugin, but the new compilation scheme makes metadata KLIBs essential.</p>



<p>There are some known issues with KMP separate compilation that are still being fixed:</p>



<ul class="wp-block-list">
<li>Some problems with commonization of cinterops (like <a href="https://youtrack.jetbrains.com/issue/KT-88178" target="_blank" rel="noopener">KT-88178</a> or <a href="https://youtrack.jetbrains.com/issue/KT-41509" target="_blank" rel="noopener">KT-41509</a>). These are unlikely to affect an average KMP project, but enable the separate compilation mode with caution if you use <a href="https://kotlinlang.org/docs/native-c-interop.html" target="_blank" rel="noopener">C interoperability</a>.</li>



<li>KMP modules with common source sets and a single declared target are <strong>not</strong> affected by separate compilation for now.</li>



<li>Various smaller issues such as <a href="https://youtrack.jetbrains.com/issue/KT-88148" target="_blank" rel="noopener">KT-88148</a>.</li>
</ul>



<h2 class="wp-block-heading">Send feedback</h2>



<p>We&#8217;d be grateful for any feedback you have on separate compilation: leave a comment in the <a href="https://youtrack.jetbrains.com/issue/KT-89725" target="_blank" rel="noopener">dedicated YouTrack issue</a>.</p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/kotlin/2026/09/a-more-reliable-compilation-scheme-for-kotlin-multiplatform-modules/</url>
                    </language>
                	</item>
		<item>
		<title>Kotlin 2.4.20 Released</title>
		<link>https://blog.jetbrains.com/kotlin/2026/09/kotlin-2-4-20-released/</link>
		
		<dc:creator><![CDATA[Daniel Csorba]]></dc:creator>
		<pubDate>Mon, 07 Sep 2026 11:30:57 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/KT-releases-BlogSocialShare-1280x720-1.png</featuredImage>		<category><![CDATA[releases]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=737362</guid>

					<description><![CDATA[The Kotlin 2.4.20 release is out! Here are the main highlights: For the complete list of changes, see What&#8217;s new in Kotlin 2.4.20 or the release notes on GitHub. How to install Kotlin 2.4.20 The latest version of Kotlin is included in the latest versions of IntelliJ IDEA and Android Studio. To update to the [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The Kotlin 2.4.20 release is out! Here are the main highlights:</p>



<ul class="wp-block-list">
<li><strong>Standard library</strong>: Support for coroutine stack trace recovery, new functions for checking equality and uniqueness of collection elements, and new overloads for <code>kotlin.test</code> assertion functions.</li>



<li><strong>Kotlin/Native</strong>: New Swift export features, improved incremental compilation, and automatically generated <code>Package.swift</code> files for SwiftPM dependencies.</li>



<li><strong>Kotlin/Wasm</strong>:<strong> </strong>Changes to top-level <code>require()</code> calls in <code>@JsFun</code> declarations, improved companion object initialization order, and support for Wasmtime in the Kotlin Gradle plugin.</li>



<li><strong>Kotlin/JS</strong>: A new DSL for browser testing, support for exporting suspend lambdas as async functions, and improved exportability of data classes.</li>



<li><strong>Gradle</strong>: Support for Gradle 9.7.0 and improved reporting in the Problems API.</li>



<li><strong>Build tools API</strong>: Support for new targets: Kotlin/JS, Kotlin/Wasm, and Kotlin metadata.</li>



<li><strong>Kotlin compiler</strong>: The `kotlinr` runner command and a separate native image.</li>
</ul>



<p></p>



<p>For the complete list of changes, see <a href="https://kotlinlang.org/docs/whatsnew2420.html" target="_blank" rel="noopener">What&#8217;s new in Kotlin 2.4.20</a> or the <a href="https://github.com/JetBrains/kotlin/releases/tag/v2.4.20" target="_blank" rel="noopener">release notes on GitHub</a>.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="What&#039;s New in Kotlin 2.4.20" src="https://www.youtube.com/embed/UhRfN7fx5rs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">How to install Kotlin 2.4.20</h2>



<p>The latest version of Kotlin is included in the latest versions of <a href="https://www.jetbrains.com/idea/download/" target="_blank" rel="noopener">IntelliJ IDEA</a> and <a href="https://developer.android.com/studio" target="_blank" rel="noopener">Android Studio</a>.</p>



<p>To update to the new Kotlin version, make sure your IDE is updated to the latest version and <a href="https://kotlinlang.org/docs/releases.html#update-to-a-new-kotlin-version" target="_blank" rel="noopener">change the Kotlin version</a> to 2.4.20 in your build scripts.</p>



<p>If you need the command-line compiler, download it from the <a href="https://github.com/JetBrains/kotlin/releases/tag/v2.4.20" target="_blank" rel="noopener">GitHub release page</a>.</p>



<p><strong>If you run into any problems:</strong></p>



<ul class="wp-block-list">
<li>Find help on <a href="https://app.slack.com/client/T09229ZC6" target="_blank" rel="noopener">Slack</a> (<a href="https://surveys.jetbrains.com/s3/kotlin-slack-sign-up" target="_blank" rel="noopener">get an invite</a>).</li>



<li>Report issues to our issue tracker, <a href="https://youtrack.jetbrains.com/issues/KT" target="_blank" rel="noopener">YouTrack</a>.</li>
</ul>



<div style="background-color: #f1f6fe; margin-bottom: 2px; padding: 5px; margin-right: 0%; text-align: left; min-height: px;">
<p>Stay up to date with the latest Kotlin features! Subscribe to receive Kotlin updates by filling out the form at the bottom of this post. ⬇️</p>
</div>



<h2 class="wp-block-heading">Special thanks to our EAP Champions</h2>



<ul class="wp-block-list">
<li><a href="https://bsky.app/profile/zacsweers.dev" target="_blank" rel="noopener">Zac Sweers</a></li>



<li><a href="https://x.com/noraltavir">Alexander Nozik</a></li>



<li><a href="https://github.com/BoD" target="_blank" rel="noopener">Benoit Lubek</a></li>



<li><a href="https://github.com/ychescale9" target="_blank" rel="noopener">Yang</a></li>



<li><a href="https://github.com/rickclephas" target="_blank" rel="noopener">Rick Clephas</a></li>



<li><a href="https://www.linkedin.com/in/johannessvensson/" target="_blank" rel="noopener">Johannes Svensson</a></li>



<li><a href="https://www.linkedin.com/in/lukasz-wasylkowski/" target="_blank" rel="noopener">Łukasz Wasylkowski</a></li>



<li><a href="https://sterlingalbury.com/" target="_blank" rel="noopener">Sterling Albury</a></li>



<li><a href="https://github.com/HagamosVideojuegos" target="_blank" rel="noopener">David Lopez</a></li>



<li><a href="https://github.com/molikuner" target="_blank" rel="noopener">Florian Schreiber</a></li>



<li><a href="https://github.com/msotho" target="_blank" rel="noopener">Sechaba Mofokeng</a></li>



<li><a href="https://github.com/JesusMcCloud" target="_blank" rel="noopener">Bernd Prünster</a></li>



<li><a href="https://x.com/andy_lamax">Anderson Lameck</a></li>



<li><a href="https://github.com/dayanruben" target="_blank" rel="noopener">Dayan Ruben</a></li>



<li><a href="https://kotlinlang.slack.com/team/U03PLFM837A" target="_blank" rel="noopener">Josh Stagg</a></li>



<li><a href="https://www.linkedin.com/in/yuri-geronimus/" target="_blank" rel="noopener">Yuri Geronimus</a></li>



<li><a href="https://github.com/seregamorph" target="_blank" rel="noopener">Sergey Chernov</a></li>



<li><a href="https://ivan.canet.dev/" target="_blank" rel="noopener">Ivan Canet</a></li>



<li><a href="https://github.com/Zordid" target="_blank" rel="noopener">Olaf Gottschalk</a></li>



<li><a href="https://github.com/MohamedRejeb" target="_blank" rel="noopener">Mohamed Rejeb</a></li>
</ul>



<h1 class="wp-block-heading">Further reading</h1>



<ul class="wp-block-list">
<li><a href="https://kotlinlang.org/docs/whatsnew2420.html" target="_blank" rel="noopener">What’s new in Kotlin 2.4.20 documentation</a></li>



<li><a href="https://kotlinlang.org/docs/compatibility-guide-24.html" target="_blank" rel="noopener">Kotlin 2.4 compatibility guide</a></li>



<li><a href="https://blog.jetbrains.com/kotlin/2022/11/eap-champions/">Kotlin EAP Champions</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/kotlin/2026/09/kotlin-2-4-20-released/</url>
                    </language>
                	</item>
		<item>
		<title>Kotlin Toolchain 0.12: Multiplatform Library Publishing, Wasm Apps, and More</title>
		<link>https://blog.jetbrains.com/kotlin/2026/09/kotlin-toolchain-0-12-multiplatform-library-publishing-wasm-apps-and-more/</link>
		
		<dc:creator><![CDATA[Joffrey Bion]]></dc:creator>
		<pubDate>Thu, 03 Sep 2026 10:40:05 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/KT-social-BlogFeatured-1280x720-1.png</featuredImage>		<product ><![CDATA[amper]]></product>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[multiplatform]]></category>
		<category><![CDATA[releases]]></category>
		<category><![CDATA[toolchain]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[toolchains]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=736282</guid>

					<description><![CDATA[Kotlin Toolchain 0.12.0 is out. This release brings some long-awaited features: multiplatform libraries publication, a preview of Wasm application support, Compose Hot Reload from the command line, and more.&#160; Read on for the details, and check the release notes for the full list of changes and bug fixes. Additionally, klibs.io now uses the Kotlin Toolchain [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Kotlin Toolchain 0.12.0 is out. This release brings some long-awaited features: multiplatform libraries publication, a preview of Wasm application support, Compose Hot Reload from the command line, and more.&nbsp;</p>



<p>Read on for the details, and check the <a href="https://github.com/JetBrains/kotlin-toolchain/releases/tag/v0.12.0" target="_blank" rel="noopener">release notes</a> for the full list of changes and bug fixes.</p>



<p>Additionally, <a href="http://klibs.io" target="_blank" rel="noopener">klibs.io</a> now uses the Kotlin Toolchain in production. A real backend and not a sample, it’s built on JDK 21, Spring Boot 4 (with Spring AI), PostgreSQL, and OpenSearch. We’ve converted nine convention plugins to Kotlin Toolchain templates, and two Gradle plugins with no built-in equivalent: Jib and Git Properties, which we’ve implemented as local Kotlin Toolchain plugins. Check out the <a href="https://github.com/JetBrains/klibs-io" target="_blank" rel="noopener">sources</a> yourself.</p>



<p><em>To get support for Kotlin Toolchain’s latest features, use </em><a href="https://www.jetbrains.com/idea/" target="_blank" rel="noopener"><em>IntelliJ IDEA 2026.2.1</em></a><em> (or newer). Make sure the latest version of the </em><a href="https://plugins.jetbrains.com/plugin/31850-kotlin-toolchain" target="_blank" rel="noopener"><em>Kotlin Toolchain plugin</em></a><em> is installed.&nbsp;</em></p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotl.in/zbd4nw" target="_blank" rel="noopener"><i class="download-icon"></i>Try the Kotlin Toolchain</a></p>



<h2 class="wp-block-heading">Kotlin Multiplatform libraries publication</h2>



<p>Library publishing arrived in preview in 0.11, but only for JVM libraries. Starting with 0.12, multiplatform libraries work too, with exactly the same configuration:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">product:
  type: lib
  platforms: [jvm, android, iosArm64, iosSimulatorArm64, wasmJs]

settings:
  publishing:
    enabled: true
    group: org.example
    version: 1.0.0</pre>



<p>The Kotlin Toolchain publishes everything your users need to depend on your library from any of its targets: the common API, one artifact per platform, the sources, and the module publication metadata that lets build tools pick the right pieces automatically.</p>



<p><br>Cinterop bindings are supported as well. They are published both commonized and per platform, so your users get the same C API you compiled against without setting up interop themselves. The result is consumable from Gradle projects like any other multiplatform library.<br></p>



<p>For more details, see the <a href="https://kotlin-toolchain.org/latest/user-guide/publishing/" target="_blank" rel="noopener">documentation</a>.</p>



<p>Note: Resources of Compose Multiplatform libraries are not part of the publication yet. Follow <a href="https://youtrack.jetbrains.com/issue/KTC-5698/Support-publication-of-composeResources-as-a-part-of-KMP-library-publication" target="_blank" rel="noopener">KTC-5698</a> for progress.</p>



<h3 class="wp-block-heading">Better compliance with Maven Central quotas</h3>



<p>Because of the new quotas on Maven Central publications that <a href="https://central.sonatype.org/publish/maven-central-publishing-limits/" target="_blank" rel="noopener">Sonatype will soon enforce</a>, we made a few notable changes to reduce the number of files published by default:</p>



<ul class="wp-block-list">
<li>Checksums of signature files (<code>.asc.sha1</code>) are not necessary and are no longer published.</li>



<li>Only the <code>.md5</code> and <code>.sha1</code> checksums are published by default now. If you need to continue publishing the <code>.sha256</code> and <code>.sha512</code> checksums, use <code>settings.publishing.checksums: [md5, sha1, sha256, sha512]</code>.</li>
</ul>



<h2 class="wp-block-heading">Wasm application support</h2>



<p><code>wasm-js/app</code> modules can now be built into a ready-to-use web application.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Wasm-app.png" alt="" class="wp-image-736383" /></figure>



<p>Among the supported features are:</p>



<ul class="wp-block-list">
<li>Running Wasm apps with the <code>kotlin run</code> command.</li>



<li>Customizing <code>index.html</code> and other resources.&nbsp;</li>



<li>Fetching transitive npm dependencies from Kotlin Multiplatform libraries.</li>
</ul>



<p>More information on working with Wasm web applications is available in <a href="https://kotlin-toolchain.org/dev/user-guide/product-types/wasm-js-app/" target="_blank" rel="noopener">the documentation</a>.</p>



<h2 class="wp-block-heading">Terminal UI improvements</h2>



<p>We are actively working to make the output of the <code>kotlin</code> command less verbose and more user-friendly.&nbsp;</p>



<h3 class="wp-block-heading">Diagnostics</h3>



<p>For example, here are some of the recent diagnostics improvements:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Diagnostics-before-and-after-2.png" alt="" class="wp-image-736410" /></figure>



<h3 class="wp-block-heading">Tests in the status widget</h3>



<p>Running tests are now visible in the status widget under the respective tasks and their suites. There are also short test execution statistics visible during the run.</p>



<figure class="wp-block-video"><video autoplay controls loop muted src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Running-tests.mov"></video></figure>



<p>There are more things to iron out, but we’ll get there.</p>



<h2 class="wp-block-heading">IDE improvements</h2>



<h3 class="wp-block-heading">Compose preview support</h3>



<p>Android modules and <code>kmp/lib</code> modules that have Android as one of their targets now support the Compose preview feature, powered by the <code>androidx.compose.ui.tooling.preview.Preview</code> annotation and the Android plugin.<br></p>



<figure class="wp-block-video"><video autoplay controls loop muted src="https://blog.jetbrains.com/wp-content/uploads/2026/09/KTC-Android-Compose-Preview.mov"></video></figure>



<h3 class="wp-block-heading">Better support for Compose resources</h3>



<p>The IDE now correctly recognizes Compose resources, updates <code>Res</code> classes on the fly, provides navigation, completion, and refactorings that update both XMLs and your code.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Compose-Resources.png" alt="" class="wp-image-736443" /></figure>



<h3 class="wp-block-heading">Android tooling improvements</h3>



<p>Adding to the Compose preview support mentioned above, we have also brought support for more of the Android features you are accustomed to, such as:</p>



<ul class="wp-block-list">
<li>Android Lint&nbsp;</li>



<li>Live Edit</li>



<li>Layout Inspector</li>



<li>Resources (<code>R</code> class) navigation and completion</li>
</ul>



<h3 class="wp-block-heading">iOS improvements</h3>



<p>Starting with IntelliJ IDEA 2026.2.1, the experience of working with iOS applications should be closer to what you’re used to in Gradle projects.</p>



<p>The run configuration now lets you pick a device, configure Xcode options, and choose a debug/release configuration mode.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Xcode-configuration.png" alt="" class="wp-image-736454" /></figure>



<p>We’ve also fixed a few issues with Kotlin/Swift interoperability, which should be more stable now.</p>



<h3 class="wp-block-heading">Inlay hints with coordinates of catalog dependencies</h3>



<p>Catalog dependencies in module files and templates now have an inlay hint next to them displaying coordinates that each entry points to.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/Catalog-inlays.png" alt="" class="wp-image-736476" /></figure>



<h2 class="wp-block-heading">Better Compose Hot Reload support</h2>



<p>We now properly support Compose Hot Reload <strong>from the command line</strong> using the <code>kotlin run --compose-hot-reload-mode</code> command.</p>



<h3 class="wp-block-heading">General improvements</h3>



<ul class="wp-block-list">
<li>The very first reload is now much faster and the build should consume fewer resources.</li>



<li>The <em>Restart the application</em> action from the <em>DevTools</em> menu is now supported.</li>
</ul>



<h3 class="wp-block-heading">Compose Hot Reload MCP</h3>



<p>We now support an MCP server for agents to interact with applications running with Compose Hot Reload.<br><br>To get started, add the following snippet in your <code>mcp.json</code>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="json" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">{
    "mcpServers": {
        "Compose Hot Reload": {
            "command": "./kotlin",
            "args": [
                "compose-hot-reload-mcp-server"
            ]
        }
    }
}</pre>



<p>With this, agents can interact with, reload, restart, and view window snapshots, and dump the tree of composables. Read more about these capabilities <a href="https://github.com/JetBrains/compose-hot-reload#mcp-server-for-ai-agents" target="_blank" rel="noopener">here</a>.</p>



<h2 class="wp-block-heading">Other improvements</h2>



<h3 class="wp-block-heading">New recommended local dependency format using the <code>//</code> prefix</h3>



<p>Previously, the only way to define local module dependencies was to use relative paths starting with the <code>.</code> (dot) symbol. This approach had several problems. For example, moving a module from one directory level to another required changing all the dependency paths, such as from<code>../../foo</code> to <code>../foo</code>. And having a multitude of <code>../</code> in deeply nested directory structures generally made paths hard to read.</p>



<p>The new recommended way to define local module dependencies is to use project-root-relative paths starting with the <code>//</code> prefix. You might be familiar with this syntax from tools like Bazel. The <code>//</code> prefix represents the project root directory and can be used not only in the <code>dependencies</code> block but in any place that expects a path as well, for example, <code>apply</code>.</p>



<figure class="wp-block-image size-full is-style-default"><img loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/before-after.png" alt="" class="wp-image-737392" style="object-fit:cover; width:100% !important; height:auto !important; max-width:100% !important;" /></figure>



<p>The old relative-paths approach still works for now.</p>



<p>This is a step toward allowing multiple modules with the same directory name.</p>



<h2 class="wp-block-heading">Raised minimum JDK and Kotlin versions</h2>



<p>Until now, the minimum JDK version supported by the Kotlin Toolchain was not clearly documented anywhere, and the build would just fail in different places if you used a JDK that was too old. There is now a clear diagnostic and a clear minimum: <strong>only JDK 17 and higher are supported</strong> to compile your code. You can still use <code>settings.jvm.release</code> to set a lower target if your code should be runnable on lower JREs.&nbsp;</p>



<p>The minimum Kotlin compiler version was raised from 2.1.10 to 2.2.20. This allows simplifying our code, and is in line with the <a href="https://blog.jetbrains.com/kotlin/2026/05/security-support-policy-for-the-kotlin-standard-library/">new security support policy</a> for the Kotlin standard library.&nbsp;</p>



<h2 class="wp-block-heading">Updated default versions</h2>



<p>We’ve also updated some of the default versions for built-in toolchains and frameworks:</p>



<ul class="wp-block-list">
<li>Kotlin 2.4.10</li>



<li>JDK 25</li>



<li>JUnit Platform 6.1.3</li>



<li>KSP 2.3.11</li>



<li>Ktor 3.5.2</li>



<li>Spring Boot 4.1.0</li>



<li>DataFrame 1.0.0-rc01</li>



<li>Kotlinx.rpc 0.10.3</li>
</ul>



<h2 class="wp-block-heading">Try Kotlin Toolchain 0.12.0</h2>



<p>To get started with the Kotlin Toolchain, check out our <a href="https://kotl.in/zbd4nw" data-type="link" data-id="https://kotl.in/zbd4nw" target="_blank" rel="noopener"><em>Getting started</em></a> guide. Take a look at some examples, follow the tutorial, or read the comprehensive user guide, depending on your learning style.</p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotl.in/zbd4nw" target="_blank" rel="noopener"><i class="download-icon"></i>Try the Kotlin Toolchain</a></p>



<p>To update an existing project, use the <code>kotlin update</code> command.</p>



<h2 class="wp-block-heading">Share your feedback</h2>



<p>The Kotlin Toolchain is still in Alpha and under active development. You can provide feedback about your experience by joining the discussion in the <a href="https://slack-chats.kotlinlang.org/c/kotlin-toolchain" target="_blank" rel="noopener">#kotlin-toolchain Slack channel</a> (get invite: <a href="https://kotl.in/slack" target="_blank" rel="noopener">https://kotl.in/slack</a>) or by sharing your suggestions and ideas in a <a href="https://youtrack.jetbrains.com/issues/KTC" target="_blank" rel="noopener">YouTrack issue</a>. Your input and use cases help shape the future of the Kotlin Toolchain!</p>



<p></p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/kotlin/2026/09/kotlin-toolchain-0-12-multiplatform-library-publishing-wasm-apps-and-more/</url>
                    </language>
                	</item>
		<item>
		<title>Compose Multiplatform 1.12.0 Released</title>
		<link>https://blog.jetbrains.com/kotlin/2026/08/compose-multiplatform-1-12-0/</link>
					<comments>https://blog.jetbrains.com/kotlin/2026/08/compose-multiplatform-1-12-0/#respond</comments>
		
		<dc:creator><![CDATA[Elvira Mustafina]]></dc:creator>
		<pubDate>Wed, 26 Aug 2026 13:28:41 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/CMP-social-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[multiplatform]]></category>
		<category><![CDATA[releases]]></category>
		<category><![CDATA[compose-for-desktop]]></category>
		<category><![CDATA[compose-for-web]]></category>
		<category><![CDATA[compose-hot-reload]]></category>
		<category><![CDATA[mcp]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=kotlin&#038;p=734018</guid>

					<description><![CDATA[Compose Multiplatform 1.12.0 is out! This version brings new tooling for AI assistants, improvements to web resource management, and finer control over desktop window states. Here are the highlights of this release: For a complete overview of the changes, check out What’s new in Compose Multiplatform 1.12.0 or the release notes on GitHub. Get Started [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Compose Multiplatform 1.12.0 is out! This version brings new tooling for AI assistants, improvements to web resource management, and finer control over desktop window states.</p>



<p>Here are the highlights of this release:</p>



<ul class="wp-block-list">
<li><a href="#mcp-server-for-ai-agents-in-compose-hot-reload">MCP server for AI agents in Compose Hot Reload</a></li>



<li><a href="#automatic-font-fallback-for-web">Automatic font fallback for web</a></li>



<li><a href="#window-and-dialog-api-v2">v2 version of the window and dialog API for desktop</a></li>
</ul>



<p>For a complete overview of the changes, check out <a href="https://kotlinlang.org/docs/multiplatform/whats-new-compose-112.html" target="_blank" rel="noopener">What’s new in Compose Multiplatform 1.12.0</a> or the <a href="https://github.com/JetBrains/compose-multiplatform/releases/tag/v1.12.0" target="_blank" rel="noopener">release notes on GitHub</a>.</p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotlinlang.org/docs/multiplatform/compose-multiplatform.html" target="_blank" rel="noopener"><i class="download-icon"></i>Get Started with Compose Multiplatform</a></p>



<h2 class="wp-block-heading">MCP server for AI agents in Compose Hot Reload</h2>



<p>Compose Hot Reload now ships with an experimental Model Context Protocol (MCP) server that connects AI coding agents to your running application.</p>



<p>Using the MCP server, an agent can trigger reloads, take screenshots, inspect the semantic tree, simulate clicks and text input, and read application logs. In practice, this means the agent can verify the results of its own edits. It can confirm that the reload succeeded, inspect the rendered UI, catch a runtime exception, and iterate – all without you describing what&#8217;s on screen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" style="border-style: solid;border-width: 1px;border-color: lightgray;; width:100% !important; height:auto !important; max-width:100% !important;" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Screenshot-2026-08-25-at-01.36.40.png" alt="AI agent uses the MCP server" class="wp-image-734052"/></figure>



<p>For the full list of available tools and instructions on connecting your agent, see the <a href="https://github.com/JetBrains/compose-hot-reload#mcp-server-for-ai-agents" target="_blank" rel="noopener">Compose Hot Reload documentation</a>.</p>



<p align="center"><a class="ek-link jb-download-button" href="https://kotlinlang.org/docs/multiplatform/compose-hot-reload.html" target="_blank" rel="noopener"><i class="download-icon"></i>Try Compose Hot Reload</a></p>



<h2 class="wp-block-heading">Automatic font fallback for web</h2>



<p>Compose Multiplatform for web now handles characters that your application&#8217;s fonts don&#8217;t cover. When it encounters an unresolved character during rendering, it downloads the matching Noto font subset on demand and recomposes the affected text. As a result, Japanese, Arabic, Devanagari, and emoji render correctly without you having to bundle fonts for them.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" style="border-style: solid;border-width: 1px;border-color: lightgray;; width:100% !important; height:auto !important; max-width:100% !important;" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Screenshot-2026-08-25-at-02.12.16.png" alt="Testing fonts" class="wp-image-734063"/></figure>



<h2 class="wp-block-heading">Window and dialog API v2</h2>



<p>This release introduces an experimental v2 of the API for <code>WindowState</code> and <code>DialogState</code> in the <code>androidx.compose.ui.window.v2</code> package. It gives you finer control over how windows and dialogs are positioned and sized. You can:</p>



<ul class="wp-block-list">
<li>Select the screen a window appears on.</li>



<li>Provide custom positioning and sizing logic, including logic based on the content&#8217;s intrinsic size.</li>



<li>Set minimum and maximum window sizes.</li>



<li>Position dialogs relative to their parent window.</li>
</ul>



<p>The enhanced API also makes the asynchronous nature of window state changes explicit: It distinguishes the state you request from the state the window currently has.</p>



<p>For example, to center a window and give it a fixed size, use <code>WindowPositionProvider</code> and <code>WindowSizeProvider</code>:</p>



<pre class="EnlighterJSRAW EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">val windowState = rememberWindowState(
    initialBoundsProvider = WindowBoundsProvider(
        positionProvider = WindowPositionProvider.CenteredOnScreen,
        sizeProvider = WindowSizeProvider.Fixed(DpSize(400.dp, 200.dp))
    )
)
</pre>



<p>With the API v2, you can also use <code>WindowSizeProvider.Unconstrained</code> to size the window to its content initially, while still letting that content expand with <code>fillMaxSize()</code> when the user enlarges the window:</p>



<pre class="EnlighterJSRAW EnlighterJSRAW" data-enlighter-language="kotlin" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">WindowBoundsProvider(
    positionProvider = WindowPositionProvider.CenteredOnScreen,
    sizeProvider = WindowSizeProvider.Unconstrained
)
</pre>



<p>See the <a href="https://kotlinlang.org/docs/multiplatform/compose-desktop-top-level-windows-management.html#window-and-dialog-api-v2" target="_blank" rel="noopener">Window and dialog API v2 documentation</a> for the full details.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Update your dependencies, try out the new APIs, and let us know what you think about Compose Multiplatform 1.12.0.</p>



<p>For everything that didn&#8217;t make it into this post, check out the <a href="https://github.com/JetBrains/compose-multiplatform/releases/tag/v1.12.0" target="_blank" rel="noopener">full release notes</a> or <a href="https://kotlinlang.org/docs/multiplatform/whats-new-compose-112.html" target="_blank" rel="noopener">What’s new</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.jetbrains.com/kotlin/2026/08/compose-multiplatform-1-12-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
