{"id":13573901,"url":"https://github.com/element-hq/element-call","last_synced_at":"2026-04-27T10:00:57.218Z","repository":{"id":37799852,"uuid":"386767233","full_name":"element-hq/element-call","owner":"element-hq","description":"Group calls powered by Matrix","archived":false,"fork":false,"pushed_at":"2026-04-23T16:55:38.000Z","size":32273,"stargazers_count":934,"open_issues_count":412,"forks_count":185,"subscribers_count":26,"default_branch":"livekit","last_synced_at":"2026-04-23T17:12:54.202Z","etag":null,"topics":["matrix","matrixrtc","videoconference","voip"],"latest_commit_sha":null,"homepage":"https://call.element.io","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/element-hq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-AGPL-3.0","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-16T21:22:30.000Z","updated_at":"2026-04-23T15:06:54.000Z","dependencies_parsed_at":"2022-06-22T17:44:50.937Z","dependency_job_id":"697bc27b-0bf4-4f1e-a20d-2c1c66d8bc08","html_url":"https://github.com/element-hq/element-call","commit_stats":null,"previous_names":["element-hq/element-call","vector-im/element-call"],"tags_count":161,"template":false,"template_full_name":null,"purl":"pkg:github/element-hq/element-call","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/element-hq%2Felement-call","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/element-hq%2Felement-call/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/element-hq%2Felement-call/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/element-hq%2Felement-call/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/element-hq","download_url":"https://codeload.github.com/element-hq/element-call/tar.gz/refs/heads/livekit","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/element-hq%2Felement-call/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32331305,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["matrix","matrixrtc","videoconference","voip"],"created_at":"2024-08-01T15:00:43.084Z","updated_at":"2026-04-27T10:00:57.184Z","avatar_url":"https://github.com/element-hq.png","language":"TypeScript","funding_links":[],"categories":["Collaboration"],"sub_categories":["Video Conferencing (Zoom, Webex, Google Meet, Skype... alternatives)"],"readme":"# Element Call\n\n[![Chat](https://img.shields.io/matrix/webrtc:matrix.org)](https://matrix.to/#/#webrtc:matrix.org)\n[![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)\n[![License](https://img.shields.io/github/license/element-hq/element-call)](LICENSE-AGPL-3.0)\n[![Codecov](https://img.shields.io/codecov/c/github/element-hq/element-call)](https://app.codecov.io/gh/element-hq/element-call)\n\n[🎬 Live Demo 🎬](https://call.element.io)\n\nThe world's first 🌐 decentralized and 🤝 federated video conferencing solution\npowered by **the Matrix protocol**.\n\n## 📌 Overview\n\n**Element Call** is a native Matrix video conferencing application developed by\n[Element](https://element.io/), designed for **secure**, **scalable**,\n**privacy-respecting**, and **decentralized** video and voice calls over the\nMatrix protocol. Built on **MatrixRTC**\n([MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143)), it\nutilizes\n**[MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)**\nwith **[LiveKit](https://livekit.io/)** as its backend.\n\n![A demo of Element Call with six people](demo.gif)\n\nYou can find the latest development version continuously deployed to\n[call.element.dev](https://call.element.dev/).\n\n\u003e [!NOTE]\n\u003e For prior version of the Element Call that relied solely on full-mesh logic,\n\u003e check [`full-mesh`](https://github.com/element-hq/element-call/tree/full-mesh)\n\u003e branch.\n\n## ✨ Key Features\n\n✅ **Decentralized \u0026 Federated** – No central authority; works across Matrix\nhomeservers.  \n✅ **End-to-End Encrypted** – Secure and private calls.  \n✅ **Standalone \u0026 Widget Mode** – Use as an independent app or embed in Matrix\nclients.  \n✅ **WebRTC-based** – No additional software required.  \n✅ **Scalable with LiveKit** – Supports large meetings via SFU\n([MSC4195: MatrixRTC using LiveKit backend](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)).  \n✅ **Raise Hand** – Participants can signal when they want to speak, helping to\norganize the flow of the meeting.  \n✅ **Emoji Reactions** – Users can react with emojis 👍️ 🎉 👏 🤘, adding\nengagement and interactivity to the conversation.\n\n## 🚀 Deployment \u0026 Packaging Options\n\nElement Call is developed using the\n[Matrix js-sdk](https://github.com/matrix-org/matrix-js-sdk) with Matroska mode.\nThis allows the app to run either as a Standalone App directly connected to a\nhomeserver with login interfaces or it can be used as a widget within a Matrix\nclient.\n\n### 🖥️ Standalone Mode\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/element_call_standalone.drawio.png\" alt=\"Element Call in Standalone Mode\"\u003e\n\u003c/p\u003e\n\nIn Standalone mode, Element Call operates as an independent, full-featured video\nconferencing web application, enabling users to join or host calls without\nrequiring a separate Matrix client.\n\n### 📲 In-App Calling (Widget Mode in Messenger Apps)\n\nWhen used as a widget 🧩, Element Call is solely responsible on the core calling\nfunctionality (MatrixRTC). Authentication, event handling, and room state\nupdates (via the Client-Server API) are handled by the hosting client.\nCommunication between Element Call and the client is managed through the widget\nAPI.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/element_call_widget.drawio.png\" alt=\"Element Call in Widget Mode\"\u003e\n\u003c/p\u003e\n\nElement Call can be embedded as a widget inside apps like\n[**Element Web**](https://github.com/element-hq/element-web) or **Element X\n([iOS](https://github.com/element-hq/element-x-ios),\n[Android](https://github.com/element-hq/element-x-android))**, bringing\n**MatrixRTC** capabilities to messenger apps for seamless decentralized video\nand voice calls within Matrix rooms.\n\n\u003e [!IMPORTANT]\n\u003e Embedded packaging is recommended for Element Call in widget mode!\n\n### 📦 Element Call Packaging\n\nElement Call offers two packaging options: one for standalone or widget\ndeployment, and another for seamless widget-based integration into messenger\napps. Below is an overview of each option.\n\n**Full Package** – Supports both **Standalone** and **Widget** mode. It is\nhosted as a static web page and can be accessed via a URL when used as a widget.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/full_package.drawio.png\" alt=\"Element Call Full Package\"\u003e\n\u003c/p\u003e\n\n**Embedded Package** – Designed specifically for **Widget mode** only. It is\nbundled with a messenger app for seamless integration and this is the\nrecommended method for embedding Element Call.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/embedded_package.drawio.png\" alt=\"Element Call Embedded Package\"\u003e\n\u003c/p\u003e\n\nFor more details on the packages, see the\n[Embedded vs. Standalone Guide](./docs/embedded_standalone.md).\n\n## 🛠️ Self-Hosting\n\nFor operating and deploying Element Call on your own server, refer to the\n[**Self-Hosting Guide**](./docs/self_hosting.md).\n\n## 🧭 MatrixRTC Backend Discovery and Selection\n\nFor proper Element Call operation each site deployment needs a MatrixRTC backend\nsetup as outlined in the [Self-Hosting](#self_hosting). A typical federated site\ndeployment for three different sites A, B and C is depicted below.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/Federated_Setup.drawio.png\" alt=\"Element Call federated setup\"\u003e\n\u003c/p\u003e\n\n### Backend Discovery\n\nMatrixRTC backend (according to\n[MSC4143](https://github.com/matrix-org/matrix-spec-proposals/pull/4143)) is\nannounced by the Matrix site's `.well-known/matrix/client` file and discovered\nvia the `org.matrix.msc4143.rtc_foci` key, e.g.:\n\n```json\n\"org.matrix.msc4143.rtc_foci\": [\n    {\n        \"type\": \"livekit\",\n        \"livekit_service_url\": \"https://matrix-rtc.example.com/livekit/jwt\"\n    },\n]\n```\n\nwhere the format for MatrixRTC using LiveKit backend is defined in\n[MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md).\nIn the example above Matrix clients do discover a focus of type `livekit` which\npoints them to a [MatrixRTC Authorization Service](https://github.com/element-hq/lk-jwt-service)\nvia `livekit_service_url`.\n\n### Backend Selection\n\n- Each call participant proposes their discovered MatrixRTC backend from\n  `org.matrix.msc4143.rtc_foci` in their `org.matrix.msc3401.call.member` state event.\n- For **LiveKit** MatrixRTC backend\n  ([MSC4195](https://github.com/hughns/matrix-spec-proposals/blob/hughns/matrixrtc-livekit/proposals/4195-matrixrtc-livekit.md)),\n  the **first participant who joined the call** defines via the `foci_preferred`\n  key in their `org.matrix.msc3401.call.member` which actual MatrixRTC backend\n  will be used for this call.\n- During the actual call join flow, the **[MatrixRTC Authorization Service](https://github.com/element-hq/lk-jwt-service)**\n  provides the client with the **LiveKit SFU WebSocket URL** and an\n  **access JWT token** in order to exchange media via WebRTC.\n\nThe example below illustrates how backend selection works across **Matrix\nfederation**, using the setup from sites A, B, and C. It demonstrates backend\nselection for **Matrix rooms 123 and 456**, which include users from different\nhomeservers.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./docs/SFU_selection.drawio.png\" alt=\"Element Call SFU selection over Matrix federation\"\u003e\n\u003c/p\u003e\n\n## 🌍 Translation\n\nIf you'd like to help translate Element Call, head over to\n[Localazy](https://localazy.com/p/element-call). You're also encouraged to join\nthe [Element Translators](https://matrix.to/#/#translators:element.io) space to\ndiscuss and coordinate translation efforts.\n\n## 🛠️ Development\n\n### Frontend\n\nTo get started clone and set up this project:\n\n```sh\ngit clone https://github.com/element-hq/element-call.git\ncd element-call\ncorepack enable\npnpm install\n```\n\nTo use it, create a local config by, e.g.,\n`cp ./config/config.devenv.json ./public/config.json` and adapt it if necessary.\nThe `config.devenv.json` config should work with the backend development\nenvironment as outlined in the next section out of box.\n\nYou're now ready to launch the development server:\n\n```sh\npnpm dev\n```\n\nSee also:\n\n- [Developing with linked packages](./linking.md)\n\n### Backend\n\nA docker compose file `dev-backend-docker-compose.yml` is provided to start the\nwhole stack of components which is required for a local development environment\nincluding federation:\n\n- Minimum Synapse Setup (servernameis: `synapse.m.localhost`, `synapse.othersite.m.localhost`)\n- MatrixRTC Authorization Service (Note requires Federation API and hence a TLS reverse proxy)\n- Minimum LiveKit SFU setup using dev defaults for config\n- Minimum `localhost` Certificate Authority (CA) for Transport Layer Security (TLS)\n  - Hostnames: `m.localhost`, `*.m.localhost`, `*.othersite.m.localhost`\n  - Add [./backend/dev_tls_local-ca.crt](./backend/dev_tls_local-ca.crt) to your web browsers trusted\n    certificates\n- Minimum TLS reverse proxy for\n  - Synapse homeserver: `synapse.m.localhost` and `synapse.othersite.m.localhost`\n  - MatrixRTC backend: `matrix-rtc.m.localhost` and `matrix-rtc.othersite.m.localhost`\n  - Local Element Call development `call.m.localhost` via `yarn dev --host `\n  - Element Web `app.m.localhost` and `app.othersite.m.localhost`\n  - Note certificates will expire on Thr, 20 September 2035 14:27:35 CEST\n\nThese use a test 'secret' published in this repository, so this must be used\nonly for local development and **_never be exposed to the public Internet._**\n\nRun backend components:\n\n```sh\npnpm backend\n# or  for podman-compose\n# podman-compose -f dev-backend-docker-compose.yml up\n```\n\n\u003e [!NOTE]\n\u003e To ensure your local development frontend functions properly, you’ll need to\n\u003e add certificate exceptions in your browser for `https://localhost:3000`,\n\u003e `https://matrix-rtc.m.localhost/livekit/jwt/healthz` and\n\u003e `https://synapse.m.localhost/.well-known/matrix/client`. This can be either\n\u003e done by adding the minimum localhost CA\n\u003e ([./backend/dev_tls_local-ca.crt](./backend/dev_tls_local-ca.crt)) to your web\n\u003e browsers trusted certificates or by simply copying and pasting each URL into\n\u003e your browser’s address bar and follow the prompts to add the exception.\n\n### Playwright tests\n\nOur Playwright tests run automatically as part of our CI along with our other\ntests, on every pull request.\n\nYou may need to follow instructions to set up your development environment for\nrunning Playwright by following\n\u003chttps://playwright.dev/docs/browsers#install-browsers\u003e and\n\u003chttps://playwright.dev/docs/browsers#install-system-dependencies\u003e.\n\nHowever the Playwright tests are run, an element-call instance must be running\non https://localhost:3000 (this is configured in `playwright.config.ts`) - this\nis what will be tested.\n\nThe local backend environment should be running for the test to work:\n`pnpm backend`\n\nThere are a few different ways to run the tests yourself. The simplest is to\nrun:\n\n```shell\npnpm run test:playwright\n```\n\nThis will run the Playwright tests once, non-interactively.\n\nThere is a more user-friendly way to run the tests in interactive mode:\n\n```shell\npnpm run test:playwright:open\n```\n\nThe easiest way to develop new test is to use the codegen feature of Playwright:\n\n```shell\nnpx playwright codegen\n```\n\nThis will record your action and write the test code for you. Use the tool bar\nto test visibility, text content and clicking.\n\n##### Investigate a failed test from the CI\n\nIn the failed action page, click on the failed job, then scroll down to the\n`upload-artifact` step. You will find a link to download the zip report, as per:\n\n```\nArtifact playwright-report has been successfully uploaded! Final size is 1360358 bytes. Artifact ID is 2746265841\nArtifact download URL: https://github.com/element-hq/element-call/actions/runs/13837660687/artifacts/2746265841\n```\n\nUnzip the report then use this command to open the report in your browser:\n\n```shell\nnpx playwright show-report ~/Downloads/playwright-report/\n```\n\nUnder the failed test there is a small icon looking like \"3 columns\" (next to\nthe test name file name), click on it to see the live screenshots/console\noutput.\n\n### Test Coverage\n\n\u003cimg src=\"https://codecov.io/github/element-hq/element-call/graphs/tree.svg?token=O6CFVKK6I1\"\u003e\u003c/img\u003e\n\n### Add a new translation key\n\nTo add a new translation key you can do these steps:\n\n1. Add the new key entry to the code where the new key is used:\n   `t(\"some_new_key\")`\n1. Run `pnpm i18n` to extract the new key and update the translation files. This\n   will add a skeleton entry to the `locales/en/app.json` file:\n\n   ```jsonc\n   {\n       ...\n       \"some_new_key\": \"\",\n       ...\n   }\n   ```\n\n1. Update the skeleton entry in the `locales/en/app.json` file with the English\n   translation:\n\n   ```jsonc\n   {\n       ...\n       \"some_new_key\": \"Some new key\",\n       ...\n   }\n   ```\n\n## 📖 Documentation\n\nUsage and other technical details about the project can be found here:\n\n[**Docs**](./docs/README.md)\n\n## 📝 Copyright \u0026 License\n\nCopyright 2021-2025 New Vector Ltd\n\nThis software is dual-licensed by New Vector Ltd (Element). It can be used\neither:\n\n(1) for free under the terms of the GNU Affero General Public License (as\npublished by the Free Software Foundation, either version 3 of the License, or\n(at your option) any later version); OR\n\n(2) under the terms of a paid-for Element Commercial License agreement between\nyou and Element (the terms of which may vary depending on what you and Element\nhave agreed to). Unless required by applicable law or agreed to in writing,\nsoftware distributed under the Licenses is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\nLicenses for the specific language governing permissions and limitations under\nthe Licenses.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felement-hq%2Felement-call","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felement-hq%2Felement-call","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felement-hq%2Felement-call/lists"}