packages/feed/apps/web/twa/README.md
This directory contains the configuration for building a Trusted Web Activity (TWA) Android APK from the Feed PWA. This APK is used for distribution on the Solana Mobile dApp Store.
@bubblewrap/cli installed globally: npm i -g @bubblewrap/cli# Initialize the Bubblewrap project from the live manifest
bubblewrap init --manifest https://feed.market/manifest.webmanifest
# Or use the local twa-manifest.json
bubblewrap init --manifest ./twa-manifest.json
Bubblewrap will prompt for JDK and Android SDK paths. It can download them automatically if they're not installed.
keytool -genkeypair \
-alias feed \
-keyalg RSA \
-keysize 2048 \
-validity 10000 \
-keystore signing-key.keystore
Important: Use a dedicated signing key separate from any future Google Play Store key. Store it securely — it cannot be changed after submission.
bubblewrap build
This produces:
app-release-signed.apk — for Solana dApp Store submissionapp-release-bundle.aab — for Google Play (if needed later)The TWA needs to verify that the Android app owns the web domain. Add the SHA-256 fingerprint of your signing key to:
https://feed.market/.well-known/assetlinks.json
Generate the fingerprint:
keytool -list -v -keystore signing-key.keystore -alias feed | grep SHA256
Then create assetlinks.json:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "market.feed.app",
"sha256_cert_fingerprints": ["YOUR_SHA256_FINGERPRINT"]
}
}]
MWA is registered automatically in the web app via SolanaMobileProvider.tsx
when running on Android. Since TWAs use Chrome's rendering engine, MWA
should work seamlessly inside the dApp Store listing.
Supported wallets: Phantom, Solflare, Backpack (on Android)