Bubba — building apps made easier

Build mobile apps
with Rust.

Bubba compiles directly to native Android APKs. No JVM, no Gradle, no runtime bloat — just fast, small, native code.

<500KB
Hello World APK
<200ms
Cold start time
0
JVM / Gradle required
<30s
Full release build
Why bubba

Designed to stay out of your way

The parts you need. A runtime, a macro, a build tool. Nothing else.

Zero-overhead runtime

Compiles to native ARM64. No interpreter, no garbage collector. Pure Rust performance on every device.

Declarative UI

The view!{} macro describes your interface with familiar tags. No boilerplate, no extra concepts to learn.

Tiny output

Your entire app, including the runtime, weighs under 500 KB. Built for constrained devices and slow connections.

Real CSS styling

Write plain .css files and apply classes with class="...". Parsed at compile time — zero runtime cost.

Built-in navigation

Navigate with navigate(ScreenName). No routers to configure, no dependencies to add.

Plain Rust logic

Business logic lives in ordinary Rust functions. No framework-specific patterns, no hidden magic.

Syntax

Screens that feel familiar

Each screen is a plain Rust function returning a view!{}. HTML-like tags, direct event handlers, CSS classes exactly where you'd expect them.

  • No attribute macros like #[screen]
  • String literals become text nodes inline
  • CSS classes work the same as in HTML
  • Events are closures — no binding ceremony
screens/home.rs
Rust
use bubba::prelude::*;
use crate::screens::profile::Profile;

pub fn Home() -> Screen {
    view! {
        <h1 class="title">
            "Welcome to Bubba"
        </h1>

        <button
            class="primary-btn"
            onclick=alert("Tapped!")
        >
            "Tap me"
        </button>

        <button
            class="link-btn"
            onclick=navigate(Profile)
        >
            "Go to Profile"
        </button>
    }
}
Process

From Rust to APK

The entire build pipeline is pure Rust. No Gradle, no JVM, no mystery build scripts.

01

Write your screens

A screen is a Rust function with a view!{} macro and a .css file for styling.

02

Run the build

cargo bubba build compiles to aarch64-linux-android via the NDK linker.

03

APK is packaged

Assets, manifest, and binary are zipped into a signed .apk automatically.

04

Install and run

cargo bubba run installs directly to a connected Android device.

Examples

Start from a working project

Every example includes complete source code and can be scaffolded in one command.

Hello World

Minimal single-screen app — the starting point.

beginner1 screen

Multi-Screen App

Home and Profile screens with navigation between them.

beginner2 screens

Todo List

Add, complete, and delete items. Demonstrates state and lists.

intermediatestate

API Fetch

Fetch data from a REST endpoint using async/await.

intermediateasync

Image Gallery

Scrollable image grid loaded from the assets folder.

intermediateassets

Login Flow

Input fields, basic validation, and screen navigation.

intermediateforms
Roadmap

What's coming

bubba is built in the open. This is where the project is headed.

v0.1 — Foundation

Core framework

The essential pieces: the view!{} macro, core elements, CSS compile-time parsing, navigation, and the CLI.

view!{} macro Core elements CSS parsing Navigation stack CLI Android APK output
v0.2 — Stability

Developer experience

Hot reload, input handling, better error messages from the macro, and broader device coverage.

Hot reload input element Error messages bubba doctor x86_64 Android
v0.3 — Async & Data

Networking and state

Built-in HTTP fetching, background task spawning, local storage, and optional reactive state.

fetch() client spawn() tasks Local storage use_state
v0.4 — Styling

Richer visual system

CSS variables, dark mode, animation, and custom font loading.

CSS variables Dark mode Animations Custom fonts
v0.5 — iOS

Cross-platform

Compile to .ipa for iOS with a UIKit rendering bridge.

iOS target UIKit bridge --target ios
v1.0 — Plugins

Native integrations

A plugin API for native capabilities and a community registry.

bubba-plugin trait Camera GPS Notifications Registry
Community

Get involved

bubba is open source and built in the open. All contributions are welcome.

Installation

Up and running

You need Rust stable and the Android NDK. No Gradle, no Android Studio.

1

Install Rust

Get Rust via rustup.rs if you don't have it already.

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
2

Add the Android target

Add ARM64 Android compilation to your Rust toolchain.

rustup target add aarch64-linux-android
3

Install cargo-bubba

Install the cargo bubba subcommand from crates.io.

cargo install cargo-bubba
4

Create your first app

cargo bubba new my_app && cd my_app
cargo bubba build
APK at target/bubba/my_app.apk
Read the docs Get help on Discord