Cavos

Embedded Stellar Wallet

A device-native, self-custodial embedded wallet for Stellar. The signing key is created and used on the user's device — Cavos cannot see it, cannot sign with it, and cannot move funds. Available via @cavos/kit for web and @cavos/kit/react-native for mobile (Expo Development Builds, EAS, or bare React Native — Expo Go is not supported).

In the browser, the device key is a non-extractable P-256 key stored via WebCrypto. On React Native, it uses the OS keystore. These platform primitives provide the hardware-backed isolation — the SDK does not enforce non-extractability on Node or other server runtimes.

Account model

Cavos provisions a classic G… Stellar account — not a Soroban contract. It's the same address format that wallets, exchanges, and every Stellar tool already understands.

  • A control key (weight 1) signs transactions. Its seed is sealed on-chain in the account's data entries (cv:ct).
  • Each device holds an ECDH key that unwraps its own slot to obtain the control key — signing is silent and local.
  • Passkey: On Stellar, the passkey is a WebAuthn PRF that unwraps the data-encryption key (DEK) for the control key. This is not 2FA — anyone with the synced passkey (via iCloud Keychain or Google Password Manager) can spend. A synced passkey recovers the G… wallet.

Install

npm install @cavos/kit

Connect and execute

Use Cavos.connect with chains: ["stellar"]. Connect never creates the account — it's created lazily on first execute. You can call execute when status is "undeployed" or "ready". Only "needs-device-approval" blocks execution.

import { Cavos } from "@cavos/kit";

const session = await Cavos.connect({
  chains: ["stellar"],
  defaultChain: "stellar",
  network: "mainnet",
  identity: { userId: user.id, email: user.email },
  appSalt: "my-app",
  appId: process.env.NEXT_PUBLIC_CAVOS_APP_ID,
});

const wallet = session.wallet("stellar");

// Execute when undeployed OR ready
if (wallet.status !== "needs-device-approval") {
  const hash = await wallet.execute(
    10_000_000n,  // 1 XLM in stroops
    "GDESTINATION...ADDRESS"
  );
}

What you get

Self-custodial

Cavos never holds a key that can move user funds. The on-chain account is the sole authority over signers.

Classic G… address

Standard Stellar address format compatible with all exchanges, wallets, and ecosystem tools.

Gasless transactions

The Cavos relayer sponsors account reserves and pays transaction fees — users hold no XLM to get started.

Soroban support

The account can invoke Soroban contracts and satisfy require_auth for on-chain apps like escrows.

Passkey + recovery

WebAuthn PRF passkey for device approval (note: on Stellar it unwraps the spending key, not 2FA). Recovery codes as offline backup.

Lazy deploy

Connect derives the address immediately. The on-chain account is created on first execute, atomically.

Start building on Stellar.

Follow the quickstart to reach a sponsored transaction.

We use anonymous analytics to understand how developers use Cavos. No personal data is collected. Privacy Policy