oficina / meet Public

Move the native apps to LiveKit's WebRTC build

LiveKitWebRTC 150.7871.02 (livekit/webrtc-xcframework, pinned exact)
replaces stasel/WebRTC 152. It is the same Google WebRTC a milestone
older, built with what the next two changes need: an audio device module
on macOS that lists and selects devices, and a capture post-processing
hook for a noise suppressor.

Its Objective-C symbols carry an LK prefix. WebRTCNames.swift aliases
every class, protocol and enum the headers declare back to its RTC name,
generated from the headers, so the rest of the code and the open media
branches change only their import. LiveKit's macOS slice declares but
does not build RTCMTLNSVideoView; its RTCMTLVideoView is the NSView
renderer there, and the old name points at it.

The Mac bundler embedded the framework by name and now looks for
LiveKitWebRTC.xcframework; without that the app built and signed but
could not launch. The iPhone test's SilentAudioDevice imports CallsKit
for the aliased protocol names.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by paul@keymail.dev e51e7466f2a06dab76c509b3362b58c2af002fc7 parent 3846ca4
15 files changed, +238 −18
  • native/README.md +7 −1
  • native/apple/Package.resolved +4 −4
  • native/apple/Package.swift +2 −2
  • native/apple/Sources/CallsInterop/SyntheticVideo.swift +1 −1
  • native/apple/Sources/CallsKit/Audio.swift +1 −1
  • native/apple/Sources/CallsKit/Call.swift +1 −1
  • native/apple/Sources/CallsKit/Capture.swift +1 −1
  • native/apple/Sources/CallsKit/MacVideoTile.swift +1 −1
  • native/apple/Sources/CallsKit/Media.swift +1 −1
  • native/apple/Sources/CallsKit/WebRTCNames.swift +213 −0
  • native/apple/Sources/CallsMac/CallsMac.swift +1 −1
  • native/ios/Sources/CallsPhone.swift +1 −1
  • native/ios/Tests/CallsPhoneTests.swift +1 −1
  • native/ios/Tests/SilentAudioDevice.swift +2 −1
  • native/scripts/bundle-mac.py +1 −1
diff --git a/native/README.md b/native/README.md
index 5f6a204..2713786 100644
--- a/native/README.md
+++ b/native/README.md
@@ -128,7 +128,13 @@ The iPhone target, device builds and Safari tests are described in
Go Mobile's cgo requirement is isolated in `native/go.mod` and the native build
script. The existing server continues to build with `CGO_ENABLED=0`. WebRTC is
-pinned to stasel/WebRTC 152.0.0; SwiftPM verifies its published artifact checksum.
+LiveKit's build of Google WebRTC, `livekit/webrtc-xcframework` pinned exactly to
+150.7871.02 (M150); SwiftPM verifies its published artifact checksum. It replaced
+stasel/WebRTC 152 because it carries what that build does not: an audio device
+module on macOS (device lists and selection) and a capture post-processing hook
+for noise suppression. Its Objective-C symbols are prefixed `LK`; CallsKit's
+`WebRTCNames.swift` aliases the old `RTC…` names once, so code and open branches
+keep using them and change only their import (`import LiveKitWebRTC`).
Go Mobile is also pinned. The bridge includes Mac, iPhone and iOS Simulator
slices. Generated frameworks, Xcode projects and binaries are ignored.
diff --git a/native/apple/Package.resolved b/native/apple/Package.resolved
index d797920..bc609ee 100644
--- a/native/apple/Package.resolved
+++ b/native/apple/Package.resolved
@@ -18,12 +18,12 @@
}
},
{
- "identity" : "webrtc",
+ "identity" : "webrtc-xcframework",
"kind" : "remoteSourceControl",
- "location" : "https://github.com/stasel/WebRTC.git",
+ "location" : "https://github.com/livekit/webrtc-xcframework.git",
"state" : {
- "revision" : "1d04692697cb642bfebf6ad2dd99fe52649c3d6d",
- "version" : "152.0.0"
+ "revision" : "c73deceaddd9c07293871ae28f24d4326cc86d62",
+ "version" : "150.7871.2"
}
}
],
diff --git a/native/apple/Package.swift b/native/apple/Package.swift
index 522f2fd..20748e5 100644
--- a/native/apple/Package.swift
+++ b/native/apple/Package.swift
@@ -15,12 +15,12 @@ let package = Package(
],
dependencies: [
sharedNative,
- .package(url: "https://github.com/stasel/WebRTC.git", exact: "152.0.0")
+ .package(url: "https://github.com/livekit/webrtc-xcframework.git", exact: "150.7871.02")
],
targets: [
.binaryTarget(name: "CallsBridge", path: "../build/CallsBridge.xcframework"),
.target(
- name: "CallsKit", dependencies: ["CallsBridge", .product(name: "WebRTC", package: "WebRTC")]),
+ name: "CallsKit", dependencies: ["CallsBridge", .product(name: "LiveKitWebRTC", package: "webrtc-xcframework")]),
.executableTarget(name: "CallsMac", dependencies: [.product(name: "RastrilloMacUpdates", package: "native", condition: .when(platforms: [.macOS])), "CallsKit"], resources: [.copy("Resources/AppIcon.png"), .copy("Resources/MacIcon.png")]),
.executableTarget(name: "CallsInterop", dependencies: ["CallsKit"]),
.testTarget(name: "CallsKitTests", dependencies: ["CallsKit"]),
diff --git a/native/apple/Sources/CallsInterop/SyntheticVideo.swift b/native/apple/Sources/CallsInterop/SyntheticVideo.swift
index 2eba113..a28290d 100644
--- a/native/apple/Sources/CallsInterop/SyntheticVideo.swift
+++ b/native/apple/Sources/CallsInterop/SyntheticVideo.swift
@@ -1,7 +1,7 @@
import CoreVideo
import Foundation
import CallsKit
-import WebRTC
+import LiveKitWebRTC
@MainActor final class SyntheticVideo: VideoCapture {
private var source: RTCVideoSource?
diff --git a/native/apple/Sources/CallsKit/Audio.swift b/native/apple/Sources/CallsKit/Audio.swift
index 495036d..679c1ca 100644
--- a/native/apple/Sources/CallsKit/Audio.swift
+++ b/native/apple/Sources/CallsKit/Audio.swift
@@ -6,7 +6,7 @@ import Foundation
#endif
#if os(iOS)
- import WebRTC
+ import LiveKitWebRTC
#endif
/// One audio device the person can be on. `selectable` is the whole
diff --git a/native/apple/Sources/CallsKit/Call.swift b/native/apple/Sources/CallsKit/Call.swift
index 9235300..6f02b08 100644
--- a/native/apple/Sources/CallsKit/Call.swift
+++ b/native/apple/Sources/CallsKit/Call.swift
@@ -2,7 +2,7 @@ import Combine
import Foundation
// Go serializes this API with a mutex; Objective-C bindings carry no Sendable annotation.
@preconcurrency import CallsBridge
-import WebRTC
+import LiveKitWebRTC
// The Go callback only enqueues. The main actor owns the interface and media;
// an epoch prevents callbacks from a closed room reaching a later call.
diff --git a/native/apple/Sources/CallsKit/Capture.swift b/native/apple/Sources/CallsKit/Capture.swift
index 8f4e51f..f902446 100644
--- a/native/apple/Sources/CallsKit/Capture.swift
+++ b/native/apple/Sources/CallsKit/Capture.swift
@@ -1,6 +1,6 @@
import AVFoundation
import Foundation
-import WebRTC
+import LiveKitWebRTC
/// One camera the person can choose, named the way a menu wants it.
///
diff --git a/native/apple/Sources/CallsKit/MacVideoTile.swift b/native/apple/Sources/CallsKit/MacVideoTile.swift
index 061b5de..b1429ff 100644
--- a/native/apple/Sources/CallsKit/MacVideoTile.swift
+++ b/native/apple/Sources/CallsKit/MacVideoTile.swift
@@ -1,7 +1,7 @@
#if os(macOS)
import AppKit
import SwiftUI
- import WebRTC
+ import LiveKitWebRTC
struct MacVideoTile: View {
let track: RTCVideoTrack?
diff --git a/native/apple/Sources/CallsKit/Media.swift b/native/apple/Sources/CallsKit/Media.swift
index 46e73ca..69dfbab 100644
--- a/native/apple/Sources/CallsKit/Media.swift
+++ b/native/apple/Sources/CallsKit/Media.swift
@@ -1,7 +1,7 @@
import AVFoundation
import CoreVideo
import Foundation
-import WebRTC
+import LiveKitWebRTC
@MainActor final class MediaEngine {
weak var call: Call?
diff --git a/native/apple/Sources/CallsKit/WebRTCNames.swift b/native/apple/Sources/CallsKit/WebRTCNames.swift
new file mode 100644
index 0000000..5361243
--- /dev/null
+++ b/native/apple/Sources/CallsKit/WebRTCNames.swift
@@ -0,0 +1,213 @@
+// The WebRTC names this app has always used, kept.
+//
+// Calls moved from stasel/WebRTC to LiveKit's build of the same Google
+// WebRTC (see native/README.md for why: the audio device module on macOS
+// and the audio processing hook). LiveKit's build prefixes every
+// Objective-C symbol with LK, so that it can sit beside another WebRTC in
+// one process — `LKRTCPeerConnection` rather than `RTCPeerConnection`.
+//
+// Rather than rename every use, and turn every open branch that touches
+// media into a conflict, the old names are aliased here, once. A file that
+// used WebRTC changes one line, its import. The list is generated from the
+// framework's own headers (every class, protocol and enum it declares), so
+// a name a future change reaches for is already here.
+//
+// Public, because CallsMac, CallsInterop and the iPhone app use these
+// names too and all of them import CallsKit.
+
+import LiveKitWebRTC
+
+public typealias RTCAudioBuffer = LKRTCAudioBuffer
+public typealias RTCAudioCustomProcessingDelegate = LKRTCAudioCustomProcessingDelegate
+public typealias RTCAudioDevice = LKRTCAudioDevice
+public typealias RTCAudioDeviceDelegate = LKRTCAudioDeviceDelegate
+public typealias RTCAudioDeviceModule = LKRTCAudioDeviceModule
+public typealias RTCAudioDeviceModuleDelegate = LKRTCAudioDeviceModuleDelegate
+public typealias RTCAudioDeviceModuleType = LKRTCAudioDeviceModuleType
+public typealias RTCAudioDuckingLevel = LKRTCAudioDuckingLevel
+public typealias RTCAudioEngineAvailability = LKRTCAudioEngineAvailability
+public typealias RTCAudioEngineMuteMode = LKRTCAudioEngineMuteMode
+public typealias RTCAudioEngineState = LKRTCAudioEngineState
+public typealias RTCAudioProcessingComponentOptions = LKRTCAudioProcessingComponentOptions
+public typealias RTCAudioProcessingComponentState = LKRTCAudioProcessingComponentState
+public typealias RTCAudioProcessingConfig = LKRTCAudioProcessingConfig
+public typealias RTCAudioProcessingImplementation = LKRTCAudioProcessingImplementation
+public typealias RTCAudioProcessingMode = LKRTCAudioProcessingMode
+public typealias RTCAudioProcessingModule = LKRTCAudioProcessingModule
+public typealias RTCAudioProcessingOptions = LKRTCAudioProcessingOptions
+public typealias RTCAudioProcessingOptionsResult = LKRTCAudioProcessingOptionsResult
+public typealias RTCAudioProcessingOptionsResultCode = LKRTCAudioProcessingOptionsResultCode
+public typealias RTCAudioProcessingState = LKRTCAudioProcessingState
+public typealias RTCAudioRenderer = LKRTCAudioRenderer
+public typealias RTCAudioSource = LKRTCAudioSource
+public typealias RTCAudioTrack = LKRTCAudioTrack
+public typealias RTCBundlePolicy = LKRTCBundlePolicy
+public typealias RTCCVPixelBuffer = LKRTCCVPixelBuffer
+public typealias RTCCallbackLogger = LKRTCCallbackLogger
+public typealias RTCCameraVideoCapturer = LKRTCCameraVideoCapturer
+public typealias RTCCandidateNetworkPolicy = LKRTCCandidateNetworkPolicy
+public typealias RTCCertificate = LKRTCCertificate
+public typealias RTCCodecSpecificInfo = LKRTCCodecSpecificInfo
+public typealias RTCCodecSpecificInfoH264 = LKRTCCodecSpecificInfoH264
+public typealias RTCCodecSpecificInfoH265 = LKRTCCodecSpecificInfoH265
+public typealias RTCConfiguration = LKRTCConfiguration
+public typealias RTCContinualGatheringPolicy = LKRTCContinualGatheringPolicy
+public typealias RTCCryptoOptions = LKRTCCryptoOptions
+public typealias RTCCryptorAlgorithm = LKRTCCryptorAlgorithm
+public typealias RTCDataBuffer = LKRTCDataBuffer
+public typealias RTCDataChannel = LKRTCDataChannel
+public typealias RTCDataChannelConfiguration = LKRTCDataChannelConfiguration
+public typealias RTCDataChannelDelegate = LKRTCDataChannelDelegate
+public typealias RTCDataChannelState = LKRTCDataChannelState
+public typealias RTCDataPacketCryptor = LKRTCDataPacketCryptor
+public typealias RTCDefaultAudioProcessingModule = LKRTCDefaultAudioProcessingModule
+public typealias RTCDefaultVideoDecoderFactory = LKRTCDefaultVideoDecoderFactory
+public typealias RTCDefaultVideoEncoderFactory = LKRTCDefaultVideoEncoderFactory
+public typealias RTCDegradationPreference = LKRTCDegradationPreference
+public typealias RTCDispatcher = LKRTCDispatcher
+public typealias RTCDispatcherQueueType = LKRTCDispatcherQueueType
+public typealias RTCDtmfSender = LKRTCDtmfSender
+public typealias RTCEncodedImage = LKRTCEncodedImage
+public typealias RTCEncryptedPacket = LKRTCEncryptedPacket
+public typealias RTCEncryptionKeyType = LKRTCEncryptionKeyType
+public typealias RTCFileLogger = LKRTCFileLogger
+public typealias RTCFileLoggerRotationType = LKRTCFileLoggerRotationType
+public typealias RTCFileLoggerSeverity = LKRTCFileLoggerSeverity
+public typealias RTCFrameCryptor = LKRTCFrameCryptor
+public typealias RTCFrameCryptorDelegate = LKRTCFrameCryptorDelegate
+public typealias RTCFrameCryptorKeyProvider = LKRTCFrameCryptorKeyProvider
+public typealias RTCFrameCryptorState = LKRTCFrameCryptorState
+public typealias RTCFrameType = LKRTCFrameType
+public typealias RTCH264Level = LKRTCH264Level
+public typealias RTCH264PacketizationMode = LKRTCH264PacketizationMode
+public typealias RTCH264Profile = LKRTCH264Profile
+public typealias RTCH264ProfileLevelId = LKRTCH264ProfileLevelId
+public typealias RTCI420Buffer = LKRTCI420Buffer
+public typealias RTCIODevice = LKRTCIODevice
+public typealias RTCIODeviceType = LKRTCIODeviceType
+public typealias RTCIceCandidate = LKRTCIceCandidate
+public typealias RTCIceCandidateErrorEvent = LKRTCIceCandidateErrorEvent
+public typealias RTCIceConnectionState = LKRTCIceConnectionState
+public typealias RTCIceGatheringState = LKRTCIceGatheringState
+public typealias RTCIceServer = LKRTCIceServer
+public typealias RTCIceTransportPolicy = LKRTCIceTransportPolicy
+public typealias RTCKeyDerivationAlgorithm = LKRTCKeyDerivationAlgorithm
+public typealias RTCLegacyStatsReport = LKRTCLegacyStatsReport
+public typealias RTCLoggingSeverity = LKRTCLoggingSeverity
+public typealias RTCMTLVideoView = LKRTCMTLVideoView
+public typealias RTCMediaConstraints = LKRTCMediaConstraints
+public typealias RTCMediaSource = LKRTCMediaSource
+public typealias RTCMediaStream = LKRTCMediaStream
+public typealias RTCMediaStreamTrack = LKRTCMediaStreamTrack
+public typealias RTCMediaStreamTrackState = LKRTCMediaStreamTrackState
+public typealias RTCMetricsSampleInfo = LKRTCMetricsSampleInfo
+public typealias RTCMutableI420Buffer = LKRTCMutableI420Buffer
+public typealias RTCMutableYUVPlanarBuffer = LKRTCMutableYUVPlanarBuffer
+public typealias RTCPeerConnection = LKRTCPeerConnection
+public typealias RTCPeerConnectionDelegate = LKRTCPeerConnectionDelegate
+public typealias RTCPeerConnectionFactory = LKRTCPeerConnectionFactory
+public typealias RTCPeerConnectionFactoryOptions = LKRTCPeerConnectionFactoryOptions
+public typealias RTCPeerConnectionState = LKRTCPeerConnectionState
+public typealias RTCPlatformAudioProcessingComponentState = LKRTCPlatformAudioProcessingComponentState
+public typealias RTCPlatformAudioProcessingState = LKRTCPlatformAudioProcessingState
+public typealias RTCPlatformAudioProcessingTopology = LKRTCPlatformAudioProcessingTopology
+public typealias RTCPriority = LKRTCPriority
+public typealias RTCRtcpMuxPolicy = LKRTCRtcpMuxPolicy
+public typealias RTCRtcpParameters = LKRTCRtcpParameters
+public typealias RTCRtpCapabilities = LKRTCRtpCapabilities
+public typealias RTCRtpCodecCapability = LKRTCRtpCodecCapability
+public typealias RTCRtpCodecParameters = LKRTCRtpCodecParameters
+public typealias RTCRtpEncodingParameters = LKRTCRtpEncodingParameters
+public typealias RTCRtpHeaderExtension = LKRTCRtpHeaderExtension
+public typealias RTCRtpHeaderExtensionCapability = LKRTCRtpHeaderExtensionCapability
+public typealias RTCRtpMediaType = LKRTCRtpMediaType
+public typealias RTCRtpParameters = LKRTCRtpParameters
+public typealias RTCRtpReceiver = LKRTCRtpReceiver
+public typealias RTCRtpReceiverDelegate = LKRTCRtpReceiverDelegate
+public typealias RTCRtpSender = LKRTCRtpSender
+public typealias RTCRtpSource = LKRTCRtpSource
+public typealias RTCRtpTransceiver = LKRTCRtpTransceiver
+public typealias RTCRtpTransceiverDirection = LKRTCRtpTransceiverDirection
+public typealias RTCRtpTransceiverInit = LKRTCRtpTransceiverInit
+public typealias RTCSSLCertificateVerifier = LKRTCSSLCertificateVerifier
+public typealias RTCSdpSemantics = LKRTCSdpSemantics
+public typealias RTCSdpType = LKRTCSdpType
+public typealias RTCSessionDescription = LKRTCSessionDescription
+public typealias RTCSignalingState = LKRTCSignalingState
+public typealias RTCSourceState = LKRTCSourceState
+public typealias RTCSpeechActivityEvent = LKRTCSpeechActivityEvent
+public typealias RTCStatistics = LKRTCStatistics
+public typealias RTCStatisticsReport = LKRTCStatisticsReport
+public typealias RTCStatsOutputLevel = LKRTCStatsOutputLevel
+public typealias RTCTcpCandidatePolicy = LKRTCTcpCandidatePolicy
+public typealias RTCTlsCertPolicy = LKRTCTlsCertPolicy
+public typealias RTCVideoCapturer = LKRTCVideoCapturer
+public typealias RTCVideoCapturerDelegate = LKRTCVideoCapturerDelegate
+public typealias RTCVideoCodecInfo = LKRTCVideoCodecInfo
+public typealias RTCVideoCodecMode = LKRTCVideoCodecMode
+public typealias RTCVideoContentType = LKRTCVideoContentType
+public typealias RTCVideoDecoder = LKRTCVideoDecoder
+public typealias RTCVideoDecoderAV1 = LKRTCVideoDecoderAV1
+public typealias RTCVideoDecoderFactory = LKRTCVideoDecoderFactory
+public typealias RTCVideoDecoderFactoryH264 = LKRTCVideoDecoderFactoryH264
+public typealias RTCVideoDecoderH264 = LKRTCVideoDecoderH264
+public typealias RTCVideoDecoderH265 = LKRTCVideoDecoderH265
+public typealias RTCVideoDecoderVP8 = LKRTCVideoDecoderVP8
+public typealias RTCVideoDecoderVP9 = LKRTCVideoDecoderVP9
+public typealias RTCVideoEncoder = LKRTCVideoEncoder
+public typealias RTCVideoEncoderAV1 = LKRTCVideoEncoderAV1
+public typealias RTCVideoEncoderCodecSupport = LKRTCVideoEncoderCodecSupport
+public typealias RTCVideoEncoderFactory = LKRTCVideoEncoderFactory
+public typealias RTCVideoEncoderFactoryH264 = LKRTCVideoEncoderFactoryH264
+public typealias RTCVideoEncoderFactorySimulcast = LKRTCVideoEncoderFactorySimulcast
+public typealias RTCVideoEncoderH264 = LKRTCVideoEncoderH264
+public typealias RTCVideoEncoderH265 = LKRTCVideoEncoderH265
+public typealias RTCVideoEncoderQpThresholds = LKRTCVideoEncoderQpThresholds
+public typealias RTCVideoEncoderSelector = LKRTCVideoEncoderSelector
+public typealias RTCVideoEncoderSettings = LKRTCVideoEncoderSettings
+public typealias RTCVideoEncoderSimulcast = LKRTCVideoEncoderSimulcast
+public typealias RTCVideoEncoderVP8 = LKRTCVideoEncoderVP8
+public typealias RTCVideoEncoderVP9 = LKRTCVideoEncoderVP9
+public typealias RTCVideoFrame = LKRTCVideoFrame
+public typealias RTCVideoFrameBuffer = LKRTCVideoFrameBuffer
+public typealias RTCVideoRenderer = LKRTCVideoRenderer
+public typealias RTCVideoRotation = LKRTCVideoRotation
+public typealias RTCVideoSource = LKRTCVideoSource
+public typealias RTCVideoTrack = LKRTCVideoTrack
+public typealias RTCVideoViewDelegate = LKRTCVideoViewDelegate
+public typealias RTCVideoViewShading = LKRTCVideoViewShading
+public typealias RTCYUVHelper = LKRTCYUVHelper
+public typealias RTCYUVPlanarBuffer = LKRTCYUVPlanarBuffer
+
+#if os(macOS)
+ public typealias RTCDesktopCapturer = LKRTCDesktopCapturer
+ public typealias RTCDesktopCapturerDelegate = LKRTCDesktopCapturerDelegate
+ public typealias RTCDesktopMediaList = LKRTCDesktopMediaList
+ public typealias RTCDesktopMediaListDelegate = LKRTCDesktopMediaListDelegate
+ public typealias RTCDesktopSource = LKRTCDesktopSource
+ public typealias RTCDesktopSourceType = LKRTCDesktopSourceType
+ // LiveKit's macOS slice declares RTCMTLNSVideoView but does not build
+ // it; its RTCMTLVideoView is the NSView renderer on macOS instead, with
+ // the same delegate and init(frame:). The old name points at that.
+ public typealias RTCMTLNSVideoView = LKRTCMTLVideoView
+#endif
+
+#if os(iOS)
+ public typealias RTCAudioSession = LKRTCAudioSession
+ public typealias RTCAudioSessionActivationDelegate = LKRTCAudioSessionActivationDelegate
+ public typealias RTCAudioSessionConfiguration = LKRTCAudioSessionConfiguration
+ public typealias RTCAudioSessionDelegate = LKRTCAudioSessionDelegate
+ public typealias RTCCameraPreviewView = LKRTCCameraPreviewView
+ public typealias RTCEAGLVideoView = LKRTCEAGLVideoView
+ public typealias RTCFileVideoCapturer = LKRTCFileVideoCapturer
+ public typealias RTCNetworkMonitor = LKRTCNetworkMonitor
+#endif
+
+@discardableResult public func RTCInitializeSSL() -> Bool { LKRTCInitializeSSL() }
+@discardableResult public func RTCCleanupSSL() -> Bool { LKRTCCleanupSSL() }
+
+public let kRTCMediaStreamTrackKindAudio = kLKRTCMediaStreamTrackKindAudio
+public let kRTCMediaStreamTrackKindVideo = kLKRTCMediaStreamTrackKindVideo
+public let kRTCMediaConstraintsIceRestart = kLKRTCMediaConstraintsIceRestart
+public let kRTCMediaConstraintsValueTrue = kLKRTCMediaConstraintsValueTrue
+public let kRTCMediaConstraintsValueFalse = kLKRTCMediaConstraintsValueFalse
diff --git a/native/apple/Sources/CallsMac/CallsMac.swift b/native/apple/Sources/CallsMac/CallsMac.swift
index 1f4daf9..f3434d6 100644
--- a/native/apple/Sources/CallsMac/CallsMac.swift
+++ b/native/apple/Sources/CallsMac/CallsMac.swift
@@ -5,7 +5,7 @@ import AppKit
@preconcurrency import CallsBridge
import CallsKit
import SwiftUI
-import WebRTC
+import LiveKitWebRTC
@main struct CallsMacApp: App {
#if os(macOS)
diff --git a/native/ios/Sources/CallsPhone.swift b/native/ios/Sources/CallsPhone.swift
index 6bad8fd..6613f09 100644
--- a/native/ios/Sources/CallsPhone.swift
+++ b/native/ios/Sources/CallsPhone.swift
@@ -1,6 +1,6 @@
import CallsKit
import SwiftUI
-import WebRTC
+import LiveKitWebRTC
/// The delegate exists for one reason: Apple hands a device token to
/// the application delegate and nowhere else, so a pure SwiftUI app has
diff --git a/native/ios/Tests/CallsPhoneTests.swift b/native/ios/Tests/CallsPhoneTests.swift
index 2e9e28a..b9bece0 100644
--- a/native/ios/Tests/CallsPhoneTests.swift
+++ b/native/ios/Tests/CallsPhoneTests.swift
@@ -1,5 +1,5 @@
import CallsKit
-import WebRTC
+import LiveKitWebRTC
import XCTest
final class CallsPhoneTests: XCTestCase {
diff --git a/native/ios/Tests/SilentAudioDevice.swift b/native/ios/Tests/SilentAudioDevice.swift
index 0ef363b..a0538d2 100644
--- a/native/ios/Tests/SilentAudioDevice.swift
+++ b/native/ios/Tests/SilentAudioDevice.swift
@@ -1,5 +1,6 @@
+import CallsKit
import Foundation
-import WebRTC
+import LiveKitWebRTC
// Test-only audio device. No samples are captured or rendered. WebRTC invokes
// this protocol serially on its audio thread, as specified by RTCAudioDevice.
diff --git a/native/scripts/bundle-mac.py b/native/scripts/bundle-mac.py
index 94c30b7..e1bebec 100644
--- a/native/scripts/bundle-mac.py
+++ b/native/scripts/bundle-mac.py
@@ -46,7 +46,7 @@ info = {
(bundle / 'Info.plist').write_bytes(plistlib.dumps(info))
# SwiftPM links dynamic binary dependencies using @rpath. Embed just the macOS
# slice rather than shipping iOS and simulator frameworks inside the Mac app.
-for xc in [root / 'build/CallsBridge.xcframework', *list((root / 'apple/.build/artifacts').rglob('WebRTC.xcframework'))]:
+for xc in [root / 'build/CallsBridge.xcframework', *list((root / 'apple/.build/artifacts').rglob('LiveKitWebRTC.xcframework'))]:
manifest = plistlib.loads((xc / 'Info.plist').read_bytes())
for lib in manifest['AvailableLibraries']:
if lib['SupportedPlatform'] != 'macos':