element-hq / element-hq/element-x-android

Resolved: Regression in Element X Android 26.09.1: MISSING_MATRIX_RTC_TRANSPORT when starting a call on a self-hosted MatrixRTC/LiveKit server

Open
#7,659 4 comments 4 reactions 0 assignees View on GitHub
T-Defect
Dominant language
Kotlin
Stars
2.4k
Forks
624
Avg merge
1d 14h
Merged PRs (30d)
149

Description

### Steps to reproduce

## 1. Where are you starting? What can you see?

I am using Element X Android with a self-hosted Synapse homeserver and a self-hosted MatrixRTC backend.

- Element X Android version where calls work: `26.08.1`
- Element X Android version where calls fail: `26.09.1 (202609010)`
- Homeserver: `https://********`
- MatrixRTC backend: self-hosted LiveKit + `lk-jwt-service`
- Reverse proxy: Nginx
- The deployment also includes Jitsi, but the Element X call flow is configured to use MatrixRTC/LiveKit.

The MatrixRTC-related services were already running and no server-side configuration was changed between the successful test on 26.08.1 and the failed test on 26.09.1:

- Synapse: running and healthy
- LiveKit: running
- `lk-jwt-service`: running
- `msc4143_enabled: true`
- Synapse RTC configuration: enabled, with a LiveKit focus
- `/.well-known/matrix/client`: publicly available and contains both `m.matrix.rtc` and `org.matrix.msc4143.rtc_foci`

Sanitized public checks:

```text
GET [https://**/.well-known/matrix/client](https://**/.well-known/matrix/client)
-> HTTP 200
```

Response:

```json
{
"m.homeserver": {
"base_url": "[https://**](https://**)"
},
"m.matrix.rtc": {
"version": 1,
"livekit": {
"livekit_service_url": "[https://**](https://**)"
}
},
"org.matrix.msc4143.rtc_foci": [
{
"type": "livekit",
"livekit_service_url": "[https://**](https://**)"
}
]
}
```

```text
GET [https://**/_matrix/client/unstable/org.matrix.msc4143/rtc/transports](https://**/_matrix/client/unstable/org.matrix.msc4143/rtc/transports)
without an access token
-> HTTP 401 M_MISSING_TOKEN
```

This confirms that the endpoint exists and requires authentication.

Sanitized Synapse configuration:

```yaml
experimental_features:
msc4143_enabled: true
msc3266_enabled: true

rtc:
enable: true
focus:
type: livekit
livekit_service_url: "[https://**](https://**)"
jwt_auth:
enabled: true
audience: "livekit"

public_baseurl: "[https://**/](https://**/)"
```

## 2. What do you click?

1. Open a direct-message room in Element X Android.
2. Tap the call button.
3. Try to start either an audio or a video call.

## 3. More steps…

### Expected result

The call should start successfully, as it does with Element X Android `26.08.1` using the same Matrix account and the same unchanged self-hosted infrastructure.

### Actual result

Element X Android `26.09.1 (202609010)` immediately shows:

```text
MISSING_MATRIX_RTC_TRANSPORT
```

The call is not created and the client does not proceed to connect to the LiveKit backend.

### Regression

| Element X Android version | Result |
|---|---|
| `26.08.1` | Calls work |
| `26.09.1 (202609010)` | Calls fail with `MISSING_MATRIX_RTC_TRANSPORT` |

No MatrixRTC, Synapse, Nginx, LiveKit, or `lk-jwt-service` configuration was changed between these tests.

### Why this may be client-side

- The MatrixRTC transport endpoint is present.
- The `.well-known/matrix/client` document exposes both `m.matrix.rtc` and `org.matrix.msc4143.rtc_foci`.
- The same homeserver and MatrixRTC backend work with Element X Android `26.08.1`.
- The failure begins only after updating to `26.09.1`.

Could you please check whether Element X Android `26.09.1` changed any of the following?

- The request made to `/_matrix/client/unstable/org.matrix.msc4143/rtc/transports`
- Inclusion of `Authorization: Bearer ` for that request
- Fallback behaviour from `rtc/transports` to `/.well-known/matrix/client`
- Handling of `m.matrix.rtc` or `org.matrix.msc4143.rtc_foci`
- Required `livekit_service_url` format for `lk-jwt-service`
- Compatibility with Synapse `rtc.focus` configuration

I can provide sanitized client logs and sanitized Synapse, Nginx, LiveKit, and `lk-jwt-service` logs from both:
- a successful call attempt with `26.08.1`; and
- a failed call attempt with `26.09.1`.

### Outcome

#### What did you expect?

#### What happened instead?

### Your phone model

_No response_

### Operating system version

_No response_

### Application version and app store

_No response_

### Homeserver

_No response_

### Will you send logs?

No

### Will you submit a Pull Request?

No

Contributor guide

Open the contributing guide

Research direction

Start at the call-button flow and the request to /_matrix/client/unstable/org.matrix.msc4143/rtc/transports, then compare behavior between Element X Android 26.08.1 and 26.09.1. Check authenticated transport discovery and the .well-known MatrixRTC fallback against the reported Synapse and LiveKit setup; done means audio and video calls start successfully on the newer version.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin, nginx
Domain
api, audio-video-rtc, mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.