diff --git a/platform/compose/BUILD.bazel b/platform/compose/BUILD.bazel
index 55826c9479a3..3c694d30110d 100644
--- a/platform/compose/BUILD.bazel
+++ b/platform/compose/BUILD.bazel
@@ -25,6 +25,7 @@ jvm_library(
"@lib//:jetbrains-annotations",
"@lib//:kotlinx-coroutines-core",
"@lib//:jetbrains-compose-components-ui-tooling-preview-desktop",
+ "//platform/diagnostic/telemetry",
],
exports = [
"//platform/jewel/ui",
@@ -57,6 +58,8 @@ jvm_library(
"@lib//:jetbrains-compose-components-ui-tooling-preview-desktop",
"@lib//:junit4",
"//platform/jewel/int-ui/int-ui-standalone:jewel-intUi-standalone",
+ "//platform/diagnostic/telemetry",
+ "//platform/diagnostic/telemetry:telemetry_test_lib",
],
exports = [
"//platform/jewel/ui",
diff --git a/platform/compose/intellij.platform.compose.iml b/platform/compose/intellij.platform.compose.iml
index ef92e34aded5..9ca45e43e224 100644
--- a/platform/compose/intellij.platform.compose.iml
+++ b/platform/compose/intellij.platform.compose.iml
@@ -43,5 +43,6 @@
+
\ No newline at end of file
diff --git a/platform/compose/resources/intellij.platform.compose.xml b/platform/compose/resources/intellij.platform.compose.xml
index 50d974208773..c10c3706c22b 100644
--- a/platform/compose/resources/intellij.platform.compose.xml
+++ b/platform/compose/resources/intellij.platform.compose.xml
@@ -6,6 +6,8 @@
description="Allows changing how ComposePanel is rendered using rendering on Graphics (when `true`, it provides smooth Swing interop) or on native AWT texture (when `false`). Works only in internal mode"
key="compose.swing.render.on.graphics"/>
+
+
diff --git a/platform/compose/src/com/intellij/platform/compose/SkikoPreloader.kt b/platform/compose/src/com/intellij/platform/compose/SkikoPreloader.kt
new file mode 100644
index 000000000000..d49053254f01
--- /dev/null
+++ b/platform/compose/src/com/intellij/platform/compose/SkikoPreloader.kt
@@ -0,0 +1,25 @@
+// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package com.intellij.platform.compose
+
+import com.intellij.ide.ApplicationActivity
+import com.intellij.openapi.diagnostic.thisLogger
+import com.intellij.platform.diagnostic.telemetry.Scope
+import com.intellij.platform.diagnostic.telemetry.TelemetryManager
+import kotlinx.coroutines.withContext
+import org.jetbrains.jewel.bridge.setSkikoLibraryPath
+import org.jetbrains.skiko.Library
+
+// org.jetbrains.skiko.Library.load seems expensive, better have it loaded before the first rendering happens
+internal class SkikoPreloader : ApplicationActivity {
+ private val SKIKO: Scope = Scope("skiko")
+
+ override suspend fun execute() {
+ val tracer = TelemetryManager.getInstance().getSimpleTracer(SKIKO)
+ withContext(tracer.span("org.jetbrains.skiko.Library.load")) {
+ thisLogger().debug("Preloading Skiko")
+
+ setSkikoLibraryPath()
+ Library.load()
+ }
+ }
+}
diff --git a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt
index 68cd7d188574..b621f1315ad3 100644
--- a/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt
+++ b/platform/jewel/ide-laf-bridge/src/main/kotlin/org/jetbrains/jewel/bridge/JewelComposePanelWrapper.kt
@@ -193,10 +193,8 @@ public fun JewelComposeNoThemePanel(
public fun JewelComposeNoThemePanel(config: ComposePanel.() -> Unit = {}, content: @Composable () -> Unit): JComponent =
JewelComposeNoThemePanel(focusOnClickInside = false, config, content)
-private fun createJewelComposePanel(
- focusOnClickInside: Boolean,
- config: ComposePanel.(JewelComposePanelWrapper) -> Unit,
-): JewelComposePanelWrapper {
+@ApiStatus.Internal
+public fun setSkikoLibraryPath() {
if (System.getProperty("skiko.library.path") == null) {
val bundledSkikoFolder = File(PathManager.getLibPath(), "/skiko-awt-runtime-all")
if (bundledSkikoFolder.isDirectory && bundledSkikoFolder.canRead()) {
@@ -205,6 +203,14 @@ private fun createJewelComposePanel(
JewelLogger.getInstance("SkikoLoader").warn("Bundled Skiko not found/not readable, falling back to default")
}
}
+}
+
+private fun createJewelComposePanel(
+ focusOnClickInside: Boolean,
+ config: ComposePanel.(JewelComposePanelWrapper) -> Unit,
+): JewelComposePanelWrapper {
+ setSkikoLibraryPath()
+
val jewelPanel = JewelComposePanelWrapper(focusOnClickInside)
jewelPanel.composePanel.config(jewelPanel)
ComposeUiInspector(jewelPanel)