
Cross-platform UI framework inspired by Solid.js, leveraging native view components for fine-grained reactivity, smaller binary sizes, semantic theming, and seamless web integration with URL-based navigation.
A Kotlin Multiplatform UI Framework inspired by Solid.js that uses the native view components of each platform.
For these reasons, we think Compose isn't sufficient nor can be made sufficient for any multiplatform development that includes a web target. That's why we created this library.
Here is a comparison of the same UI built with KiteUI and Compose Web:
| Compose Web | KiteUI Web | |
|---|---|---|
| Live site | https://zal.im/wasm/jetsnack | https://kiteui-jetsnack-demo.cs.lightningkite.com/ |
| Source Code | https://github.com/JetBrains/compose-multiplatform/tree/master/examples/jetsnack | https://github.com/lightningkite/kiteui-jetsnack-demo |
| Web Binary Size (including fonts and css) | 12.17389 MB (July 30, 2025) | 0.77092 MB (July 30, 2025) |
| Performance in KiteUI is faster or equivalent to the performance of Compose multiplatform Web from internal testing. |
We are using this in production, but I will not declare the API as totally finalized. However, with the sheer number of projects we have written in it, we at least have to keep some level of compatibility. We'll document how to adjust to new changes as they come.
Maven repository: maven("https://lightningkite-maven.s3.us-west-2.amazonaws.com")
Dependency: api("com.lightningkite.kiteui:library:<current tag>")
You can look at the example project we're hosting to get an idea of what you can do.
Click the magnifying glass in the app to see the source!
If you want to try another theme, start here, change the theme, then go to the "Sample Log In" sreen.
@Routable("sample/login")
object SampleLogInPage : Page {
override fun ViewWriter.render(): Unit = run {
val email = Property("")
val password = Property("")
frame {
gap = 0.rem
image {
source = Resources.imagesSolera
scaleType = ImageScaleType.Crop
opacity = 0.5
}
padded - scrolling - col {
expanding - space()
centered - sizeConstraints(maxWidth = 50.rem) - card - col {
h1 { content = "My App" }
sizeConstraints(width = 20.rem) - field("Email") {
fieldTheme - textInput {
hint = "Email"
keyboardHints = KeyboardHints.email
content bind email
}
}
sizeConstraints(width = 20.rem) - field("Password") {
fieldTheme - textInput {
hint = "Password"
keyboardHints = KeyboardHints.password
content bind password
action = Action(
title = "Log In",
icon = Icon.login,
) {
fakeLogin(email)
}
}
}
centered - sizeConstraints(width = 15.rem) - important - button {
h6 { content = "Log In" }
onClick {
delay(1000)
fakeLogin(email)
}
}
}
expanding - space()
}
}
}
private suspend fun ViewWriter.fakeLogin(email: Property<String>) {
fetch("fake-login/${email()}")
pageNavigator.navigate(ControlsPage)
}
}A Kotlin Multiplatform UI Framework inspired by Solid.js that uses the native view components of each platform.
For these reasons, we think Compose isn't sufficient nor can be made sufficient for any multiplatform development that includes a web target. That's why we created this library.
Here is a comparison of the same UI built with KiteUI and Compose Web:
| Compose Web | KiteUI Web | |
|---|---|---|
| Live site | https://zal.im/wasm/jetsnack | https://kiteui-jetsnack-demo.cs.lightningkite.com/ |
| Source Code | https://github.com/JetBrains/compose-multiplatform/tree/master/examples/jetsnack | https://github.com/lightningkite/kiteui-jetsnack-demo |
| Web Binary Size (including fonts and css) | 12.17389 MB (July 30, 2025) | 0.77092 MB (July 30, 2025) |
| Performance in KiteUI is faster or equivalent to the performance of Compose multiplatform Web from internal testing. |
We are using this in production, but I will not declare the API as totally finalized. However, with the sheer number of projects we have written in it, we at least have to keep some level of compatibility. We'll document how to adjust to new changes as they come.
Maven repository: maven("https://lightningkite-maven.s3.us-west-2.amazonaws.com")
Dependency: api("com.lightningkite.kiteui:library:<current tag>")
You can look at the example project we're hosting to get an idea of what you can do.
Click the magnifying glass in the app to see the source!
If you want to try another theme, start here, change the theme, then go to the "Sample Log In" sreen.
@Routable("sample/login")
object SampleLogInPage : Page {
override fun ViewWriter.render(): Unit = run {
val email = Property("")
val password = Property("")
frame {
gap = 0.rem
image {
source = Resources.imagesSolera
scaleType = ImageScaleType.Crop
opacity = 0.5
}
padded - scrolling - col {
expanding - space()
centered - sizeConstraints(maxWidth = 50.rem) - card - col {
h1 { content = "My App" }
sizeConstraints(width = 20.rem) - field("Email") {
fieldTheme - textInput {
hint = "Email"
keyboardHints = KeyboardHints.email
content bind email
}
}
sizeConstraints(width = 20.rem) - field("Password") {
fieldTheme - textInput {
hint = "Password"
keyboardHints = KeyboardHints.password
content bind password
action = Action(
title = "Log In",
icon = Icon.login,
) {
fakeLogin(email)
}
}
}
centered - sizeConstraints(width = 15.rem) - important - button {
h6 { content = "Log In" }
onClick {
delay(1000)
fakeLogin(email)
}
}
}
expanding - space()
}
}
}
private suspend fun ViewWriter.fakeLogin(email: Property<String>) {
fetch("fake-login/${email()}")
pageNavigator.navigate(ControlsPage)
}
}