Whitehall

A language and toolchain for Android

Write a component.
Get an Android app.

Declarative UI. File-based routes. Compiles straight to Kotlin and Compose.

$
curl -fsSL https://whitehall.sh/install | bash
UserCard.wh Whitehall
@prop val user: User

<Column class="gap-16 p-20">
  <Image src={user.avatar} class="w-64 h-64" />
  <Text class="text-xl font-bold">
    {user.name}
  </Text>

  @if (user.isVerified) {
    <Badge color="primary">Verified</Badge>
  }

  <Button onClick={() => $navigate("/profile")}>
    View Profile
  </Button>
</Column>

Real Kotlin

Compiles to Kotlin and Compose. Nothing of Whitehall ships in the APK.

State is just var

Assign to it and the screen recomposes. No remember, no mutableStateOf.

Routes are files

Drop a file in routes/. Get a screen, a layout, and a back stack.

Nothing to install

Java, Gradle, and the SDK install themselves. You never open Android Studio.

The rest of the app

Everything you'd otherwise wire together yourself, already in the language.

HTTP

$fetch, same as the web. Disk caching with cache = "1d".

Animations

Screen transitions, list reordering, shared elements. One directive each.

Navigation

$navigate with typed params, back-stack state, and deep links.

State

var for a screen, @store for the app, ViewModels when you want one.

Background Work

$dispatch for one-off jobs, $periodic for recurring. WorkManager underneath.

Tooling

Formatter, linter, and hot reload, in the compiler. No plugins to pick.

Components

58 of shadcn's 63, ported to Compose. See the list.

Theming

shadcn tokens in a theme.toml. Light, dark, and seven base colors, switchable at runtime.

Two commands to a running app

whitehall init my-app, then whitehall run. That's the whole setup.

Whitehall An experiment in writing radically modern Android apps