# MatrixRTC SDK (EXPERIMENTAL) `@element-hq/matrixrtc-sdk` is the call model under Element Call, on its own: MatrixRTC memberships and transports, LiveKit connections, publishing, E2EE keys and the media of every member, as observables. It has no UI. Element Call's own `CallViewModel` is meant to become one consumer of it. The design is in [`SdkArchitecture.md`](./SdkArchitecture.md), the migration from the view model in [`SdkMigration.md`](./SdkMigration.md). **Status:** first implementation. `createMatrixRTCClient` joins the session, connects to the transport, publishes the local media and exposes every member's media; the development harness and its e2e tests in `playwright/sdk` drive it, and Element Call's own `CallViewModel` is built on it. It depends on nothing in Element Call's `src/`. ## Using it ```ts import { constant, createMatrixRTCClient, E2eeType, MatrixRTCMode, ObservableScope, } from "@element-hq/matrixrtc-sdk"; const scope = new ObservableScope(); const rtcClient = createMatrixRTCClient( scope, client, // a matrix-js-sdk MatrixClient, logged in and syncing room, // the matrix-js-sdk Room, from client.getRoom() once the join has synced { publish: [{ source: "microphone" }, { source: "camera" }], audioOutputDeviceId$: constant(undefined), }, { encryptionSystem: { kind: E2eeType.PER_PARTICIPANT }, matrixRTCMode: MatrixRTCMode.Compatibility, }, ); rtcClient.join(); rtcClient.remoteMembers$.subscribe((members) => { // each member has displayName$, media$ and more; a media track is rendered // by handing it a