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

# Passkeys

> Control a smart account with WebAuthn credentials and device biometrics.

Choose passkeys for consumer apps that should use Face ID, Touch ID, Windows Hello, or another WebAuthn authenticator instead of a seed phrase. The authenticator keeps the private key on the user's device.

## Create a passkey owner

Create the WebAuthn credential in a browser, convert it to a Viem account, and pass it as the owner:

```ts theme={null}
import {
  createWebAuthnCredential,
  toWebAuthnAccount,
} from 'viem/account-abstraction'

const credential = await createWebAuthnCredential({
  name: 'Your app',
})
const passkeyOwner = toWebAuthnAccount({ credential })

const account = await rhinestone.createAccount({
  owners: {
    type: 'passkey',
    accounts: [passkeyOwner],
  },
})
```

Here, `rhinestone` is a configured `RhinestoneSDK` instance. Do not put an API key in browser code; route SDK requests through your backend or use an appropriate client authentication flow.

Store `credential.id` and `credential.publicKey` so you can reconstruct the Viem account with `toWebAuthnAccount`. Creating another credential changes the smart account configuration and can change its address.

<Note>
  Passkey availability and synchronization depend on the browser, operating system, authenticator, and relying-party domain. Plan a recovery path instead of assuming a passkey will sync to every device.
</Note>

## Use more than one passkey

Use [multisig](/wallets/custom-signer/account-setup/native-signers/multisig) for a passkey-per-device setup or when several passkeys must approve a transaction. Use [multi-factor authentication](/wallets/custom-signer/account-setup/native-signers/multi-factor-authentication) to combine a passkey with another validator type.

## Manage passkeys

Use the SDK actions to change an account after deployment:

* [`addOwner`](/wallets/custom-signer/sdk-reference/actions/passkeys/add-owner)
* [`removeOwner`](/wallets/custom-signer/sdk-reference/actions/passkeys/remove-owner)
* [`changeThreshold`](/wallets/custom-signer/sdk-reference/actions/passkeys/change-threshold)
