Bubba compiles directly to native Android APKs. No JVM, no Gradle, no runtime bloat — just fast, small, native code.
The parts you need. A runtime, a macro, a build tool. Nothing else.
Compiles to native ARM64. No interpreter, no garbage collector. Pure Rust performance on every device.
The view!{} macro describes your interface with familiar tags. No boilerplate, no extra
concepts to learn.
Your entire app, including the runtime, weighs under 500 KB. Built for constrained devices and slow connections.
Write plain .css files and apply classes with class="...". Parsed at compile
time — zero runtime cost.
Navigate with navigate(ScreenName). No routers to configure, no dependencies to add.
Business logic lives in ordinary Rust functions. No framework-specific patterns, no hidden magic.
Each screen is a plain Rust function returning a view!{}. HTML-like tags, direct event
handlers, CSS classes exactly where you'd expect them.
#[screen]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>
}
}
The entire build pipeline is pure Rust. No Gradle, no JVM, no mystery build scripts.
A screen is a Rust function with a view!{} macro and a .css file for styling.
cargo bubba build compiles to aarch64-linux-android via the NDK linker.
Assets, manifest, and binary are zipped into a signed .apk automatically.
cargo bubba run installs directly to a connected Android device.
Every example includes complete source code and can be scaffolded in one command.
Minimal single-screen app — the starting point.
Home and Profile screens with navigation between them.
Add, complete, and delete items. Demonstrates state and lists.
Fetch data from a REST endpoint using async/await.
Scrollable image grid loaded from the assets folder.
Input fields, basic validation, and screen navigation.
bubba is built in the open. This is where the project is headed.
The essential pieces: the view!{} macro, core elements, CSS compile-time parsing,
navigation, and the CLI.
Hot reload, input handling, better error messages from the macro, and broader device coverage.
Built-in HTTP fetching, background task spawning, local storage, and optional reactive state.
CSS variables, dark mode, animation, and custom font loading.
Compile to .ipa for iOS with a UIKit rendering bridge.
A plugin API for native capabilities and a community registry.
bubba is open source and built in the open. All contributions are welcome.
Chat with other developers, ask questions, and follow development in real time.
discord.gg/bubba →Browse the source, open issues, and submit pull requests.
github.com/nia-cloud-official/bubba-rs →Subscribe to be notified about new releases and breaking changes.
Subscribe via RSS →Technical posts about how bubba is built and community tutorials.
blog.bubba.rs →The contributing guide explains how to set up the environment and get started.
CONTRIBUTING.md →Built something with bubba? Submit it and get featured on this site.
Submit your app →You need Rust stable and the Android NDK. No Gradle, no Android Studio.
Get Rust via rustup.rs if you don't have it already.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shAdd ARM64 Android compilation to your Rust toolchain.
rustup target add aarch64-linux-androidInstall the cargo bubba subcommand from crates.io.
cargo install cargo-bubbacargo bubba new my_app && cd my_appcargo bubba build