# Choose an Integration

Compare the browser extension SDK and the mobile WalletConnect integration, and decide which to support.

Joey runs as a **browser extension** on desktop and as a **mobile app** on iOS and Android. They connect to your app in different ways, and most dApps should support both.

| | Browser extension | Mobile app |
|---|---|---|
| Package | [`@joeywallet/wallet-sdk`](/docs/browser-extension) | [`@joey-wallet/wc-client`](/docs/integration/install), or any WalletConnect setup |
| Transport | Provider injected into the page (`window.xrpl.joey`), plus Wallet Standard and CAIP-294 discovery | WalletConnect v2 relay, via QR code or deep link |
| Setup | Install the package. No keys or backend config. | A Reown project ID |
| Runtime dependencies | None | The WalletConnect stack |
| Where users are | Desktop Chrome and other Chromium browsers | Phones, or desktop users who pair by QR code |
| Signing calls | `signTransaction`, `signAndSubmitTransaction`, `signTransactionFor`, `signTransactionBulk`, `signIn` | `xrpl_signTransaction`, `xrpl_signTransactionFor`, `xrpl_signTransactionBulk` |
| Submitting | Separate sign-only and sign-and-submit methods | `submit` defaults to `true` |
| Sign-in | `signIn()`: a CAIP-122 message, or a challenge transaction for Ledger accounts | Sign-in challenge v1 in the WalletConnect session |
| Errors | `JoeyRpcError` with EIP-1193 codes | WalletConnect and JSON-RPC errors |

> [!NOTE]
> The two npm packages have different scopes: **`@joeywallet/`**`wallet-sdk` for the extension and **`@joey-wallet/`**`wc-client` for WalletConnect.

## Which should I use?

- **Desktop web app:** support the extension with the SDK. There's no QR step and nothing to configure.
- **Mobile web, or desktop users without the extension:** offer WalletConnect.
- **Both (recommended):** detect the extension first and fall back to WalletConnect.

```ts
import { isJoeyAvailable, getJoey } from '@joeywallet/wallet-sdk'

if (isJoeyAvailable()) {
  const joey = getJoey()!
  await joey.connect()
} else {
  // Offer WalletConnect (wc-client's actions.connect()) or an install link
}
```

## Things that differ

- **Keys and settings are separate.** The extension and the mobile app don't sync. A user who imports the same recovery phrase into both gets the same addresses, but connected sites and settings are separate.
- **The extension doesn't speak WalletConnect.** Pairing the extension over WalletConnect isn't supported yet.
- **Bulk failure details.** If a bulk submit partly fails, the extension returns an object with per-entry results, while mobile returns a JSON string with `failedIndex` and the signed transactions. Only `failedIndex` means the same thing in both.
