
Rush is a command-line tool for building App Inventor extensions in Java or Kotlin. Shreyash Saitwal created it in 2021 and introduced it in the original Rush thread, which covers Rush 1. This thread is the home of Rush 2: releases, questions and bug reports go here.
The current version is 2.1.1.
What Rush does
- Builds extensions against App Inventor v206, the current release.
- Supports Java and Kotlin, in the same project if you want.
- Downloads libraries from Maven Central, Google's Maven repository or any repository you add, with their dependencies. Android libraries (AARs) ship with their resources.
- Keeps every library private to your extension, so extensions work together in one app, on App Inventor and on Kodular.
- Shrinks the extension and its libraries with R8, and optionally optimizes and obfuscates it.
- Generates a Markdown reference of your blocks with every build, ready to paste into a forum post.
Highlights
-
Libraries from Maven. List a library in
rush.ymland Rush downloads it with everything it depends on. No more hunting for JARs or keeping track of a library's dependencies by hand. JARs and AARs you have as files go in thedepsfolder. -
Extensions work together in one app. When two extensions bundle the same library (Kotlin, Gson, Guava and so on), the app build fails with "defined multiple times", or one extension gets the other's version and crashes. Rush renames every library your extension ships under your package: its code and, for AARs, its resources, manifest and R classes too. Two extensions can ship different versions of the same library, and an old library in your extension can't clash with the one App Inventor ships. Extensions work on Kodular too, which bundles its own Kotlin and AndroidX libraries.
-
Small extensions. R8 shrinks your extension and all its libraries as one program, so code nothing uses is removed. Media3Player went from 10.2 MB to 6.6 MB, or 5.0 MB with
rush build --optimize. Optimized builds also write a mapping file for reading stack traces. -
Android libraries with their resources. Libraries like Media3's player UI ship as real AARs, and App Inventor compiles their resources into the app. Their manifests are merged into your extension's, and
${applicationId}becomes the app's package. -
Android resources. Put layouts, drawables, strings and colors in a
resfolder and use them from your code through theRclass, as in Android Studio. Your resources can use your libraries' resources (Media3's@drawable/exo_icon_play), and styles can extendTheme.AppCompat. Resource names start with your extension's package, so two extensions never overwrite each other's resources. -
AndroidManifest.xml. Permissions, services, activities, receivers, providers and meta-data go in
src/AndroidManifest.xml, as in an Android app, and are merged with your libraries' manifests. -
Libraries with native code. Native code finds some classes by their original names. Rush reads the library's
.sofiles and prints the packages to keep, as lines forrush.yml. This is how WebRTC and Firebase ship. -
Modern Java and Kotlin. Kotlin 1.8 to 2.4, and Java 17 language features (records, sealed classes, switch expressions, text blocks) on every Android version your extension supports. Libraries compiled for Java 11 or 17 work. With
min_sdk24 or higher,java.timeand other newer Java APIs work as well. Kotlin Multiplatform libraries such as supabase-kt and Ktor build too. -
Blocks. Dropdown blocks from enums, with descriptions from Javadoc. Several components in one extension, sharing one AIX. A warning when a block returns a result App Inventor can't wait for.
-
You decide where libraries go.
librariesinrush.ymlplaces a library:private(the default),sharedfor libraries whose objects pass between extensions,providedfor libraries App Inventor or another extension already has, orexclude.rush deps treeshows where each library goes and why. -
GitHub Actions. New projects include a workflow that builds the extension on every push. Pushing a tag that matches the version in
rush.yml, such asv1.0.0, publishes a GitHub release with the AIX and its documentation attached.shreyashsaitwal/rush-cli@v2sets up Rush in any workflow. -
No computer needed. The Rush extension template creates a project on GitHub that builds in the browser, and every project has a dev container for Codespaces. That works from a phone or tablet too.
-
AI coding agents and editors. Every project carries instructions for AI coding agents (
AGENTS.mdand a Claude skill), and VS Code and IntelliJ project files. -
Reproducible and fast. Two clean builds of a project produce identical AIX files. Builds that change nothing skip compiling and DEX, and libraries are desugared once for all your projects.
Installing
Rush needs a JDK 17 or newer. A JRE isn't enough. Rush uses the JDK that JAVA_HOME points to, or else the one on your PATH.
Linux and macOS:
curl -fsSL https://raw.githubusercontent.com/shreyashsaitwal/rush-cli/main/scripts/install/install.sh | bash
Windows (PowerShell):
iwr https://raw.githubusercontent.com/shreyashsaitwal/rush-cli/main/scripts/install/install.ps1 -useb | iex
The installer offers to download App Inventor's runtime and build tools (about 140 MB) once. After that, builds work offline. On Linux and macOS, add the bin folder the installer prints to your PATH. On Windows, the installer does it for you; open a new terminal afterwards.
Rush runs on 64-bit Windows, Linux (x86-64) and macOS (Intel and Apple silicon).
Updating
- Rush 2: run
rush upgrade. - Rush 1: run the installer above. It replaces Rush 1. Then convert each project with
rush migrate(commit or back it up first). The migration guide lists what to check afterwards.
Creating your first extension
Rush is a command-line tool: run it in a terminal, not by double-clicking.
rush create my_extension --package com.example --language java --ide intellij
cd my_extension
rush build
The extension is written to the out folder as an .aix file. Import it in App Inventor from the Extension palette.
Libraries go in rush.yml:
version: '1.0.0'
min_sdk: 21
dependencies:
- com.google.code.gson:gson:2.13.1
repositories:
- https://jitpack.io
Commands
| Command | What it does |
|---|---|
rush create |
Creates a project |
rush build |
Builds the AIX. --optimize also optimizes and obfuscates it |
rush deps sync |
Downloads dependencies and writes the classpath for your editor |
rush deps tree |
Shows each library and where it goes |
rush clean |
Removes build output |
rush migrate |
Converts Rush 1 projects and older rush.yml files |
rush agents |
Refreshes the AI agent instructions and editor files |
rush upgrade |
Installs the latest Rush |
Questions that come up often
These are collected from the original thread, answered for Rush 2.
Is Rush an app? Nothing happens when I open it.
Rush runs in a terminal (Command Prompt, PowerShell, Terminal). Open one in the folder where you keep your extensions and run rush create. If the terminal says rush isn't found, Rush's bin folder isn't on your PATH: open a new terminal after installing, or add the folder the installer printed.
Could not run javac, or class file has wrong version
Rush needs a JDK 17 or newer, not a JRE. Check with java -version and javac -version: both must print 17 or newer. If you have several JDKs, point JAVA_HOME to the one Rush should use.
My path or Windows user name has spaces
Rush 2 builds in folders with spaces in their names, and project names can contain spaces too.
The installer can't download Rush
The installer downloads from GitHub. If your network blocks raw.githubusercontent.com or GitHub downloads, try another network or a VPN, or install by hand: download the zip for your system from the latest release, unzip it into a folder, add its bin folder to your PATH, and run rush deps sync --dev-deps.
My antivirus flags Rush
That's a false positive. Exclude Rush's folder from scanning, or install from the release zip as above.
How do I add a library?
Add its Maven coordinates (group:artifact:version) under dependencies in rush.yml, and Rush downloads it with its dependencies. For a JAR or AAR you have as a file, put it in the deps folder and list its file name instead. YAML is sensitive to indentation: keep list items under their key, as in the example above.
Permissions, services and other manifest entries
Put them in src/AndroidManifest.xml, as in an Android app. Manifests of AAR libraries are merged in automatically.
The extension builds, but the app fails with no such class or NoClassDefFoundError
Rush 1 needed ProGuard keep rules for the extension class; Rush 2 keeps your extension's classes itself. If the app crashes with a library class missing, the library usually clashes with another extension or with App Inventor's copy. Libraries are private in Rush 2, so rebuild the extensions with Rush 2. If two extensions must share a library's objects, mark it shared in both.
Missing class androidx… when building
App Inventor's AndroidX libraries are from 2018 and always win. When a library needs a newer version of one of them, the build names the missing classes and the rule to add. Jetpack Compose can't work in App Inventor.
My extension works in a built app but not in the AI Companion
The Companion can't load extensions that ship AARs, which includes extensions with resources. Test them with a built APK.
Can my extension show something in the designer?
No: App Inventor shows every extension as a non-visible component. An extension can still show views in the app: let users place an arrangement, and add your view to it from a block. See Showing views.
Can I build extensions on Android?
Use the Rush extension template or a Codespace from your project: both build in the browser.
How do I uninstall Rush?
Delete Rush's folder (~/.local/share/rush on Linux and macOS, %LOCALAPPDATA%\rush on Windows, or ~/.rush for older installs) and remove its bin folder from your PATH.
Good to know
- App Inventor's AndroidX libraries date from 2018 and always take priority. Libraries that need a recent AndroidX, such as Jetpack Compose, do not work in App Inventor.
- DEX files in assets are not supported, and 32-bit Windows isn't either.
- When two extensions in one app ship
androidx.startup, only one extension's initializers run (#88).
Built with Rush 2
- Media3Player: video and audio player built on AndroidX Media3 (ExoPlayer).
- Supabase: auth, database, realtime, storage and Edge Functions.
- WebRTC: video and voice calls, and data channels.
Their source code is a working example if you're planning an extension on modern Android libraries. Built something with Rush? Share it in this thread.
Release history
Rush 2
- 2.1.1 (October 2026): fixes
Could not find Rush data directoryafter upgrading to 2.1.0. - 2.1.0 (October 2026): every library private by default, AARs included; whole-program R8;
original_namesfor native libraries; Kotlin Multiplatform libraries; extensions built for differentmin_sdkin one app. - 2.0.0 (October 2026): Kotlin and Java 17, Maven dependencies, AARs with resources, Android resources, manifest merging, R8, several extensions in one app, block docs, GitHub Actions, App Inventor v206.
Full notes are on GitHub.
Reporting a problem
Reply in this thread, or open an issue, with:
- the output of
rush --version,java -versionandjavac -version, - the command you ran and its full output,
- your
rush.yml, - your operating system.
Ask here rather than in private messages, so the answer helps the next person too.
Credits
Thanks to Shreyash Saitwal for creating Rush, and to everyone who tested it and answered questions in the original thread.
