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

# Choose an SDK

> Choose the Pushctl SDK for native Android, native iOS, Capacitor, or Laravel.

<CardGroup cols={2}>
  <Card title="Android" icon="android" href="/sdks/android/quickstart">Native Android 6.0+ apps using Kotlin or Java and Firebase Cloud Messaging.</Card>
  <Card title="iOS" icon="apple" href="/sdks/ios/quickstart">Native iOS 15+ apps using Swift, Swift Package Manager, or CocoaPods.</Card>
  <Card title="Capacitor" icon="mobile" href="/sdks/capacitor/quickstart">Capacitor 7 and 8 apps with one TypeScript API over both native SDKs.</Card>
  <Card title="Laravel" icon="laravel" href="/sdks/laravel/quickstart">Laravel 12 and 13 backends using the notification channel or direct sending.</Card>
</CardGroup>

## Token rules

| SDK       | Token preset | Safe location                        |
| --------- | ------------ | ------------------------------------ |
| Android   | Client       | App build configuration              |
| iOS       | Client       | App build configuration              |
| Capacitor | Client       | Native app build configuration       |
| Laravel   | Server send  | Server environment or secret manager |

<Warning>
  Mobile application packages can be inspected. A Client token cannot send notifications; a Server send token can. Never swap them for convenience.
</Warning>

## Shared client behavior

The Android, iOS, and Capacitor SDKs register an installation, update permission and identity state, and report `received`, `displayed`, `opened`, and `dismissed` events. Use the same stable external user ID across platforms.

<Warning>
  Notification permission does not mean the installation is ready. Before disabling another notification provider, wait until Pushctl confirms registration with its API. Use `waitForRegistration` and check `isRegistered` where the SDK exposes it.
</Warning>
