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

# Bright SDK for MacOS - Integration Guide

> This guide is for developers who want to monetize MacOS applications with Bright SDK.

export const UpdateSDK = ({platform}) => <>
    <AccordionGroup>
      <Accordion title="Option A - Using the Integration CLI Tool (Recommended)">
        <p>Run the tool with the <code>--update</code> flag. It will automatically fetch and replace <code>brdsdk.xcframework</code> in place without losing your config or consent flow settings:</p>

        <p><strong>iOS:</strong></p>
        <pre><code className="language-bash">{`npx github:BrightSDK/bright-sdk-integration --platform ios --update`}</code></pre>

        <p><strong>tvOS:</strong></p>
        <pre><code className="language-bash">{`npx github:BrightSDK/bright-sdk-integration --platform tvos --update`}</code></pre>
      </Accordion>

      <Accordion title="Option B - Manual">
        <h3>Updating in an Xcode Project</h3>
        <ol>
          <li>Download the latest SDK from the Bright SDK Dashboard and unzip it.</li>
          <li>Replace <code>brdsdk.xcframework</code> in its current location (e.g., <code>&lt;MyProject&gt;/Libraries</code>).</li>
          <li>Clean the build folder: Product → Clean Build Folder in Xcode.</li>
        </ol>
        
        <img src="/snippets/image/update_SDK_iOS_1.png" alt="Alt text" width="400" />
        <p>If cleaning doesn't help, clear <code>DerivedData</code>...</p>

        {platform === "ios" && <>
            <h3>Updating in a Unity Project</h3>
            <ol>
              <li>Remove the existing <code>brdsdk.unitypackage</code> asset from Unity Editor.</li>
            </ol>
            <img src="/snippets/image/update_SDK_iOS_2.png" alt="Alt text" width="400" />
            <p>Re-import the new package following <a href="https://docs.bright-sdk.com/integration-guides/ios-tvos#option-b-manual:~:text=Import%20the%20SDK%20Package">Import the SDK Package</a> Step.</p>
          </>}
      </Accordion>
    </AccordionGroup>
  </>;

export const SubmitIntegrationReview = ({platform}) => <>
    <p><strong>Pre-Submission Requirements</strong></p>
    <p>The Bright Data SDK compliance team will verify:</p>
    <ul>
      <li>SDK integration UX and functionality.</li>
      <li>Consent screen implementation.</li>
      <li>Opt-out mechanism.</li>
      <li>User value proposition.</li>
    </ul>

    <ol>
      <li>
        <strong>Submission Process</strong>
        <Note>
          Self-check using an emulator/simulator is not yet supported. Currently, self-check can only be performed on a real device.
        </Note>
        <ol type="a">
          <li>
            <strong>Run Self-Check (takes a few minutes)</strong> — Complete the self-check verification to identify potential issues before submission:
            <ul>
              <li>Navigate to the <a href="https://bright-sdk.com/cp/apps">Bright SDK Dashboard</a> and click your appID.</li>
              <li>Scroll down to "Implementation self-check", click "Get started".</li>
              <li>Install the app on the test device and follow the instructions.</li>
              <li>If the self-check passed successfully, submit it for review!</li>
            </ul>
            <Note>
              <strong>If the SDK isn't initializing / peer not connecting:</strong>
              <ol>
                <li>Verify the correct App ID is used, confirm the SDK service is running.</li>
                <li>Check there aren't multiple SDK apps running from the same IP — that can interfere.</li>
                <li>If nothing helps, check with our team.</li>
              </ol>
            </Note>
          </li>
          <li>
            <strong>Submit for review via Dashboard</strong>
            <ul>
              <li>Navigate to the <a href="https://bright-sdk.com/cp/apps">Bright SDK Dashboard</a>.</li>
              <li>Select your app ID.</li>
              <li>Click "Submit for Review".</li>
              <li>Complete the compliance checklist to validate adherence to guidelines.</li>
              <li>Upload your package.</li>
            </ul>
          </li>
        </ol>
      </li>
      <li>
        <strong>Store submission</strong> — You will be notified by email once your app is approved for release. The app status in the dashboard will also be changed to "Approved".
        {platform !== "ios" && platform !== "macos" && platform !== "android" && <>
            <p>Guides to help you through the store review:</p>
            <ul>
              <li><a href="https://docs.bright-sdk.com/integration-guides/how-to-upload-apps-to-the-lg-store">LG</a></li>
              <li><a href="https://docs.bright-sdk.com/integration-guides/how-to-upload-apps-to-the-samsung-store">Samsung</a></li>
            </ul>
          </>}
      </li>
      <li>
        <strong>Review Resources</strong>
        <ul>
          <li>Watch our <a href="https://www.youtube.com/watch?v=kQCmca0FHyw">guided tour video</a> for critical submission tips.</li>
          <li>Review our <a href="https://bright-sdk.com/blog/monetization-optimization/ensuring-excellence-bright-sdks-guidelines-for-excellent-apps">quality standards</a> for faster approval.</li>
        </ul>
      </li>
    </ol>

    {platform === "ios" && <>
        <p><strong>For iOS/tvOS — How to submit your build:</strong></p>

        <ul>
          <li>Paste a public link in the "Submit for Review" window on the dashboard, OR</li>
          <li>Send via TestFlight to all 4 addresses below (one invite per address):</li>
        </ul>

        <table>
          <thead>
            <tr>
              <th>Email</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td>sdk@brightdata.com</td>
            </tr>
            <tr>
              <td>sdk+1@brightdata.com</td>
            </tr>
            <tr>
              <td>sdk+2@brightdata.com</td>
            </tr>
            <tr>
              <td>sdkcompliance@brightdata.com</td>
            </tr>
          </tbody>
        </table>
      </>}

    <Info>
      We will review each app up to 3 times. 3 rejections or failure to meet minimum quality standards may result in final rejection.
    </Info>
  </>;

export const Tos = ({platform}) => <>
    <p><strong>App Store Privacy Settings</strong></p>

    <p>Bright SDK does not collect any personal information except the user's IP address. Bright Data knows that a certain IP <em>exists</em> but not who owns it or any other information.</p>

    {platform === "ios" && <>
        <p>Your existing privacy settings may already cover this (e.g., if you have ads in your app). If not, update your App Store privacy settings to include at minimum what Bright Data collects:</p>

        <img src="/snippets/image/apple_update_tos_1.png" alt="Alt text" width="400" />
      </>}

    <p><strong>Update Your FAQ and Terms of Service</strong></p>

    <p>Add the following text to your Terms of Service web page (TOS, EULA, or Privacy Policy):</p>

    <p><em>In return for premium features of '[Your App Name]', you may choose to be a peer on the Bright Data network. By doing so, you agree to have read and accepted the <a href="https://bright-sdk.com/eula">Bright SDK EULA</a> and <a href="https://bright-sdk.com/privacy-policy">Bright Data's Privacy Policy</a>.</em></p>

    <p><em>You may opt out of the Bright Data network by [add clear opt-out instructions].</em></p>

    <p><strong>Requirements</strong></p>

    <ul>
      <li>Include all text and links as provided above.</li>
      <li>Any additional Bright SDK-related content must be shared during the app review process for approval.</li>
    </ul>
  </>;

export const CustomConsentWin = ({platform}) => <>
    <Warning>
      <strong>Subject to Bright SDK approval</strong>, you can create and use your own consent screen with Bright SDK. Please follow the following guidelines.
    </Warning>

    <p>This is what it looks like on the default Bright SDK screen:</p>

    <img src="/snippets/image/default_consent_screen.png" alt="Alt text" width="400" />

    <p><strong>Design Requirements:</strong></p>

    <p>Your custom consent screen must comply with the following requirements:</p>

    <ol>
      <li><strong>Mandatory Text -</strong> Your screen must include the following text exactly as written:</li>
    </ol>

      <pre><code className="language-markdown">{`" To [Benefit to user], please allow Web Indexing by Bright Data to use your device's free resources and IP address to download public web data from the Internet.

      Bright Data values your trust and takes every measure possible to protect your privacy and personal data.

      Bright Data understands the security matters at stake in sharing your IP address and monitors all of its network traffic to ensure your safety.

      Bright Data will only use your IP address for approved business-related use cases and never for unauthorized cases.

      None of your personal information is accessed or collected except your IP address."`}</code></pre>

    <ol start="2">
      <li><strong>Additional Required Text</strong></li>
    </ol>

      <pre><code className="language-markdown">{`"Learn more about web indexing by Bright Data
      Learn more about Bright Data’s Privacy Policy
      Bright Data runs in the background even after closing the application.
      Updates will be automatically downloaded by your device from time to time and will be subject to the EULA (End User Level Agreement)"`}</code></pre>

    <Note>
      <strong>Important:</strong> "<a href="https://bright-sdk.com/users#learn-more-about-bright-sdk-web-indexing">Learn more</a>", "<a href="https://bright-sdk.com/privacy-policy">Privacy Policy</a>" and "<a href="https://bright-sdk.com/eula">EULA (End User Level Agreement)</a>" should redirect to the relevant links.
    </Note>

    <ol start="3">
      <li><strong>Interactive Popups -</strong> Clicking on "<em>will only use</em>" → Opens popup:</li>
    </ol>

      <pre><code className="language-markdown">{`"Your IP address WILL be used for cases such as: 
      Support academic research 
      Help brands track sites selling fake products 
      Collect public web data like product prices and reviews 
      Aggregate travel information like flights and hotel prices "`}</code></pre>

    <p>Example:</p>

    <img src="/snippets/image/custom-consent-windows-1.png" alt="Alt text" width="400" />

    <p>Clicking on "never" → Opens popup:</p>

    <pre><code className="language-markdown">{`"Your IP address will NEVER be misused: 

Never to steal, encrypt, or delete sensitive data 
Never to alter or hijack core computing functions 
Never to monitor users' computer activity 
Never to access illegal sites (dark web, porn, etc.) 
Never to perform DDOS attacks "`}</code></pre>

    <p>Example:</p>

    <img src="/snippets/image/custom-consent-windows-2.png" alt="Alt text" width="400" />

    <p><strong>Integration Code:</strong></p>

    {platform === "win" && <>
        <ol>
          <li><strong>Skip Default Consent Screen - </strong>Pass <code>SkipConsent = true</code> in the SDK's initialization method to prevent showing the default consent screen.</li>
          <li><strong>Track Consent Screen Display - </strong>When your external consent screen is displayed, call <code>NotifyShowConsent()</code> method.</li>
          <li><strong>Handle User Response</strong>
            <ul>
              <li>The opt-in button (e.g. "<em>I Agree</em>”) should call <code>ExternalOptIn()</code> method.</li>
              <li>The opt-out button (e.g. "<em>I Disagree</em>”) should call <code>OptOut()</code> method.</li>
            </ul>
          </li>
        </ol>

        <p>Example Custom Screens:</p>

        <img src="/snippets/image/custom-consent-windows-3.png" alt="Alt text" width="400" />
        <br />
        <img src="/snippets/image/custom-consent-windows-4.png" alt="Alt text" width="400" />
      </>}

    {platform === "macos" && <>
        <ul>
          <li>Pass <code>skip_consent: true</code> (or equivalent) in the SDK initializer to prevent the default consent screen from showing.</li>
          <li>The opt-in button (e.g., "I Agree") should call <code>external_opt_in()</code>.</li>
          <li>The opt-out button (e.g., "I Disagree") should call <code>opt_out()</code>.</li>
          <li>After presenting your custom screen, call <code>consent_shown()</code>.</li>
        </ul>
      </>}
  </>;

export const OptInOut = ({platform}) => <>
    <Danger>
      The user must always be able to opt out of Bright SDK after giving their initial consent.
    </Danger>

    <p>Your app must include a settings option allowing users to opt in or out at any time. This is typically placed in a Settings menu.</p>

    <p><strong><u>Requirements:</u></strong></p>
    <ul>
      <li>Add a toggle/switch labeled "Web Indexing" that clearly reflects the current status (opted in or out).</li>
      <li>Below the switch, add text emphasizing the value users receive when opting in. (<a href="h#add-opt-in/out-settings-option:~:text=Value%20text%20suggestions%3A">see examples</a>)</li>
      
      <li>Include a "Learn more" link that opens: <a href="https://bright-sdk.com/users#learn-more-about-bright-sdk-web-indexing">https://bright-sdk.com/users#learn-more-about-bright-sdk-web-indexing</a>.</li>
    </ul>
    <Note>
  Every time the user toggles Web Indexing <strong>ON</strong>, the consent screen must reappear — regardless of any previous opt-in.
</Note>

    {platform === "ios" && <>
        <p><strong><u>Implementation:</u></strong></p>
        <ul>
          <li>Use <code>get_choice()</code> to get the current status for the switch/checkbox.</li>
          <li>When the user disables the switch → call <code>opt_out()</code>.</li>
          <li>When the user enables the switch → call <code>show_consent()</code> (the user must actively opt in through the consent screen).</li>
          <li>Use the <code>on_choice_change</code> callback to keep the UI automatically updated.</li>
        </ul>
      </>}

    {platform === "macos" && <>
        <p><strong><u>Implementation:</u></strong></p>
        <ul><li>Set the initial checkbox state based on the current SDK choice:</li></ul>
        <pre><code>{`bright_sdk_checkbox.state = (sdk?.choice == .peer) ? .on : .off`}</code></pre>
        <ul><li>Add control logic for the checkbox:</li></ul>
        <pre><code>{`@IBOutlet weak var bright_sdk_checkbox: NSButton!

@IBAction func bright_sdk_checkbox_action(_ sender: NSButton) {
    if bright_sdk_checkbox.state == NSControl.StateValue.off {
        bright_sdk_checkbox.state = .off
        sdk?.opt_out()
    } else {
        bright_sdk_checkbox.state = .on
        show_bright_sdk()
    }
}`}</code></pre>
      </>}

    <Note>
      There is no way to directly opt in. Only the user can decide. You must show the consent screen — opt-in happens automatically only if the user agrees.
    </Note>

    <p><strong><u>Value text suggestions:</u></strong></p>
    <table>
      <thead>
        <tr><th>State</th><th>Example text</th></tr>
      </thead>
      <tbody>
        <tr><td><code>Opted out</code></td><td>"Enable to see fewer ads"</td></tr>
        <tr><td><code>Opted out</code></td><td>"Enable to get 100 extra coins"</td></tr>
        <tr><td><code>Opted out</code></td><td>"Enable to enjoy premium features"</td></tr>
        <tr><td><code>Opted in</code></td><td>"When enabled you see fewer ads"</td></tr>
        <tr><td><code>Opted in</code></td><td>"When enabled you get 100 extra coins"</td></tr>
      </tbody>
    </table>

    <p>Refrain from using technical terms like "opt in" / "opt out" — always speak in terms of user value.</p>

    <p>You may add a confirmation dialog to discourage opting out (e.g., <em>"If you disable Web Indexing, you will start seeing ads. Continue?"</em>), and a confirmation message after opting out (e.g., <em>"Web Indexing disabled. You can re-enable it anytime from Settings."</em>)</p>

    <p><strong><u>Common mistakes to avoid:</u></strong></p>
    <table>
      <thead>
        <tr>
          <th>Issue</th>
          <th>Guidance</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Label reads "Bright" or "Bright SDK"</td>
          <td>Label must read "Web Indexing"</td>
        </tr>
        <tr>
          <td>No value text</td>
          <td>Always include text describing what the user gains</td>
        </tr>
        <tr>
          <td>No "Learn more" link</td>
          <td>Required — must link to the URL above</td>
        </tr>
        <tr>
          <td>Switch doesn't reflect current state</td>
          <td>Switch must always show the true current status</td>
        </tr>
      </tbody>
    </table>
  </>;

### Requirements

* macOS 10.15 or newer.
* Xcode (latest recommended).
* Bright SDK for macOS ([latest](https://bright-sdk.com/cp/docs/sdk/macos)).

### Important Notes

* Users **must always** voluntarily decide to opt in after seeing the consent screen, and **must always** have an easy way to opt out.
* Bright Data **reviews** SDK integration after initial release and regularly thereafter. Your account will be **terminated** if you violate the guidelines in this document.
* App Sandbox is **not supported**. If your app has the sandbox entitlement enabled, the SDK will **not function**.
* Bright Data recommends offering value in exchange for opting in (e.g., fewer ads, bonus coins, premium features). However, simply asking for user support is also acceptable.

<Steps>
  <Step title="Create App ID on Dashboard" titleSize="h3">
    If you haven't done this yet, log in to [your dashboard](https://bright-sdk.com/cp/apps) and create your app ID first.
  </Step>

  <Step title="Install SDK Files" titleSize="h3">
    You can set up the Bright SDK framework in your macOS app in two ways:

    * [**Using the Bright SDK Integration CLI Tool**](https://brightsdk.github.io/bright-sdk-integration/) <Badge color="green">Recommended</Badge> - automatically downloads the SDK, extracts the framework, and patches your Xcode project with the necessary references, copy phases, build settings, and re-sign script.
    * **Manually** - download the SDK from the dashboard, unzip it, and copy the files yourself.

    Either way, you will still need to add the SDK initialization code to your app.

    <AccordionGroup>
      <Accordion title={<span>Option A - Using the Integration CLI Tool <Badge color="green" size="md">Recommended</Badge></span>}>
        Run the tool using the [`bright-sdk-integration`](https://brightsdk.github.io/bright-sdk-integration/) CLI. See the [Apple example](https://github.com/BrightSDK/bright-sdk-integration-example-apple) for full setup instructions.

        The tool will:

        * Download the latest BrightSDK zip from `cdn.bright-sdk.com/static/`.
        * Extract `brdsdk.framework` and `net_updater.app` into `BrightSDK/`.
        * Patch your `project.pbxproj` — adding `brdsdk.framework` and `net_updater.app` with Embed & Sign, setting `FRAMEWORK_SEARCH_PATHS` and `LD_RUNPATH_SEARCH_PATHS`.
        * Add a Copy Files build phase placing `net_updater.app` under `Contents/Library/LoginItems`.
        * Add a Resign run-script build phase using `resign_net_updater.sh`.
        * Set build settings: `NET_UPDATER_ENTITLEMENTS` and `ENABLE_USER_SCRIPT_SANDBOXING = NO`.
        * Save `brd_sdk.config.json` for future runs.

        Once the tool completes, skip to [Step 3 - Integrate Bright SDK](#integrate-bright-sdk).
      </Accordion>

      <Accordion title="Option B - Manual">
        Download the latest Bright SDK using the [Bright SDK downloader](https://brightsdk.github.io/bright-sdk-downloader-rs/). Unzip it.

        **SDK Structure**

        ```text theme={null}
        brdsdk.framework
        net_updater.app
        net_updater.entitlements
        resign_net_updater.sh
        ```

        **SDK Overview**

        | Component                  | Description                                                              |
        | :------------------------- | :----------------------------------------------------------------------- |
        | `brdsdk.framework`         | SDK control API                                                          |
        | `net_updater.app`          | SDK background control service                                           |
        | `net_updater.entitlements` | Entitlements file required for re-signing `net_updater`                  |
        | `resign_net_updater.sh`    | Script used in build phases to re-sign `net_updater` for your Apple team |

        <Warning>
          Before using `brdsdk.framework` and `net_updater.app`, additional Xcode project configuration steps are required — see [Project Setup](https://docs.bright-sdk.com/integration-guides/mac-os#option-b-manual:~:text=Integrate%20Bright%20SDK-,Project%20Setup,-Add%20the%20Framework).
        </Warning>
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step title="Integrate Bright SDK" titleSize="h3">
    <Steps>
      <Step title="Project Setup">
        <Note>
          **CLI Tool users:** `brdsdk.framework` and `net_updater.app` are already added and fully configured - skip to [Import the SDK](https://docs.bright-sdk.com/integration-guides/mac-os#option-b-manual:~:text=will%20not%20function.-,Import%20the%20SDK,-In%20your%20AppDelegate).
        </Note>

        **Add the Framework and Service to Your Target**

        1. In Xcode, select your target and navigate to the **General** tab.
        2. In the **Frameworks, Libraries, and Embedded Content** section, add both `brdsdk.framework` and `net_updater.app`.

        <img src="https://mintcdn.com/brightdata-31a14106/fRd2uyOP9kFLhsBw/integration-guides/image/macos_integrate_bright_SDK_1.png?fit=max&auto=format&n=fRd2uyOP9kFLhsBw&q=85&s=6fab3593ca16f2458eadd695bd2e20a3" alt="Alt text" width="400" data-path="integration-guides/image/macos_integrate_bright_SDK_1.png" />

        3. Both items will now appear in the project structure.

        <img src="https://mintcdn.com/brightdata-31a14106/fRd2uyOP9kFLhsBw/integration-guides/image/macos_integrate_bright_SDK_2.png?fit=max&auto=format&n=fRd2uyOP9kFLhsBw&q=85&s=b458da65699ea4d03c866d91ec7992e1" alt="Alt text" width="400" data-path="integration-guides/image/macos_integrate_bright_SDK_2.png" />

        **Configure net\_updater Copy Location**

        1. Navigate to **Build Phases**.
        2. In the **Copy Bundle Resources** section, remove `net_updater`.

        <img src="https://mintcdn.com/brightdata-31a14106/fRd2uyOP9kFLhsBw/integration-guides/image/macos_integrate_bright_SDK_3.png?fit=max&auto=format&n=fRd2uyOP9kFLhsBw&q=85&s=1c90871c6803accf2ce0c3af8957602e" alt="Alt text" width="400" data-path="integration-guides/image/macos_integrate_bright_SDK_3.png" />

        3. Add a new **Copy Files** build phase:
           * Set **Destination** to `Wrapper`.
           * Set **Subpath** to `Contents/Library/LoginItems`.
           * Add `net_updater` to this phase.
                     <img src="https://mintcdn.com/brightdata-31a14106/fRd2uyOP9kFLhsBw/integration-guides/image/macos_integrate_bright_SDK_4.png?fit=max&auto=format&n=fRd2uyOP9kFLhsBw&q=85&s=08eea318dad31d11ba97905985110233" alt="Alt text" width="400" data-path="integration-guides/image/macos_integrate_bright_SDK_4.png" />

        **Add Supporting Files**

        * Copy `net_updater.entitlements` and `resign_net_updater.sh` into your project folder.
        * These files do not need to be added to any Xcode target.
        * `net_updater.entitlements` must be placed under the `${PROJECT_DIR}` path.

        **Configure Build Settings**

        In the **Build Settings** tab of your main app target, create a custom setting:

        * **Key:** `NET_UPDATER_ENTITLEMENTS`
        * **Value:** Path to `net_updater.entitlements` relative to `${PROJECT_DIR}`
        * Set `ENABLE_USER_SCRIPT_SANDBOXING` to `NO`

        **Add Re-sign Build Phase**

        * Add a **Run Script** build phase after the `net_updater` copy phase (e.g., name it `"Resign net_updater"`).
        * Assign `resign_net_updater.sh` as its content (or paste the script contents directly).

        <img src="https://mintcdn.com/brightdata-31a14106/fRd2uyOP9kFLhsBw/integration-guides/image/macos_integrate_bright_SDK_5.png?fit=max&auto=format&n=fRd2uyOP9kFLhsBw&q=85&s=aa4945ac6a398a14225d1eea02db13ad" alt="Alt text" width="400" data-path="integration-guides/image/macos_integrate_bright_SDK_5.png" />

        <Warning>
          App Sandbox is not supported. If your app has the sandbox entitlement, the SDK will not function.
        </Warning>
      </Step>

      <Step title="Import the SDK">
        In your `AppDelegate.swift`, import the Bright SDK:

        ```swift theme={null}
        import Cocoa
        // ... other imports ...
        import brdsdk
        ```
      </Step>

      <Step title="Initialize the SDK">
        Initialize the SDK once in your `AppDelegate`, typically inside `applicationDidFinishLaunching`. Create a dedicated setup function (e.g., `start_bright_sdk`) to keep initialization clean. Should be invoked only once.

        ```swift theme={null}
        @NSApplicationMain
        class AppDelegate: NSObject, NSApplicationDelegate {

            var sdk: brd_api?

            func applicationDidFinishLaunching(_ aNotification: Notification) {
                // ...
                try? start_bright_sdk()
                // ...
            }

            func start_bright_sdk() throws {
                sdk = try brd_api(campaign: nil,
                                 on_choice_change: { [weak self] new_choice in
                    // Handle user selection
                    switch new_choice {
                        case .peer:
                            // e.g. update local settings — SDK enabled
                            myapp.options.set_bright_sdk_enabled()
                        case .notPeer:
                            // e.g. start a subscription process
                            start_subscription_process()
                        case .none:
                            // e.g. update local settings — SDK disabled
                            myapp.options.set_bright_sdk_disabled()
                    }
                })
                show_bright_sdk()
            }

            func show_bright_sdk() {
                sdk?.show_consent(force: true, on_choice: { _ in })
            }
        }
        ```
      </Step>
    </Steps>
  </Step>

  <Step title="Add Opt-In/Out Settings Option" titleSize="h3">
    <OptInOut platform="macos" />
  </Step>

  <Step title="Custom Consent Screen (optional)" titleSize="h3">
    <CustomConsentWin platform="macos" />
  </Step>

  <Step title="App Performance" titleSize="h3">
    We prioritize user experience. Ensure your app maintains good performance.

    Performance Guidelines:

    1. ✅ No input lag - ensure responsive UI interactions.
    2. ✅ Average CPU load: ≤ 50%.
    3. ✅ RAM usage: ≤ 90%.

    <Note>
      **Important:** If system load is too high, we cannot use the device's free resources. Such devices will not be counted as active and will not generate revenue.
    </Note>
  </Step>

  <Step title="Verify Your Integration" titleSize="h3">
    Before submitting, verify that the SDK is running correctly on your device:

    1. Compile and run your app, then click **"I Agree"** in the SDK consent dialog.
    2. Open a terminal and run:
       ```shell theme={null}
       ps -ef | grep [n]et_
       ```
       You should see 1 process running from inside your app directory: `net_updater`.
    3. Navigate to:
       ```text theme={null}
       /Users/{USER}/Library/Group Containers/<team_id>.com.brdsdk.shared
       ```
    4. Look for the `cid` file matching your Bundle ID. It should look similar to:
       ```text theme={null}
       10.59.36.4-ccaa3e53/ls17c2p443_10.59.36.4_60015
       ```

    <Note>
      **If the SDK isn't initializing / peer not connecting:**

      1. Verify the correct App ID is used, confirm the SDK service is running.
      2. Check there aren't multiple SDK apps running from the same IP — that can interfere.
      3. If nothing helps, check with our team.
    </Note>
  </Step>

  <Step title="Update Your Terms of Service" titleSize="h3">
    <Tos />
  </Step>

  <Step title="Submit Your Integration for Review" titleSize="h3">
    <SubmitIntegrationReview platform="macos" />
  </Step>

  <Step title="How to Update the SDK" titleSize="h3">
    <UpdateSDK />
  </Step>

  <Step title="API Documentation" titleSize="h3">
    To be updated
  </Step>
</Steps>
