Ketoy
v0.4Kotlin OTA

Ship Compose UI over the air.

Write real Jetpack Compose. Push updates to every device in seconds.

CheckoutScreen.kt@KetoyEntryPoint
@KetoyEntryPoint @Composable
fun CheckoutScreen() {
    val vm    = ketoyViewModel<CheckoutViewModel>()
    val state by vm.state.collectAsState()

    Scaffold(topBar = { TopAppBar(title = { Text("Checkout") }) }) { p ->
        LazyColumn(modifier = Modifier.padding(p)) {
            items(state.cartItems) { item ->
                ProductCard(name = item.name, price = item.price)
            }
        }
        Button(onClick = { vm.dispatch("place_order") }) {
            Text("Place Order - $" + state.total)
        }
    }
}
// $ ./gradlew ketoyBundle  →  checkout.ktx  ·  3.4 KB
< 50ms
Load, verify, and parse
< 100ms
First frame, cold
~4KB
A full checkout flow
20×
Smaller than JSON SDUI
Why Ketoy

Update without a release.

Add one annotation. Run one Gradle task. Every device gets the change in seconds.

01

Instant updates

Fix a bug at 3pm. Every user has it by 3:01. The app never reinstalls.

How it works
02

Play Store safe

Ketoy generates code on device, the same way ART does. It stays inside Google policy.

Security model
03

Just Kotlin

It is the Jetpack Compose you already write. Nothing new to learn.

What is supported
What’s supported

If it’s Compose, it’s Ketoy.

Ketoy supports the full Compose toolkit, not a curated subset. When Compose adds a parameter, one command picks it up.

UI

Compose and Material 3

All 35 Material 3 components. Every parameter included.

ScaffoldLazyColumnOutlinedTextFieldButtonTopAppBarAlertDialog+29 more
Language

Plain Kotlin

Data classes, sealed classes, extensions, and lambdas. Real Kotlin, compiled to bytecode.

data classsealedwhenextensionsclosures
Async

Coroutines and Flow

launch, async, withContext, and 9 Flow operators. Structured concurrency included.

launchasyncStateFlowcollectAsStatedebounce
State

ViewModel

A real Android ViewModel. It survives config changes and works with Hilt.

viewModelScopeSavedStateHandle@HiltViewModeldispatch()
I/O

Networking and storage

HTTP, DataStore, Room, and navigation. 67 capabilities built in.

HTTPDataStoreRoomNavController+ your SDKs
DI

Hilt

Drop it in. @Inject works exactly as before.

@Inject@HiltViewModel@Moduledev overlay

One annotation and one Gradle task. That is the whole difference.

See everything Ketoy supports
Security

Secure and compliant.

Ketoy verifies every bundle before it runs. Here is how, in three parts.

Every bundle is signed

An Ed25519 signature is checked before any code runs. Your private key stays on your server. Only you can ship a bundle.

The sandbox is a build error

The compiler rejects file access, reflection, and any unregistered API. Unsafe code never compiles.

Capabilities are the only door

KBC code reaches the platform through registered capabilities. Nothing else is callable.

Quick start

Three blocks. One Gradle task.

Add the plugin. Write your Compose screen. Run ketoyBundle and upload.

build.gradle.kts
plugins {
  id("dev.ketoy.compiler") version "0.4.13-alpha"
}

dependencies {
  implementation(platform("dev.ketoy.vm:ketoy-bom:0.4.13-alpha"))
  implementation("dev.ketoy.vm:ketoy-runtime")
  implementation("dev.ketoy.vm:ketoy-hilt")
  implementation("dev.ketoy.vm:ketoy-adapters-material3")
  ksp("dev.ketoy.vm:ketoy-ksp-processor")
}
HomeScreen.kt
// The same Compose you already write.
@KetoyEntryPoint
@Composable
fun HomeScreen() {
  val vm    = ketoyViewModel<HomeViewModel>()
  val state by vm.state.collectAsState()

  Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
    Text("Welcome, " + state["name"])
    Button(onClick = { vm.dispatch("get_started") }) {
      Text("Get Started")
    }
  }
}
terminal~60s rollout
# Compile to KBC
$ ./gradlew :ketoy-screens:ketoyBundle

> Task :ketoy-screens:ketoyBundle
  HomeScreen.kt        → home.ktx        2.1 KB
  CheckoutScreen.kt    → checkout.ktx    3.4 KB
  Signed:    Ed25519
  Compressed:Brotli q=11

# Upload. That's the whole release process.
$ aws s3 cp build/ketoy-bundles/ s3://cdn/ketoy/ \
    --recursive --content-encoding br

# Live on every device in ~60s.

Write Kotlin. Ship the screen.

Available now on Maven Central. Hilt, dev tools, and the full Material 3 catalog are included.

Stuck on something, evaluating Ketoy for your team, or wondering if your weird in-house SDK is supported? We answer every email. Usually within the same day. Sometimes faster than your Play Store review.