A dapp-only SDK that gives a tighter, branded, direct connect experience for a Solana Mobile certified device's own wallet (Seeker is the first such device), built on top of — not replacing — the official Mobile Wallet Adapter (MWA) libraries.
Where generic MWA centers on a "pick a wallet" chooser, Seeker Connect skips that disambiguation in favor of Seeker-Connect-owned UI and copy, using the MWA spec's existing Endpoint-specific URI (Android App Link) mechanism. It is a UX/DX layer, not a protocol reimplementation.
A live example dapp is deployed from js/examples/example-web:
https://solana-mobile.github.io/seeker-connect/example-web/
The web SDK ships as four npm packages under @solana-mobile/seeker-connect-*:
| Package | Purpose |
|---|---|
@solana-mobile/seeker-connect-wallet-standard |
Wallet Standard implementation — the entry point most dapps use. |
@solana-mobile/seeker-connect-web |
Imperative web SDK for dapps not using Wallet Standard. |
@solana-mobile/seeker-connect-ui |
Seeker-Connect-owned UI (Lit): connect button, progress overlay, error dialogs. |
@solana-mobile/seeker-connect-core |
Platform-agnostic contracts, shared types, and error taxonomy. |
Most dapps depend only on @solana-mobile/seeker-connect-wallet-standard, which
pulls in -web, -ui, and -core transitively.
React Native apps use
@solana-mobile/seeker-connect-react-native,
a native module over the Android SDK.
The generated API reference
covers all four packages and is rebuilt from main on every push.
npm install @solana-mobile/seeker-connect-wallet-standard
Discovering a Wallet Standard wallet also needs the standard registry helpers, which most Solana dapps already have:
npm install @wallet-standard/app @wallet-standard/features
import { registerSeekerConnect } from '@solana-mobile/seeker-connect-wallet-standard';
import { getWallets } from '@wallet-standard/app';
import { StandardConnect } from '@wallet-standard/features';
// 1. Register Seeker Connect into the page's Wallet Standard registry.
registerSeekerConnect({
identity: { name: 'My Dapp', uri: window.location.origin, icon: '/icon.png' },
relayDomain: '<relay-domain>',
});
// 2. Discover it like any other Wallet Standard wallet.
const wallet = getWallets()
.get()
.find((w) => w.name === 'Seeker Connect');
// 3. Connect — launches the wallet for user consent on first connect.
const { accounts } = await wallet.features[StandardConnect].connect();
console.log('connected as', accounts[0]?.address);
"Connected" means the dapp holds a wallet-issued authorization token — there is no long-lived transport. Each interaction (authorize, sign) runs in its own short-lived MWA session and silently reauthorizes with the cached token, so the user is not re-prompted for consent.
For the full end-to-end walkthrough — auto-discovery, connect/sign flows, the
imperative -web path, configuration, and the error taxonomy — see the
web integration guide.
Three dapp-side targets:
js/) — custom Wallet Standard implementation over the low-level MWA protocol package. (Shipping.)android/) — Kotlin-native client over MWA clientlib, local WebSocket transport, Compose UI. See android/seeker-connect.js/packages/react-native) — native module over the Android Kotlin SDK, with its Compose UI. For now, React Native 0.81+ / Expo 54+. See js/packages/react-native.seeker-connect/
├── js/ JS/TS monorepo (web + React Native) — pnpm workspaces + Turborepo + vitest
│ ├── packages/
│ │ ├── core/ SeekerLink port, shared types, error taxonomy, contract-test suite
│ │ ├── wallet-standard/ Wallet Standard implementation — the first MVP
│ │ ├── ui/ Seeker-Connect-owned UI (Lit): progress overlay + error dialogs
│ │ ├── web/ imperative web SDK for dapps not using Wallet Standard
│ │ └── react-native/ React Native native module over the Android SDK
│ └── examples/
│ └── example-web/ Vite + React demo consuming Wallet Standard directly,
│ plus the browser E2E harness (`pnpm e2e`)
└── android/ Android Kotlin SDK (Gradle)
├── seeker-connect-core/ plain-Kotlin client, SeekerLink port, error taxonomy, contract-test suite
├── seeker-connect/ Android SDK: MWA clientlib adapter, wallet pre-check, auth cache
├── seeker-connect-compose/ Seeker-Connect-owned UI (Compose): progress/error cards, connect button
└── example/ Compose demo app
The Wallet Standard package is non-negotiable: whatever other entry points ship, a Wallet-Standard-compatible package is always provided.
SeekerLink), so the eventual swap to the not-yet-built
mwa-core (Kotlin Multiplatform) rewrite is a contained change. A shared
contract-test suite guards that boundary.cd js
corepack pnpm install
corepack pnpm build
corepack pnpm test # protocol-level + unit suites (no browser, no Android)
corepack pnpm lint
corepack pnpm format:check
corepack pnpm docs:build # API reference → js/dist/api
Browser E2E (real Chromium via agent-browser; fake wallet over a real Nostr relay — requires network access to the relay):
cd js/examples/example-web
corepack pnpm e2e
The example app itself: corepack pnpm dev in js/examples/example-web
(config via URL params — see src/config.ts).
Apache-2.0.