Skip to content
Ink
Esc
↑↓navigate↵open⌘Jpreview
On this page

Build an APK

Build and sign an Android app for distribution.

Run build commands from your app directory after completing setup.

Development build

ink build --debug

This builds a development APK without a release signing key.

Release build

Create a signing key once and keep a backup. Updates to an installed app must use the same key.

keytool -genkeypair -keystore release.jks -alias app -keyalg RSA -keysize 3072 -validity 10000

Add its location to ink.toml:

[signing]
keystore = "release.jks"
key_alias = "app"

Set INK_KEYSTORE_PASSWORD in your shell or secret manager. If the key has a different password, set INK_KEY_PASSWORD too. Otherwise, Ink uses the keystore password.

ink build

Ink writes the signed APK to dist/. Keep keystores and passwords out of version control.

Release APKs use <app-name>-<version>.apk; development APKs add -debug.

Before distributing an update, increase version_code in ink.toml. Use version for the human-readable version number.

ink info shows configuration and built APKs without compiling. Its cached JavaScript size and capabilities describe the last successful compilation; run ink check to refresh them.

Release through GitHub Actions

New apps created with ink create include Prepare Release and Release workflows. Add them to an existing app with:

ink setup release

The workflows use main. Setup refuses to overwrite files with different contents; move those files aside before regenerating, then merge any customisations.

Run ink install and commit package.json and bun.lock to pin the app to a published Ink version.

Create a signing key as described above, then add its contents and password as repository Actions secrets:

base64 < ~/.keystores/app-release.jks | gh secret set INK_KEYSTORE_BASE64
gh secret set INK_KEYSTORE_PASSWORD

Run these commands from the app’s GitHub checkout. The password command prompts privately. If the key has a separate password, add INK_KEY_PASSWORD too. Set the repository variable INK_KEY_ALIAS if the alias differs from app.

Allow GitHub Actions to create pull requests in the repository’s Actions settings. Run Prepare Release with a version newer than the current app version. It opens a PR updating version and incrementing version_code in ink.toml.

Merge the PR to release. The workflow reserves the version tag, installs the pinned Ink release and its build tools, runs the app’s check script, then builds and verifies the signed APK. The GitHub release contains the APK and SHA256SUMS. Versions with a prerelease suffix produce GitHub prereleases.

To try the build first, run Release manually with publishing unchecked. Download the signed-apk workflow artifact when it completes. This does not create a tag or GitHub release.

Rerun failed jobs on the same commit; a tag pointing elsewhere requires a new version. Signing configuration stays on the runner, and the temporary keystore is removed when the job finishes.