Skip to main content
Turn an existing web app or PWA into an installable Android app: init generates an Android WebView project around your URL, and build produces a signed release APK you can publish on the dApp Store.
The generated project is a WebView shell, not a Trusted Web Activity (TWA) — it needs no Digital Asset Links setup. Links outside the configured host open in the system browser, and Solana wallet intents are handled natively by the shell.

webshell init

Generate the Android project. Run it without arguments to be prompted for everything, or pass the values you already know:
The directory defaults to the current one. --force overwrites an existing directory. If your app already has a web manifest, point --manifest at it — by path or URL — and the CLI seeds the app name, URL, and icons from it. A Bubblewrap twa-manifest.json works too, and also carries over the application id, versions, and signing key:
The generated project keeps its configuration in twa-manifest.json, so init can be re-run against it later.

Signing

init needs a signing keystore, and creates one when the path you give it does not exist yet. Set SOLANA_MOBILE_KEYSTORE_PASSWORD (and SOLANA_MOBILE_KEY_PASSWORD, if the key uses a different password) to skip the password prompt; otherwise you are asked for a password and a confirmation, since a typo produces a keystore you can never sign an update with. An existing keystore is reused as-is and needs no password until you build.
Keep the keystore file and its passwords safe. Every future update of your app must be signed with the same key — losing it means you cannot update the app. See Google’s app signing guide.

Options

webshell build

Build a signed release APK from a webshell project:
The directory defaults to the current one. The APK lands at app/build/outputs/apk/release/app-release.apk, ready to install on a device or submit to the dApp Store. Signing passwords come from SOLANA_MOBILE_KEYSTORE_PASSWORD and SOLANA_MOBILE_KEY_PASSWORD so CI runs never prompt; when they are unset, the build asks for them.

Options

Environment variables

Last modified on September 3, 2026