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

# SDK overview

> Compare the PNLight Swift, React Native, and Flutter SDKs, pick the one for your app stack, and review the core features each SDK supports on iOS.

Install PNLight in the app so it can identify users, send attribution and optional in-app events, and request Remote UI configs.

## Supported SDKs

<Columns cols={3}>
  <Card title="Swift" icon="apple" href="/sdk/ios-swift">
    Native iOS apps. Requires iOS 13.0+ and Swift 5.7+.
  </Card>

  <Card title="React Native" icon="smartphone" href="/sdk/react-native">
    React Native iOS apps. Package: `@pnlight/sdk-react-native`.
  </Card>

  <Card title="Flutter" icon="smartphone" href="/sdk/flutter">
    Flutter iOS apps. Package: `pnlight_sdk`.
  </Card>
</Columns>

## SDK package links

<Columns cols={3}>
  <Card title="Swift package" icon="github" href="https://github.com/pnlight-dev/sdk-swift">
    Open the Swift Package Manager repository.

    ![Swift SDK version](https://img.shields.io/github/v/tag/pnlight-dev/sdk-swift?label=Swift%20SDK\&sort=semver)
  </Card>

  <Card title="React Native package" icon="package" href="https://www.npmjs.com/package/@pnlight/sdk-react-native">
    Open the npm package page.

    ![React Native SDK version](https://img.shields.io/npm/v/%40pnlight%2Fsdk-react-native?label=React%20Native)
  </Card>

  <Card title="Flutter package" icon="package" href="https://pub.dev/packages/pnlight_sdk">
    Open the pub.dev package page.

    ![Flutter SDK version](https://img.shields.io/pub/v/pnlight_sdk?label=Flutter)
  </Card>
</Columns>

## What the SDK does

* Initializes PNLight with the project SDK token.
* Creates or returns a stable user ID.
* Reports first installs and repeat app opens.
* Sends optional in-app events.
* Sends attribution data from providers such as AppsFlyer.
* Requests and renders Remote UI.

<Note>
  The current public SDK packages are iOS-focused. If your app targets multiple platforms, gate PNLight calls so unsupported platforms do not execute iOS-only code.
</Note>

## Recommended integration order

<Steps>
  <Step title="Initialize the SDK">
    Call initialization once during app startup.
  </Step>

  <Step title="Confirm user identity">
    Read the SDK user ID and use it consistently with attribution and Remote UI flows.
  </Step>

  <Step title="Send attribution">
    Send attribution data after AppsFlyer or another provider returns conversion data.
  </Step>

  <Step title="Update IDFA after ATT">
    If the app asks for App Tracking Transparency permission after PNLight initialization, call `updateIdfa()` after the prompt completes.
  </Step>

  <Step title="Add Remote UI">
    Render a placement and handle custom actions from the returned UI.
  </Step>
</Steps>
