> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meru.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Add a stablecoin wallet to your app — your users hold and send dollars, sign in with email or a passkey, and never touch crypto.

Meru's self-custody SDKs let you add a **stablecoin wallet** to your web or mobile
app. Your users hold and send US-dollar stablecoins, sign in with email or a
passkey, and never see a seed phrase, a network fee, or the word "crypto." You
don't have to be a crypto company to ship it.

<CardGroup cols={2}>
  <Card title="Your users own their money" icon="key">
    Each wallet's key is created on the user's device and never leaves it — not to
    your servers, not to Meru. True self-custody, without the usual friction.
  </Card>

  <Card title="No seed phrases" icon="arrows-rotate">
    Recovery is built in. A new or lost device is restored by signing in again —
    nothing for your users to write down or lose.
  </Card>

  <Card title="No fees for users" icon="gas-pump">
    Meru covers the network fees. Users only ever deal in dollars.
  </Card>

  <Card title="One flow, five platforms" icon="layer-group">
    Web, React Native, Flutter, iOS, and Android share the same three calls:
    sign in → check status → send.
  </Card>
</CardGroup>

## The SDKs

The same wallet on every platform — a user can start on the web and pick up on
their phone.

<CardGroup cols={3}>
  <Card title="Web" icon="js">`@meru.app/react`</Card>
  <Card title="React Native" icon="react">`@meru.app/device-signer`</Card>
  <Card title="Flutter" icon="flutter">`meru_device_wallet`</Card>
  <Card title="iOS · Swift" icon="apple">`MeruDeviceWallet`</Card>
  <Card title="Android · Kotlin" icon="android">`meru-device-wallet`</Card>
</CardGroup>

<Card title="Get started" icon="bolt" href="/self-custody/quickstart">
  Install, sign in, and send — in your platform.
</Card>

## How it works

Three steps, and the SDK handles all three for you:

<Steps>
  <Step title="Your backend prepares the action">
    Your server (running the Meru handler) turns "send \$5" into an action for the
    user to approve.
  </Step>

  <Step title="The device approves it">
    The SDK approves it on the user's device with their local key — the key never
    leaves the device.
  </Step>

  <Step title="Meru settles it">
    Meru covers the fee and completes the transfer. The recipient has the money.
  </Step>
</Steps>

## The two endpoints

Every SDK talks to two places. Keep them straight:

|                  | What it is                                                                                               | Who runs it |
| ---------------- | -------------------------------------------------------------------------------------------------------- | ----------- |
| **Auth base**    | Meru's hosted login (email + passkeys), used with your **public** company app id — no secret.            | Meru        |
| **Backend base** | Your own backend, running the Meru handler; holds your **secret** api-key and serves the wallet actions. | You         |

Signing in returns a short-lived **session token**; the SDK attaches it to every
wallet call for you.

## Where the key lives

| Platform     | Package                   | The key is kept in              | Passkeys |
| ------------ | ------------------------- | ------------------------------- | -------- |
| Web          | `@meru.app/react`         | the browser's secure key store  | ✓        |
| React Native | `@meru.app/device-signer` | iOS Keychain / Android Keystore | ✓        |
| Flutter      | `meru_device_wallet`      | iOS Keychain / Android Keystore | ✓        |
| iOS          | `MeruDeviceWallet`        | iOS Keychain                    | ✓        |
| Android      | `meru-device-wallet`      | Android encrypted storage       | ✓        |

## Under the hood

You never call any of this directly — but if you're curious what powers it:

<Accordion title="The crypto details (optional reading)">
  Balances are USDC on the **Stellar** network. Each wallet is a standard Stellar
  account set up as a **recoverable multi-signature** account: the user's
  device key can spend, and Meru's recovery service can authorize a new device when
  the user signs in elsewhere (this is the SEP-30 standard). Meru pays the network
  fee and submits every transaction, so users never need to hold XLM. The device
  key is an Ed25519 key held in the platform's secure hardware and used only to
  approve transactions your backend prepares — it can't be exported, and neither
  your servers nor Meru ever see it.
</Accordion>
