Files
element-call/README.md

241 lines
9.1 KiB
Markdown
Raw Normal View History

2022-03-04 14:47:44 +00:00
# Element Call
2021-07-16 14:22:03 -07:00
[![Chat](https://img.shields.io/matrix/webrtc:matrix.org)](https://matrix.to/#/#webrtc:matrix.org)
[![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)
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.
2023-01-20 10:51:28 -05:00
![A demo of Element Call with six people](demo.jpg)
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 19:35:02 +01:00
> [!NOTE]
> For prior version of the Element Call that relied solely on full-mesh logic,
check [`full-mesh`](https://github.com/element-hq/element-call/tree/full-mesh)
branch.
2021-10-01 11:51:44 -07: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.
**Standalone & Widget Mode** Use as an independent app or embed in Matrix
clients.
**WebRTC-based** No additional software required.
**Scalable with LiveKit** Supports large meetings via SFU
([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
engagement and interactivity to the conversation.
2025-03-05 21:12:23 +01:00
## 🚀 Deployment Options
Element Call can be packaged in two ways:
**Full Package** Supports both **Standalone** and **Widget** mode. Hosted as
a static web page and accessed via a URL when used as a widget.
**Embedded Package** Designed for **Widget mode** only. Bundled with a
messenger app for seamless integration. This is the recommended method for
embedding Element Call into a messenger app.
### Standalone mode
![Element Call in Standalone Mode](./docs/element_call_standalone.drawio.png)
In Standalone mode Element Call operates as an independent, full-featured video
conferencing web application, allowing users to join or host calls without
requiring a separate Matrix client.
### Widget mode embedded in Messenger Apps
![Element Call in Widget Mode](./docs/element_call_widget.drawio.png)
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-03-05 21:13:55 +01:00
## 🛠️ Self-Hosting
For operating and deploying Element Call on your own server, refer to the
[**Self-Hosting Guide**](./docs/self-hosting.md).
## 🧭 MatrixRTC Backend Discovery and Selection
For proper Element Call operation each site deployment needs a MatrixRTC backend
setup as outlined in the [Self-Hosting](#self-hosting). A typical federated site
deployment for three different sites A, B and C is depicted below.
![Element Call federated setup](./docs/Federated_Setup.drawio.png)
### Backend Discovery
MatrixRTC backend (according to
[MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143))
is announced by the homeserver's `.well-known/matrix/client` file and discovered
via the `org.matrix.msc4143.rtc_foci` key, e.g.:
```json
"org.matrix.msc4143.rtc_foci": [
{
"type": "livekit",
"livekit_service_url": "https://someurl.com"
},
]
```
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 Matrix LiveKit JWT Auth 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.
- For **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 via the `foci_preferred`
key in their `org.matrix.msc3401.call.member` which actual MatrixRTC backend
will be used for this call.
- During the actual call join flow, the **LiveKit JWT Auth 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
homeservers.
![Element Call SFU selection over Matrix federation](./docs/SFU_selection.drawio.png)
2023-06-22 20:14:58 +02: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.
## Development
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
2021-07-26 11:50:32 -07:00
yarn
```
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
2024-11-06 20:20:29 +01:00
(Be aware, that this `config.devenv.json` is exposing a deprecated fallback
LiveKit config key. If the homeserver advertises SFU backend via
`.well-known/matrix/client` this has precedence.)
2024-11-06 20:00:05 +01:00
You're now ready to launch the development server:
2022-03-04 14:50:36 +00:00
```sh
yarn dev
```
2022-03-04 14:50:36 +00:00
2023-06-22 20:14:58 +02:00
### Backend
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:
2024-11-06 21:18:24 +01:00
- Minimum Synapse Setup (servername: `synapse.localhost`)
2024-11-06 20:00:05 +01:00
- LiveKit JWT Service (Note requires Federation API and hence a TLS reverse proxy)
- Minimum TLS reverse proxy (servername: `synapse.localhost`) Note certificates
2024-11-06 20:00:05 +01:00
are valid for at least 10 years from now
- Minimum LiveKit SFU Setup using dev defaults for config
- Redis db for completeness
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-22 20:14:58 +02:00
Run backend components:
```sh
yarn backend
2024-11-06 20:00:05 +01:00
# or for podman-compose
# podman-compose -f dev-backend-docker-compose.yml up
```
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:
1. Add the new key entry to the code where the new key is used: `t("some_new_key")`
2024-11-06 20:20:29 +01:00
1. Run `yarn i18n` to extract the new key and update the translation files. This
will add a skeleton entry to the `locales/en/app.json` file:
```jsonc
{
...
"some_new_key": "",
...
}
```
1. Update the skeleton entry in the `locales/en/app.json` file with
2024-11-06 20:20:29 +01:00
the English translation:
2024-11-06 21:18:24 +01:00
2024-11-06 20:20:29 +01:00
```jsonc
{
...
"some_new_key": "Some new key",
...
}
2024-11-06 21:18:24 +01:00
```
## Documentation
Usage and other technical details about the project can be found here:
[**Docs**](./docs/README.md)
## Copyright & License
Copyright 2021-2025 New Vector Ltd
This software is dual-licensed by New Vector Ltd (Element). It can be used either:
(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
(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 the Licenses.