Files

372 lines
14 KiB
Markdown
Raw Permalink Normal View History

2022-03-04 14:47:44 +00:00
# Element Call
2021-07-16 14:22:03 -07:00
2022-11-01 22:07:10 -04:00
[![Chat](https://img.shields.io/matrix/webrtc:matrix.org)](https://matrix.to/#/#webrtc:matrix.org)
2023-11-20 13:31:30 +00:00
[![Localazy](https://img.shields.io/endpoint?url=https%3A%2F%2Fconnect.localazy.com%2Fstatus%2Felement-call%2Fdata%3Fcontent%3Dall%26title%3Dlocalazy%26logo%3Dtrue)](https://localazy.com/p/element-call)
2025-03-05 19:33:39 +01:00
[![License](https://img.shields.io/github/license/element-hq/element-call)](LICENSE-AGPL-3.0)
2026-01-09 12:43:33 +01:00
[![Codecov](https://img.shields.io/codecov/c/github/element-hq/element-call)](https://app.codecov.io/gh/element-hq/element-call)
2021-07-16 14:22:03 -07:00
2025-03-05 19:34:39 +01:00
[🎬 Live Demo 🎬](https://call.element.io)
2023-06-22 20:14:58 +02:00
2025-03-05 19:34:39 +01:00
The world's first 🌐 decentralized and 🤝 federated video conferencing solution
powered by **the Matrix protocol**.
2022-03-04 14:55:24 +00:00
2025-03-05 19:35:02 +01:00
## 📌 Overview
**Element Call** is a native Matrix video conferencing application developed by
[Element](https://element.io/), designed for **secure**, **scalable**,
**privacy-respecting**, and **decentralized** video and voice calls over the
Matrix protocol. Built on **MatrixRTC**
([MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143)), it
utilizes
**[MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)**
with **[LiveKit](https://livekit.io/)** as its backend.
2025-03-17 09:55:04 +01:00
![A demo of Element Call with six people](demo.gif)
2023-01-20 10:51:28 -05:00
2025-03-05 19:35:02 +01:00
You can find the latest development version continuously deployed to
2024-11-06 20:20:29 +01:00
[call.element.dev](https://call.element.dev/).
2021-07-16 14:22:03 -07:00
2025-03-05 21:43:09 +01:00
> [!NOTE]
2025-03-05 19:35:02 +01:00
> For prior version of the Element Call that relied solely on full-mesh logic,
2025-03-05 21:43:09 +01:00
> check [`full-mesh`](https://github.com/element-hq/element-call/tree/full-mesh)
> branch.
2022-11-01 22:07:10 -04:00
2025-03-05 21:10:45 +01:00
## ✨ Key Features
**Decentralized & Federated** No central authority; works across Matrix
homeservers.
**End-to-End Encrypted** Secure and private calls.
2025-03-05 21:43:09 +01:00
**Standalone & Widget Mode** Use as an independent app or embed in Matrix
2025-03-05 21:10:45 +01:00
clients.
**WebRTC-based** No additional software required.
2025-03-05 21:43:09 +01:00
**Scalable with LiveKit** Supports large meetings via SFU
2025-03-05 21:10:45 +01:00
([MSC4195: MatrixRTC using LiveKit backend](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)).
**Raise Hand** Participants can signal when they want to speak, helping to
organize the flow of the meeting.
**Emoji Reactions** Users can react with emojis 👍️ 🎉 👏 🤘, adding
2025-03-05 21:43:09 +01:00
engagement and interactivity to the conversation.
2022-11-01 22:07:10 -04:00
2025-04-03 22:47:01 +02:00
## 🚀 Deployment & Packaging Options
2025-03-05 21:12:23 +01:00
2025-04-03 22:47:01 +02:00
Element Call is developed using the
[Matrix js-sdk](https://github.com/matrix-org/matrix-js-sdk) with Matroska mode.
This allows the app to run either as a Standalone App directly connected to a
homeserver with login interfaces or it can be used as a widget within a Matrix
client.
2025-03-05 21:12:23 +01:00
2025-04-03 23:10:53 +02:00
### 🖥️ Standalone Mode
2025-03-05 21:12:23 +01:00
2025-04-03 22:26:10 +02:00
<p align="center">
<img src="./docs/element_call_standalone.drawio.png" alt="Element Call in Standalone Mode">
</p>
2025-03-05 21:12:23 +01:00
2025-04-03 22:47:01 +02:00
In Standalone mode, Element Call operates as an independent, full-featured video
conferencing web application, enabling users to join or host calls without
2025-03-05 21:12:23 +01:00
requiring a separate Matrix client.
2025-04-03 22:47:01 +02:00
### 📲 In-App Calling (Widget Mode in Messenger Apps)
2026-05-18 08:05:03 +02:00
When used as a widget 🧩, Element Call is solely responsible for the core calling
2025-04-07 11:30:34 +02:00
functionality (MatrixRTC). Authentication, event handling, and room state
updates (via the Client-Server API) are handled by the hosting client.
Communication between Element Call and the client is managed through the widget
API.
2025-03-05 21:12:23 +01:00
2025-04-03 22:26:10 +02:00
<p align="center">
<img src="./docs/element_call_widget.drawio.png" alt="Element Call in Widget Mode">
</p>
2025-03-05 21:12:23 +01:00
Element Call can be embedded as a widget inside apps like
[**Element Web**](https://github.com/element-hq/element-web) or **Element X
([iOS](https://github.com/element-hq/element-x-ios),
[Android](https://github.com/element-hq/element-x-android))**, bringing
**MatrixRTC** capabilities to messenger apps for seamless decentralized video
and voice calls within Matrix rooms.
> [!IMPORTANT]
> Embedded packaging is recommended for Element Call in widget mode!
2025-04-03 22:41:30 +02:00
### 📦 Element Call Packaging
Element Call offers two packaging options: one for standalone or widget
2025-04-05 19:29:08 +02:00
deployment, and another for seamless widget-based integration into messenger
2025-04-03 22:41:30 +02:00
apps. Below is an overview of each option.
**Full Package** Supports both **Standalone** and **Widget** mode. It is
hosted as a static web page and can be accessed via a URL when used as a widget.
<p align="center">
<img src="./docs/full_package.drawio.png" alt="Element Call Full Package">
</p>
**Embedded Package** Designed specifically for **Widget mode** only. It is
bundled with a messenger app for seamless integration and this is the
recommended method for embedding Element Call.
<p align="center">
<img src="./docs/embedded_package.drawio.png" alt="Element Call Embedded Package">
</p>
For more details on the packages, see the
2026-04-21 16:06:51 +02:00
[Embedded vs. Standalone Guide](./docs/embedded_standalone.md).
2025-04-03 22:41:30 +02:00
2025-03-05 21:13:55 +01:00
## 🛠️ Self-Hosting
For operating and deploying Element Call on your own server, refer to the
2026-04-21 16:06:51 +02:00
[**Self-Hosting Guide**](./docs/self_hosting.md).
2025-03-05 21:13:55 +01:00
## 🧭 MatrixRTC Backend Discovery and Selection
For proper Element Call operation each site deployment needs a MatrixRTC backend
2026-05-18 08:19:49 +02:00
setup as outlined in the [Self-Hosting Guide](./docs/self_hosting.md). A typical
federated site deployment for three different sites A, B and C is depicted below.
2025-04-03 22:26:10 +02:00
<p align="center">
<img src="./docs/Federated_Setup.drawio.png" alt="Element Call federated setup">
</p>
### Backend Discovery
2026-05-18 08:26:42 +02:00
The MatrixRTC backend (according to
2025-04-03 22:27:12 +02:00
[MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143)) is
announced by the Matrix site's `.well-known/matrix/client` file and discovered
via the `org.matrix.msc4143.rtc_foci` key, e.g.:
2025-03-05 21:43:09 +01:00
```json
"org.matrix.msc4143.rtc_foci": [
{
"type": "livekit",
"livekit_service_url": "https://matrix-rtc.example.com/livekit/jwt"
2025-03-05 21:43:09 +01:00
},
]
```
where the format for MatrixRTC using LiveKit backend is defined in
[MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md).
In the example above Matrix clients do discover a focus of type `livekit` which
points them to a [MatrixRTC Authorization Service](https://github.com/element-hq/lk-jwt-service)
via `livekit_service_url`.
### Backend Selection
- Each call participant proposes their discovered MatrixRTC backend from
`org.matrix.msc4143.rtc_foci` in their `org.matrix.msc3401.call.member` state event.
2026-05-18 08:29:47 +02:00
- For the **LiveKit** MatrixRTC backend
([MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)),
the **first participant who joined the call** defines which backend will be used for this call via
the `foci_preferred` key in their `org.matrix.msc3401.call.member` state event.
- During the actual call join flow, the **[MatrixRTC Authorization Service](https://github.com/element-hq/lk-jwt-service)**
provides the client with the **LiveKit SFU WebSocket URL** and an
**access JWT token** in order to exchange media via WebRTC.
The example below illustrates how backend selection works across **Matrix
federation**, using the setup from sites A, B, and C. It demonstrates backend
selection for **Matrix rooms 123 and 456**, which include users from different
2025-04-03 22:27:12 +02:00
homeservers.
2025-04-03 22:26:10 +02:00
<p align="center">
<img src="./docs/SFU_selection.drawio.png" alt="Element Call SFU selection over Matrix federation">
</p>
2025-03-05 21:16:49 +01:00
## 🌍 Translation
2024-11-06 20:20:29 +01:00
If you'd like to help translate Element Call, head over to
[Localazy](https://localazy.com/p/element-call). You're also encouraged to join
the [Element Translators](https://matrix.to/#/#translators:element.io) space to
discuss and coordinate translation efforts.
2025-03-05 21:17:54 +01:00
## 🛠️ Development
2022-11-01 22:07:10 -04:00
### Dependencies
- Node.js (e.g. via [nvm](https://github.com/nvm-sh/nvm))
- [Corepack](https://github.com/nodejs/corepack) (not bundled with Node.js anymore starting from 25.0.0)
- Docker client and runtime + Docker Compose (for the backend)
- On macOS you can install everything with `brew install colima docker docker-compose`
2023-06-22 20:14:58 +02:00
### Frontend
To get started clone and set up this project:
2021-10-01 11:51:44 -07:00
```sh
git clone https://github.com/element-hq/element-call.git
2022-03-04 14:48:57 +00:00
cd element-call
2025-03-14 02:17:26 -04:00
corepack enable
2026-04-21 10:53:56 +02:00
pnpm install
2021-07-26 11:50:32 -07:00
```
2025-03-05 21:17:54 +01:00
To use it, create a local config by, e.g.,
`cp ./config/config.devenv.json ./public/config.json` and adapt it if necessary.
The `config.devenv.json` config should work with the backend development
environment as outlined in the next section out of box.
2024-11-06 20:00:05 +01:00
2022-11-01 22:07:10 -04:00
You're now ready to launch the development server:
2022-03-04 14:50:36 +00:00
```sh
2026-04-21 10:53:56 +02:00
pnpm dev
2022-11-01 22:07:10 -04:00
```
2022-03-04 14:50:36 +00:00
2025-03-25 20:12:36 +01:00
See also:
2026-05-18 09:56:37 +02:00
- [Developing with linked packages](./docs/linking.md)
2025-03-25 20:12:36 +01:00
2023-06-22 20:14:58 +02:00
### Backend
2023-06-12 15:52:27 +02:00
2024-11-06 20:00:05 +01:00
A docker compose file `dev-backend-docker-compose.yml` is provided to start the
whole stack of components which is required for a local development environment
including federation:
2024-11-06 21:18:24 +01:00
2026-05-18 08:40:08 +02:00
- Minimum Synapse Setup (servernames: `synapse.m.localhost`, `synapse.othersite.m.localhost`)
2026-05-18 09:46:41 +02:00
- MatrixRTC Authorization Service (Note: requires Federation API and hence a TLS reverse proxy)
- Minimum LiveKit SFU setup using dev defaults for config
2025-05-05 14:44:21 +02:00
- Minimum `localhost` Certificate Authority (CA) for Transport Layer Security (TLS)
- Hostnames: `m.localhost`, `*.m.localhost`, `*.othersite.m.localhost`
2026-05-18 09:48:46 +02:00
- Add [./backend/dev_tls_local-ca.crt](./backend/dev_tls_local-ca.crt) to your web browser's trusted
2025-05-05 14:44:21 +02:00
certificates
- Minimum TLS reverse proxy for
- Synapse homeserver: `synapse.m.localhost` and `synapse.othersite.m.localhost`
- MatrixRTC backend: `matrix-rtc.m.localhost` and `matrix-rtc.othersite.m.localhost`
- Local Element Call development `call.m.localhost` via `pnpm dev --host `
- Element Web `app.m.localhost` and `app.othersite.m.localhost`
- Note certificates will expire on Thr, 20 September 2035 14:27:35 CEST
2023-06-12 15:52:27 +02:00
2024-11-06 20:00:05 +01:00
These use a test 'secret' published in this repository, so this must be used
only for local development and **_never be exposed to the public Internet._**
2023-06-12 15:52:27 +02:00
Make sure your Docker runtime is running (e.g. via `colima start`) and then start
the backend components:
```sh
2026-04-21 10:53:56 +02:00
pnpm backend
2026-05-18 09:49:58 +02:00
# or for podman-compose:
2024-11-06 20:00:05 +01:00
# podman-compose -f dev-backend-docker-compose.yml up
2023-06-12 15:52:27 +02:00
```
2023-10-26 11:18:12 +02:00
2025-04-25 00:09:39 +02:00
> [!NOTE]
2025-05-05 14:44:21 +02:00
> To ensure your local development frontend functions properly, youll need to
> add certificate exceptions in your browser for `https://localhost:3000`,
> `https://matrix-rtc.m.localhost/livekit/jwt/healthz` and
> `https://synapse.m.localhost/.well-known/matrix/client`. This can be either
> done by adding the minimum localhost CA
> ([./backend/dev_tls_local-ca.crt](./backend/dev_tls_local-ca.crt)) to your web
2026-05-18 09:50:42 +02:00
> browser's trusted certificates or by simply copying and pasting each URL into
2025-05-05 14:44:21 +02:00
> your browsers address bar and follow the prompts to add the exception.
2025-04-25 00:09:39 +02:00
2025-03-13 14:44:04 +01:00
### Playwright tests
2025-04-03 22:27:12 +02:00
Our Playwright tests run automatically as part of our CI along with our other
tests, on every pull request.
2025-03-13 14:44:04 +01:00
2025-04-03 22:27:12 +02:00
You may need to follow instructions to set up your development environment for
running Playwright by following
<https://playwright.dev/docs/browsers#install-browsers> and
2025-03-13 14:44:04 +01:00
<https://playwright.dev/docs/browsers#install-system-dependencies>.
2025-04-03 22:27:12 +02:00
However the Playwright tests are run, an element-call instance must be running
on https://localhost:3000 (this is configured in `playwright.config.ts`) - this
is what will be tested.
2025-03-13 14:44:04 +01:00
The local backend environment should be running for the test to work:
2026-04-21 10:53:56 +02:00
`pnpm backend`
2025-03-13 14:44:04 +01:00
2025-04-03 22:27:12 +02:00
There are a few different ways to run the tests yourself. The simplest is to
run:
2025-03-13 14:44:04 +01:00
```shell
2026-04-21 10:53:56 +02:00
pnpm run test:playwright
2025-03-13 14:44:04 +01:00
```
This will run the Playwright tests once, non-interactively.
There is a more user-friendly way to run the tests in interactive mode:
```shell
2026-04-21 10:53:56 +02:00
pnpm run test:playwright:open
2025-03-13 14:44:04 +01:00
```
The easiest way to develop new test is to use the codegen feature of Playwright:
```shell
npx playwright codegen
```
2025-03-25 17:07:58 +01:00
This will record your action and write the test code for you. Use the tool bar
2025-03-26 13:20:27 +01:00
to test visibility, text content and clicking.
2025-03-13 14:44:04 +01:00
2025-03-13 17:16:48 +01:00
##### Investigate a failed test from the CI
2025-04-03 22:27:12 +02:00
In the failed action page, click on the failed job, then scroll down to the
`upload-artifact` step. You will find a link to download the zip report, as per:
2025-03-13 17:16:48 +01:00
```
Artifact playwright-report has been successfully uploaded! Final size is 1360358 bytes. Artifact ID is 2746265841
Artifact download URL: https://github.com/element-hq/element-call/actions/runs/13837660687/artifacts/2746265841
```
Unzip the report then use this command to open the report in your browser:
```shell
npx playwright show-report ~/Downloads/playwright-report/
```
2025-03-25 17:07:58 +01:00
Under the failed test there is a small icon looking like "3 columns" (next to
2025-04-03 22:27:12 +02:00
the test name file name), click on it to see the live screenshots/console
output.
2025-03-13 17:16:48 +01:00
2024-08-30 15:07:15 +02:00
### Test Coverage
<img src="https://codecov.io/github/element-hq/element-call/graphs/tree.svg?token=O6CFVKK6I1"></img>
### Add a new translation key
To add a new translation key you can do these steps:
2025-03-05 21:17:54 +01:00
1. Add the new key entry to the code where the new key is used:
`t("some_new_key")`
2026-04-21 10:53:56 +02:00
1. Run `pnpm i18n` to extract the new key and update the translation files. This
2024-12-04 14:51:29 +00:00
will add a skeleton entry to the `locales/en/app.json` file:
```jsonc
{
...
"some_new_key": "",
...
}
```
2025-03-05 21:17:54 +01:00
1. Update the skeleton entry in the `locales/en/app.json` file with the English
translation:
2025-03-05 21:43:09 +01:00
```jsonc
{
...
"some_new_key": "Some new key",
...
}
```
2025-03-05 21:18:17 +01:00
## 📖 Documentation
2023-10-26 11:18:12 +02:00
Usage and other technical details about the project can be found here:
[**Docs**](./docs/README.md)
2025-02-05 16:01:51 +00:00
2025-03-05 21:19:12 +01:00
## 📝 Copyright & License
2025-02-05 16:01:51 +00:00
Copyright 2021-2025 New Vector Ltd
2025-03-05 21:19:12 +01:00
This software is dual-licensed by New Vector Ltd (Element). It can be used
either:
2025-02-05 16:01:51 +00:00
2025-03-05 21:19:12 +01:00
(1) for free under the terms of the GNU Affero General Public License (as
published by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version); OR
2025-02-05 16:01:51 +00:00
2025-03-05 21:19:12 +01:00
(2) under the terms of a paid-for Element Commercial License agreement between
you and Element (the terms of which may vary depending on what you and Element
have agreed to). Unless required by applicable law or agreed to in writing,
software distributed under the Licenses is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
Licenses for the specific language governing permissions and limitations under
2025-03-05 21:43:09 +01:00
the Licenses.