KetoyVM executes plain Kotlin with full Jetpack Compose, coroutines, ViewModels, and Navigation inside a .ktx bundle. Push a new build to every device in 60 seconds. No Play Store round-trip. No DSL. No schema.
Four steps from your IDE to every user's phone. No app-store review. No binary split. No workaround DSL. The exact Kotlin you already write compiles to Ketoy Bytecode and executes inside the runtime on device.
Write CheckoutScreen.kt with a LazyColumn, a ViewModel, Retrofit calls, and host-exposed repositories. Exactly the Kotlin you'd write today.
The KetoyVM compiler plugin lowers your Kotlin to Ketoy Bytecode (KBC) server-side. Compose, coroutines, DI, all preserved.
Upload checkout.ktx to Ketoy Cloud. Stage, canary, or ship to 100%. Version and rollback without a store release.
The host app pulls the bundle. KetoyRuntime executes it natively with every Compose parameter, every coroutine scope, and every host-exposed query in under 60s.
KetoyVM is not a cross-platform abstraction. It is a Kotlin execution runtime. Components render natively through Jetpack Compose with every modifier, parameter, and animation, all with correct lifecycle semantics from end to end.
Every composable. Every modifier. Every parameter. Rendered natively by the platform, not re-implemented.
Structured concurrency, cancellation, flows, channels. Suspending functions behave exactly as they do in a native build.
Scoped to the correct NavBackStackEntry. Survives configuration change. Clears on the correct signal. No shims.
Flow-returning DAOs. KetoyVM does not update Room; it exposes your app's Room functions for new features. Room updates require a Play Store release.
Inject repositories, clients, data sources into composables and ViewModels through the host app. KetoyVM does not update Hilt; it exposes Hilt-provided functions. Hilt updates require a Play Store release.
Typed routes, deep links, back-stack, animated transitions. Your nav graph ships inside the bundle.
@Composable fun CheckoutScreen( viewModel: CheckoutViewModel = hiltViewModel(), onDone: () -> Unit, ) { val cart by viewModel.cart.collectAsState() val scope = rememberCoroutineScope() LazyColumn( modifier = Modifier.fillMaxSize().padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp), ) { items(cart.lines, key = { it.id }) { line -> CartRow(line, onQty = viewModel::updateQty) } item { PrimaryButton("Place order") { scope.launch { viewModel.placeOrder() onDone() } } } } } // ./gradlew ketoyBundle → checkout.ktx // Uploaded. Live in 60s.
A native build. A bundled .ktx delivered over the air. A staged canary to 2% of your users. The compiler does the work; your source tree is untouched.
Kotlin is named for an island in the Gulf of Finland. We took the same road south-east, across the Sea of Okhotsk to the Kurils, and named the runtime for a volcanic island no one lives on. Unmapped terrain. Built for explorers.
Uninhabited. Volcanic. Central Kuril chain, Sea of Okhotsk. 73 km² of basalt and cloud forest, last erupted in living memory, inhabited only by sea birds and the occasional geologist.
A Kotlin program execution runtime for Android. Like Hermes to React Native's JavaScript, KetoyVM is built for Kotlin and Compose. Compiler plugin lowers your source to KBC. Host app loads the .ktx bundle. Runtime executes.
KetoyVM is in continuous alpha. If over-the-air Kotlin, Compose from a bundle, and 60-second deploys interest you, we're opening the next cohort by invitation.