Solana Mobile In Depth
Solana Mobile is not a separate ledger or a special RPC. It is a client and distribution stack for Android-first Solana apps: wallets and dApps talk through a standardized mobile protocol, keys can live in hardware-backed storage on supported devices, and discovery can run through a store built for crypto apps rather than browser extensions alone.
Desktop and mobile web still matter, but phone-native flows change the integration surface. There is no window.solana. Users leave your process for a wallet app and return through intents. Signing can be gated by biometrics and a secure element. Shipping often targets the Solana Mobile dApp Store as well as (or instead of) only Google Play.
This page is the section umbrella for that stack and the React Native build path with @solana/kit 7.0.0. Sibling pages deepen each branch.
Summary
- Solana Mobile is an Android-centric product stack where dApps authorize and sign via Mobile Wallet Adapter, optionally backed by Seed Vault hardware on Seeker-class devices, return via deep links and session tokens, and distribute through the dApp Store (and standard Android channels) while building transactions with the same kit/RPC model as web clients.
- Insight: Treating mobile as "responsive web with a wallet button" produces broken authorize flows, lost sessions after wallet hops, insecure local key storage, and failed store reviews. A shared map of MWA sessions, Seed Vault trust boundaries, and release/distribution constraints prevents those classes of bugs.
- Key Concepts: Solana Mobile Stack (SMS), Mobile Wallet Adapter (MWA),
transact/ authorize / reauthorize / deauthorize`, Seed Vault, secure element, deep link / intent filter, auth token, dApp Store, Seeker / Saga, Expo dev client, @solana/kit. - When to Use: First orientation before scaffolding a mobile dApp; choosing MWA vs embedded custody; designing connect/sign/return UX; planning Seeker-targeted security and store submission.
- Limitations/Trade-offs: Android and MWA maturity lead iOS; Seed Vault is device/wallet dependent; Expo Go is not enough for native MWA modules; dApp Store reach is crypto-native, not mass-market Play scale; on-chain programs and Agave consensus are unchanged.
- Related Topics: Solana Mobile basics, MWA, building a mobile dApp, deep links and sessions, Seed Vault security, and the dApp Store.
Foundations
Solana Mobile Stack is the product name for three cooperating pieces:
- Mobile Wallet Adapter - the protocol and SDKs that let a dApp request authorization and signatures from a wallet app without embedding private keys.
- Seed Vault - hardware-backed seed and key storage on supported Solana Mobile devices, exposed through wallets that implement the secure path.
- dApp Store - a distribution and discovery channel for Solana mobile apps, especially those targeting Seeker (and earlier Saga) hardware.
Hardware brands (Saga, Seeker) are devices and ecosystems, not new virtual machines. Transactions still hit the same clusters through the same RPC surface as web. Agave 4.1.1, Anchor 0.32.1, and @solana/kit 7.0.0 remain the chain-facing stack; mobile changes how users sign and how you ship the client.
| Layer | Web / desktop default | Solana Mobile default |
|---|---|---|
| Wallet attach | Extension inject (window.solana) or Wallet Adapter UI | MWA session via wallet app + intents |
| Key storage | Extension or hardware wallet companion | Wallet process; Seed Vault on supported devices |
| App lifecycle | Single browser tab | Multi-app: dApp, wallet, return deep link |
| Distribution | Hosted HTTPS SPA or PWA | Android package + dApp Store / Play / sideload |
| Client tx stack | @solana/kit (or legacy web3) | Same kit pipeline inside React Native / Hermes |
Mobile Wallet Adapter is the integration contract. Your app presents an identity (name, URI, icon), requests authorize for a cluster, receives accounts and an auth token, then asks the wallet to sign transactions or messages inside a scoped session (commonly the transact helper). The wallet UI owns approval sheets and biometric prompts; your app owns serialized transaction bytes and post-sign sendTransaction / confirmation against RPC.
Seed Vault is the trust boundary for keys on supported hardware. The seed material stays out of your React Native bundle and out of ordinary app storage. When a wallet routes signing through Seed Vault, private keys never become readable app memory. Your security job is narrower and stricter: do not invent local mnemonics, protect auth tokens, and treat wire transaction bytes and logs as sensitive enough not to dump wholesale in production.
Deep links and sessions are the lifecycle glue. Authorize and sign often switch to another Android activity (the wallet). Correct intent filters, return schemes, and reauthorize with a stored token decide whether users re-enter a connected experience or hit a dead end after approval. Cold start (app process killed while the user is in the wallet) is a first-class case, not an edge case.
dApp Store is how many Solana Mobile users find and install apps. Submission needs signed release artifacts, privacy policy, honest network claims, and a working MWA path on review hardware. It is distribution policy and packaging, not a second blockchain.
Building a mobile dApp usually means React Native (often Expo with a custom dev client so native MWA modules load), kit-based RPC and transaction construction, and MWA for connect/sign. Monorepos can share kit-generated clients with web; only the wallet attach layer diverges.
User on Seeker / Android
|
v
Your dApp (React Native + @solana/kit)
| build unsigned tx bytes / messages
| transact() -> authorize / sign
v
Wallet app ---- optional ----> Seed Vault (secure element)
| approve + signatures
| intent / deep link return
v
Your dApp resumes session (auth token)
| sendTransaction + wait commitment
v
RPC -> Agave cluster (same as web)
Mechanics & Interactions
MWA session lifecycle
A productive mental sequence for every screen that needs a wallet:
- Authorize (or reauthorize with a cached token) with full identity metadata and the correct cluster string for your RPC.
- Read accounts from the result; store the public address for UI and fee-payer selection; store the auth token in secure storage, not plain logs.
- Build transaction messages with @solana/kit 7.0.0 the same way you would on web: instructions, account metas, blockhash, fee payer.
- Enter
transact, sign inside the callback, exit the session quickly (wallet UIs time out on long work). - Submit signatures over HTTPS RPC, then wait for
confirmedorfinalizedper product risk. - Deauthorize and clear the token on logout or when reauthorize fails and you force a full authorize again.
Cluster mismatch is the classic silent failure: authorize for devnet while RPC points at mainnet-beta (or the reverse). Treat cluster as one config object shared by MWA, kit RPC, and explorer links.
Deep links, intents, and resume
Android moves the user between packages. Expo app.json / prebuild intent filters and a stable custom scheme (or verified app links) are product requirements, not polish.
Handle warm resume (process alive; restore pending UI), cold start (process killed; restore token, reauthorize, rehydrate navigation), user cancel (reject cleanly; offer retry), and stale token (fall back to full authorize). Prefer platform secure store for auth tokens over plain AsyncStorage.
Seed Vault and app-side security
MWA already keeps signing outside your process when the user uses an external wallet. Seed Vault strengthens that on supported devices by binding keys to secure hardware and wallet-mediated biometrics.
App-side rules: never ship seed phrases in JS bundles or app storage; minimize full transaction dumps in logs; keep any server keypairs off the device; optional hardening includes screenshot flags and root detection for high-value products.
Building and shipping
# Scaffold (see current create-solana-dapp mobile options)
npx create-solana-dapp@latest --mobile
# Expo: custom dev client required for native MWA modules
npx expo start --dev-client
# Release artifact for store submission
eas build --platform android --profile productionTest MWA on physical devices early; emulators misrepresent intent handoff. On-chain logic still uses CLI, Surfpool, and LiteSVM like web; mock MWA in mobile unit tests. dApp Store submission needs production signing, versionCode bumps, privacy and support URLs, and a build that completes authorize/sign on reference hardware. Dual-track Play Store for mass reach; dApp Store for Solana Mobile discovery.
Advanced Considerations & Applications
Shared monorepo clients. Share instruction builders, IDL types, and RPC helpers between Next.js and React Native; isolate MWA, deep links, and secure storage in the mobile app so Anchor 0.32.1 upgrades stay aligned.
Session and identity UX. Reauthorize for low friction; force full authorize after privilege changes or failed sessions. Stable identity name, HTTPS URI, and icon reduce phishing confusion and should match store listing assets. Silent reconnect is fine for read UX; high-value sign should always feel deliberate.
iOS, networks, and program risk. Android-first is the honest default until your wallet matrix covers iOS; mobile web can bridge interim users. Design RPC retries and commitment waits for flaky cellular; local signature is not settlement. PDAs, account metas, and CU rules are identical to web - mobile is a client concern; on-chain audits still dominate protocol risk.
Common Misconceptions
- "Solana Mobile is a different chain or runtime." It is client protocol, hardware key storage, and distribution. Programs and accounts are the same Solana model on Agave clusters.
- "I can use Expo Go like any other RN demo." MWA needs native modules and a custom dev client (or bare workflow). Expo Go alone is not the production path.
- "MWA is just window.solana on Android." There is no extension inject. Sessions, intents, identity metadata, and auth tokens are the contract.
- "Storing the mnemonic in the app is fine if encrypted with a PIN." Prefer external wallet + Seed Vault. App-held seeds expand breach and backup failure modes.
- "If authorize succeeded once, deep links do not matter." Every sign can leave your process. Return paths and cold-start resume decide whether users finish the flow.
- "dApp Store replaces engineering release hygiene." You still need signed release builds, versioning, privacy policy, and device QA.
- "@solana/web3.js v1 is required for mobile." Prefer @solana/kit 7.0.0 for new work with MWA packages that accept kit wire formats.
FAQs
What is the Solana Mobile Stack in one sentence?
MWA for wallet authorize/sign, Seed Vault for hardware-backed keys on supported devices, and the dApp Store for distribution - all on standard Solana clusters.
Does mobile change how Anchor programs work?
No. Anchor 0.32.1 programs still validate accounts and run on Agave; only the client signing and packaging path changes.
What does MWA authorize return that I must persist?
Account addresses for UX and the auth token for reauthorize; store the token securely and clear it on deauthorize.
Why must identity name, URI, and icon be complete?
Wallets show them on approval UI and may reject incomplete identity; they are also the user's main phishing check.
How does Seed Vault differ from a software wallet on the same phone?
Seed Vault keeps seed material in hardware-backed storage mediated by the wallet; a pure software wallet keeps keys in the wallet app's software domain.
Should my dApp call Seed Vault APIs directly?
Usually no. Prefer MWA so any compliant wallet (including Seed Vault-backed ones) can sign without your app taking key custody.
What breaks if intent filters are wrong?
The wallet cannot return control cleanly after approval; users approve and land outside your pending UI or on a cold start without restored state.
reauthorize vs authorize?
authorize is the full connect path. reauthorize reuses a stored auth token until the token is invalid or revoked.
Can I share kit transaction code with a Next.js app?
Yes. Share message construction and RPC helpers; swap only the signer attach layer (browser wallet adapter vs MWA transact).
Is the dApp Store mandatory?
No. Ship Play, sideload, or other channels as needed; the dApp Store matters for Solana Mobile discovery and Seeker-oriented users.
Which commitment should mobile UX wait for?
Same as web: many actions use confirmed; irreversible effects wait for finalized; never treat local sign alone as final.
How should I test without a Seeker?
Physical Android devices with MWA-compatible wallets for protocol QA; emulators only as a weak secondary. On-chain tests stay on CLI, Surfpool, and LiteSVM.
Where should I go next in this section?
Solana Mobile Basics, then MWA, building a mobile dApp, deep links and sessions, Seed Vault, and the dApp Store via Related below.
Related
- Solana Mobile Basics - stack overview and first mobile examples
- Mobile Wallet Adapter (MWA) - authorize, sign, and session API
- Building a Mobile dApp - React Native, Expo, and kit integration
- Deep Links & Session Handling - intents, return paths, auth tokens
- Seed Vault & Security - hardware-backed keys and app threat model
- The dApp Store - packaging, metadata, and distribution
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, Rust 1.91.1, and @solana/kit 7.0.0.