N 47.3°
E 152.4°
KURIL ARC
SEA · OKHOTSK
Alpha · Shipping to field testers
LAT 47°20′N
LON 152°28′E
VOL. 1 · ED. 01
A Kotlin execution runtime for Android

Ship Kotlin.
Rewrite anytime.

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.

RuntimeKetoyVM v0.2
BytecodeKBC · .ktx
Propagation~60s to every device
OriginKetoy Island
01 / 04THE FLOW

Write Kotlin. Run ./gradlew ketoyBundle. Ship.

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.

STEP 01

Author

Write CheckoutScreen.kt with a LazyColumn, a ViewModel, Retrofit calls, and host-exposed repositories. Exactly the Kotlin you'd write today.

→ CheckoutScreen.kt
STEP 02

Compile

The KetoyVM compiler plugin lowers your Kotlin to Ketoy Bytecode (KBC) server-side. Compose, coroutines, DI, all preserved.

→ ./gradlew ketoyBundle
STEP 03

Publish

Upload checkout.ktx to Ketoy Cloud. Stage, canary, or ship to 100%. Version and rollback without a store release.

→ checkout.ktx · 142 KB
STEP 04

Execute

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.

→ KetoyRuntime.load()
02 / 04THE RUNTIME

Everything you use. Nothing you'd compromise.

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.

UI

Jetpack Compose, full surface

Every composable. Every modifier. Every parameter. Rendered natively by the platform, not re-implemented.

NATIVE COMPOSE
Concurrency

Coroutines with correct semantics

Structured concurrency, cancellation, flows, channels. Suspending functions behave exactly as they do in a native build.

COROUTINE · FLOW
State

ViewModels with real lifecycles

Scoped to the correct NavBackStackEntry. Survives configuration change. Clears on the correct signal. No shims.

VIEWMODEL · LIFECYCLE
Data

Room functions, exposed by the host

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.

ROOM · FLOW<T>
DI

Hilt functions, exposed by the host

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.

HILT · @Inject
Navigation

NavController for every destination

Typed routes, deep links, back-stack, animated transitions. Your nav graph ships inside the bundle.

NAV · BACKSTACK
03 / 04WHAT YOU WRITE

The source stays yours. The delivery changes.

CheckoutScreen.kt
Kotlin · 142 lines
@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.
No DSL. No mapping. No schema.

The same Kotlin file ships three ways, and none of them require a rewrite.

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.

Publishing checkout.ktx · v142
60s
1,248,391 devices on v141 → v142
live
04 / 04THE NAME

Named for an uninhabited volcano.

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.

THE ISLAND

Ketoy Остров Кетой

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.

LAT 47° 20′ N
LON 152° 28′ E
AREA 73 km²
PEAK 1,172 m · Ketoy volcano
POP 0
THE RUNTIME

KetoyVM v0.2 · Alpha

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.

KIND Kotlin execution runtime · Android
BC Ketoy Bytecode (KBC)
PKG .ktx bundle
RENDER Native Jetpack Compose
STAGE Alpha · by invitation
JOIN THE ALPHA · COHORT 01

The future of Android
is your app, rewritten.

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.

Book a call with the team
NO SPAM · ONE EMAIL WHEN YOUR SLOT OPENS