Complete workflow to build and upload a signed Android App Bundle (AAB) to Google Play Store.
keytool -genkey -v -keystore release.keystore -alias release \
-keyalg RSA -keysize 2048 -validity 10000Put your markdown file in a clean folder (avoid large binaries or unrelated files):
mkdir -p ~/my-course
cp your-course.md ~/my-course/
# Copy any images/resources the course needs- Go to Google Play Console
- Create a new app
- Fill in store listing details (title, description, screenshots)
- Set up app category and content rating
cd ~/LiaScript-Exporter
docker build -t liascript-exporter-android .docker run --rm \
-v $(pwd)/release.keystore:/keystore/release.keystore \
-v $(pwd)/output:/output \
-v ~/my-course:/input \
-e KEYSTORE_PASSWORD="your-password" \
-e KEY_PASSWORD="your-key-password" \
liascript-exporter-android \
--input /input/your-course.md \
--format android \
--output /output/my-app \
--android-bundle \
--android-appId "com.yourcompany.yourapp" \
--android-appName "Your App Name"Output: output/my-app.aab (ready for upload)
- Open Google Play Console
- Select your app
- Go to Production → Create new release
- Upload
output/my-app.aab
- Release name: e.g., "Version 1.0.0"
- Release notes: Describe what's in your course
- Click Review release
- Review all details
- Click Start rollout to Production
- Google will review your app (typically 1-3 days)
When you need to update your course:
- Update your markdown file
- Increment version in your build (optional: add
--android-versionCodeflag) - Rebuild AAB with the same keystore and passwords
- Upload to Play Console as a new release
| Flag | Description | Example |
|---|---|---|
--android-bundle |
Build AAB instead of APK | Required for Play Store |
--android-appId |
Unique app identifier | com.company.app |
--android-appName |
App display name | "My Course" |
| Flag | Description | Default |
|---|---|---|
--android-keystore |
Keystore file path | /keystore/release.keystore |
--android-keystorePassword |
Keystore password | From KEYSTORE_PASSWORD env var |
--android-keyPassword |
Key password | From KEY_PASSWORD env var |
--android-keyAlias |
Key alias in keystore | release |
--android-icon |
Custom app icon (1024x1024px) | LiaScript default |
- Cause: Large files in course directory
- Fix: Ensure only course files are in the input folder
- Cause: Course file not mounted correctly
- Fix: Check
-v ~/my-course:/inputmatches--input /input/your-course.md
- Cause: Keystore not mounted or wrong path
- Fix: Verify
-v $(pwd)/release.keystore:/keystore/release.keystore
- Cause: Gradle build failed
- Fix: Check error messages in build output, ensure passwords are correct
# 1. Create keystore (first time only)
keytool -genkey -v -keystore release.keystore -alias release \
-keyalg RSA -keysize 2048 -validity 10000
# 2. Prepare course folder
mkdir -p ~/courses/intro-to-physics
cp intro-to-physics.md ~/courses/intro-to-physics/
# 3. Build Docker image
cd ~/LiaScript-Exporter
docker build -t liascript-exporter-android .
# 4. Build signed AAB
docker run --rm \
-v $(pwd)/release.keystore:/keystore/release.keystore \
-v $(pwd)/output:/output \
-v ~/courses/intro-to-physics:/input \
-e KEYSTORE_PASSWORD="mySecretPass123" \
-e KEY_PASSWORD="mySecretPass123" \
liascript-exporter-android \
--input /input/intro-to-physics.md \
--format android \
--output /output/physics-app \
--android-bundle \
--android-appId "com.education.physics" \
--android-appName "Physics 101"
# 5. Upload output/physics-app.aab to Google Play Console- Google Play Console: https://play.google.com/console
- Play Console Help: https://support.google.com/googleplay/android-developer
- App Signing Help: https://developer.android.com/studio/publish/app-signing
- LiaScript Documentation: https://liascript.github.io