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

# Native (iOS & Android)

> Connect from a native mobile app using the LiveKit iOS or Android SDKs.

Equos rooms run on [LiveKit](https://livekit.io), so a native iOS or Android app can join a conversation using the official LiveKit SDKs—no Equos-specific mobile SDK required.

Your backend still creates the conversation the same way ([see Backend](/integration/backend)); the client just uses a different library to connect to the returned room.

<Note>
  Equos doesn't currently ship a dedicated mobile SDK, but the official LiveKit SDKs give you everything you need to render the character's video and send microphone audio.
</Note>

***

## The fields you need

From the backend response, forward these to your mobile app:

* `conversation.serverUrl` — the LiveKit WebSocket URL
* `consumerAccessToken` — the short-lived JWT the user connects with
* `conversation.character.livekitIdentity` — the character's participant identity (useful for filtering remote tracks)

***

## iOS (Swift)

Install the LiveKit Swift SDK:

```
https://github.com/livekit/client-sdk-swift
```

Connect and attach the character's video track:

```swift theme={null}
import LiveKit

let room = Room()
try await room.connect(
    url: conversation.serverUrl,
    token: consumerAccessToken
)

// Enable the user's microphone
try await room.localParticipant.setMicrophone(enabled: true)

// Subscribe to the character's tracks
room.add(delegate: self)

// In RoomDelegate:
func room(_ room: Room, participant: RemoteParticipant,
          didSubscribeTrack publication: RemoteTrackPublication) {
    if participant.identity?.stringValue == conversation.character.livekitIdentity,
       let videoTrack = publication.track as? VideoTrack {
        videoView.track = videoTrack
    }
}
```

<Card icon="book" title="LiveKit iOS docs" href="https://docs.livekit.io/reference/client-sdk-swift/">
  Full reference for the Swift SDK.
</Card>

***

## Android (Kotlin)

Add the LiveKit Android SDK:

```kotlin theme={null}
implementation("io.livekit:livekit-android:<latest>")
```

Connect and render:

```kotlin theme={null}
import io.livekit.android.LiveKit
import io.livekit.android.room.Room

val room = LiveKit.create(applicationContext)

room.connect(
    url = conversation.serverUrl,
    token = consumerAccessToken
)

room.localParticipant.setMicrophoneEnabled(true)

// Attach the character's video track when it arrives
room.events.collect { event ->
    if (event is RoomEvent.TrackSubscribed &&
        event.participant.identity?.value == conversation.character.livekitIdentity) {
        (event.track as? VideoTrack)?.let { videoRenderer.bindTrack(it) }
    }
}
```

<Card icon="book" title="LiveKit Android docs" href="https://docs.livekit.io/reference/client-sdk-android/">
  Full reference for the Android SDK.
</Card>

***

## Tips

<Tip>
  The `consumerAccessToken` is short-lived. Don't cache it—fetch a fresh conversation from your backend each time the user wants to start talking.
</Tip>

<Warning>
  Never ship your Equos API key inside a mobile app. Only your backend should ever see it.
</Warning>
