{#if flow?.state.step === 'info'}
{$_('register.migrateTitle')}

{$_('register.migrateDescription')}

{$_('register.migrateLink')} →
{/if}

Create Passkey Account

{getSubtitle()}

{#if flow?.state.error}
{flow.state.error}
{/if} {#if loadingServerInfo || !flow}

Loading...

{:else if flow.state.step === 'info'}
{#if flow.info.handle.includes('.')}

Custom domain handles can be set up after account creation.

{:else if fullHandle()}

Your full handle will be: @{fullHandle()}

{/if}
Contact Method

Choose how you'd like to verify your account and receive notifications.

{#if flow.info.verificationChannel === 'email'}
{:else if flow.info.verificationChannel === 'discord'}

Your numeric Discord user ID (enable Developer Mode to find it)

{:else if flow.info.verificationChannel === 'telegram'}
{:else if flow.info.verificationChannel === 'signal'}

Include country code (e.g., +1 for US)

{/if}
Identity Type

Choose how your decentralized identity will be managed.

{#if flow.info.didType === 'web'}
Important: Understand the trade-offs
  • Permanent tie to this PDS: Your identity will be did:web:yourhandle.{serverInfo?.availableUserDomains?.[0] || 'this-pds.com'}.
  • No recovery mechanism: Unlike did:plc, did:web has no rotation keys.
  • We commit to you: If you migrate away, we will continue serving a minimal DID document.
  • Recommendation: Choose did:plc unless you have a specific reason to prefer did:web.
{/if} {#if flow.info.didType === 'web-external'}

You'll need to serve a DID document at https://{flow.info.externalDid ? extractDomain(flow.info.externalDid) : 'yourdomain.com'}/.well-known/did.json

{/if}
{#if serverInfo?.inviteCodeRequired}
{/if}
Why passkey-only?

Passkey accounts are more secure than password-based accounts because they:

  • Cannot be phished or stolen in data breaches
  • Use hardware-backed cryptographic keys
  • Require your biometric or device PIN to use
{:else if flow.state.step === 'key-choice'} {:else if flow.state.step === 'initial-did-doc'} flow?.goBack()} /> {:else if flow.state.step === 'creating'} {#await flow.createPasskeyAccount()}

Creating your account...

{/await} {:else if flow.state.step === 'passkey'}

A friendly name to identify this passkey

Click the button below to create your passkey. You'll be prompted to use:

  • Touch ID or Face ID
  • Your device PIN or password
  • A security key (if you have one)
{:else if flow.state.step === 'app-password'} {:else if flow.state.step === 'verify'} {:else if flow.state.step === 'updated-did-doc'} flow?.activateAccount()} /> {:else if flow.state.step === 'redirect-to-dashboard'}

Redirecting to dashboard...

{/if}