Requirements

HotSwan 2.0 carries its own interpreter engine into your running app and uses a Kotlin compiler plugin to prepare the code it executes. Those two pieces are what set the requirements on this page: a Kotlin version the compiler plugin can build against, an IDE new enough to host the plugin, and a target that can run the engine.

Requirements differ per platform, so the three legs are listed separately below. If you only ship Android, the first four sections are all that apply to you.

IDE compatibility

The floor is IntelliJ Platform build 251, which means IntelliJ IDEA 2025.1 or Android Studio Narwhal (2025.1). Kotlin 2.3.x support is what moved this floor, so older IDEs are not supported even though earlier HotSwan releases ran on them.

There is no upper bound. The plugin ships without an untilBuild, deliberately, so a new IDE release never makes it disappear from the Marketplace. Every version below works, and so does whatever ships next.

  • Android Studio Rabbit (canary)
  • Android Studio Quail (2026.1, current stable)
  • Android Studio Panda (2025.3)
  • Android Studio Otter (2025.2)
  • Android Studio Narwhal (2025.1, the floor)
  • IntelliJ IDEA (2025.1 and every later release)

Because the plugin is built against the IntelliJ Platform SDK, it also runs on other JetBrains IDEs built on that platform. Each release is checked by the JetBrains Plugin Verifier against IntelliJ IDEA 2026.1 and 2026.2 and against Android Studio Narwhal and Otter.

Newer Android Studio builds are supported but are not part of that automated check, because Google switched its download filenames to codenames and the verifier can no longer resolve those builds by version. That is a gap in verification, not in support.

Kotlin

Kotlin compiler plugins operate on the compiler's intermediate representation, and those internals move between versions, so the supported range is narrow and specific.

Android and Desktop need Kotlin 2.3.x to 2.4.x. The iOS leg needs 2.3 or newer and prefers 2.4, because a Kotlin/Native library records an ABI version that an older compiler refuses outright. On Kotlin 2.2 and earlier the iOS leg goes inert and says so rather than failing later.

The iOS runtime is published once per Kotlin line and the plugin resolves the right coordinate from your Kotlin version. You do not select it. The Version Compatibility page carries the full plugin to Kotlin map.

AGP and Gradle

The 2.x line targets Android Gradle Plugin 9.x and is built and tested against 9.2.1. The 1.x line targeted AGP 8.7.3, so a project still on AGP 8 should stay on 1.x until it upgrades.

Gradle 9.5.1 is the verified version, and it is what every sample in the repository runs. Configuration cache and configure on demand are both supported.

Android

Hot reload runs on a device or emulator at API 28 or higher. Both physical devices and emulators are supported, with no restriction on manufacturer, chipset, or system image.

This is a requirement on the device you develop against, not on your project. The runtime library's own minSdk is 26, so adding HotSwan does not raise your project's minimum API level, and your release APK is unaffected.

Debug builds only. The reload path is a development tool and is not wired into release builds. Applying the plugin leaves your release configuration alone.

iOS simulator

The reload target is iosSimulatorArm64, the iOS simulator on an Apple Silicon Mac. Compose Multiplatform 1.11.0 no longer publishes an iosX64 variant, so Apple Silicon is where this leg lives.

You need Compose Multiplatform 1.11.0, an Apple Silicon Mac, and Xcode with an installed iOS simulator runtime. Xcode 26.5 is the version the leg was built and measured on. Xcode 16 and other Xcode 26 builds are handled by the packaging path but have not been run end to end.

Two project level details matter. Your Info.plist needs CADisableMinimumFrameDurationOnPhone set to true, which is a standard Compose Multiplatform on iOS key. And your Compose entry point has to be a top level, zero argument function returning a UIViewController. An entry that takes arguments supplied from Swift is refused by name rather than reloaded incorrectly.

Applying the Gradle plugin is the rest of the setup. There is no Swift line to add and no extra dependency to declare. HotSwan does not declare or check an iOS deployment target.

Desktop (JVM)

Any Compose Desktop JVM target works. There is no variant concept on Desktop, so there is no debug requirement to satisfy.

Applying the Gradle plugin is the setup. The runtime self bootstraps the first time instrumented code runs, so a desktop app needs no extra line to become reloadable, and your running window shows up as a target you can select alongside your devices.

Calling installInterpreterBaselineDesktop() early in your main() is still recommended, because it starts the runtime at a point you choose rather than at the first composition. It is install if absent, so adding it to an app that has already self bootstrapped does nothing. The Kotlin Multiplatform page has the exact snippet.

At a glance

RequirementWhat 2.0 needs
IDEIntelliJ IDEA 2025.1+ / Android Studio Narwhal 2025.1+, no upper bound
Kotlin2.3.x to 2.4.x (iOS needs 2.3+, prefers 2.4+)
Android Gradle Plugin9.x
Gradle9.5.1 verified
Build typeDebug on Android, no variant concept on Desktop
Android deviceAPI 28+, physical or emulator
iOSiosSimulatorArm64 only, Compose Multiplatform 1.11.0
DesktopAny Compose Desktop JVM, opt in
HostApple Silicon for the iOS leg

What is not checked

This page is a summary, and it is more confident than the checks behind it. Most of these bounds are declared rather than enforced. There is no Gradle version check, no AGP version check, no Xcode version check and no host architecture check anywhere in the product.

In practice that means an unsupported combination fails with whatever error the underlying tool produces, not with a HotSwan message explaining the requirement. The exceptions are the two places where a wrong answer would be worse than an error: an unsupported Kotlin version on iOS, and an iOS entry point of the wrong shape. Both are refused by name.

If something does not behave the way this page describes, the Troubleshooting page is the next stop.