Android app for Zap Cooking - a Nostr-native cooking and recipe platform.
mobile/
├── android/ # Capacitor Android wrapper
├── web/ # Git submodule → zapcooking/frontend
├── scripts/
│ └── build-mobile.js # Build script (applies static adapter)
├── svelte.config.mobile.js # Mobile-specific config (static adapter)
├── capacitor.config.ts # Capacitor configuration
├── package.json
├── zapstore.yaml
└── README.md
- Node.js 22.x
- pnpm
- Android Studio with SDK 34+
- Java 17+
# Clone with submodule
git clone --recursive https://github.com/zapcooking/mobile.git
cd mobile
# Or if already cloned:
git submodule update --init
# Install mobile dependencies
pnpm install
# Install web dependencies
pnpm install:webPull latest changes from the frontend repo:
cd web
git pull origin main
cd ..
git add web
git commit -m "Update web submodule"# Build web app with static adapter
pnpm build:mobile
# Sync with Capacitor
pnpm cap:sync
# Open in Android Studio
pnpm cap:open# Full release build
pnpm release
# Or manually:
pnpm build:mobile
pnpm cap:sync
cd android
./gradlew assembleReleaseThe APK will be at: android/app/build/outputs/apk/release/app-release.apk
Release builds require a keystore. Create android/keystore.properties:
storeFile=zap-cooking-release.keystore
storePassword=YOUR_PASSWORD
keyAlias=YOUR_KEY_ALIAS
keyPassword=YOUR_KEY_PASSWORD# Build release APK
pnpm release
# Publish to Zapstore
zapstore publish- Frontend repo (zapcooking/frontend): Pure web app, deploys to Cloudflare
- Mobile repo (this): Wraps frontend for Android with Capacitor
The mobile build process:
- Temporarily applies
svelte.config.mobile.js(static adapter) to web/ - Builds the SvelteKit app as static files
- Restores original config
- Capacitor syncs the static files into the Android app
This keeps the frontend repo clean (web-only) while mobile handles its own concerns.