Seeker Connect
    Preparing search index...

    Seeker Connect

    Seeker Connect

    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:

    1. Web (js/) — custom Wallet Standard implementation over the low-level MWA protocol package. (Shipping.)
    2. Android Kotlin (android/) — Kotlin-native client over MWA clientlib, local WebSocket transport, Compose UI. See android/seeker-connect.
    3. React Native (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.

    • Legacy-MWA dependency is isolated behind an internal per-platform port (working name 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.
    • Nostr relay transport is the primary connection path. Local WebSocket is a post-MVP fallback; the custom reflector protocol is not used at all.
    • Automated tests are the release gate — protocol-level tests (no Android) plus emulator E2E against Mock Wallet — not manual QA.
    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.