├── .github └── workflows │ └── gh-pages.yml ├── .gitignore ├── .nvmrc ├── LICENSE ├── README.md ├── docs ├── architecture.md ├── assets │ ├── ArchitectureDiagram.drawio │ ├── ArchitectureDiagram.png │ ├── appstore-badge.png │ ├── docker-jitsi-meet.png │ ├── f-droid-badge.png │ ├── google-play-badge.png │ ├── iOS_screensharing_1.png │ ├── iOS_screensharing_2.png │ ├── iOS_screensharing_3.png │ ├── iOS_screensharing_4.png │ ├── reservation-api.png │ ├── reservation-api.svg │ ├── user_guide_join_meeting.png │ └── user_guide_start_meeting.png ├── community │ ├── intro.md │ └── third-party-software.md ├── dev-guide │ ├── android-sdk.md │ ├── configuration.md │ ├── contributing.md │ ├── electron-sdk.md │ ├── flutter-sdk.md │ ├── iframe-commands.md │ ├── iframe-events.md │ ├── iframe-functions.md │ ├── iframe.md │ ├── ios-sdk.md │ ├── ljm-api.md │ ├── ljm.md │ ├── mobile-dropbox.md │ ├── mobile-feature-flags.md │ ├── mobile-google-auth.md │ ├── mobile-jitsi-meet.md │ ├── react-native-sdk.md │ ├── react-sdk.md │ ├── web-integrations.md │ └── web-jitsi-meet.md ├── devops-guide │ ├── bsd.md │ ├── cloud-api.md │ ├── devops-guide.md │ ├── docker.md │ ├── faq.md │ ├── ldap-authentication.md │ ├── log-analyser.md │ ├── opensuse.md │ ├── quickstart.md │ ├── requirements.md │ ├── reservation.md │ ├── scalable.md │ ├── secure-domain.md │ ├── speakerstats.md │ ├── turn.md │ ├── video-sipgw.md │ └── videotutorials.md ├── faq.md ├── intro.md ├── releases.md ├── security.md └── user-guide │ ├── advanced.md │ ├── basic.md │ ├── browsers.md │ ├── client-connection-status-indicators.md │ ├── jitsi-meet-for-google-calendar.md │ ├── join-a-jitsi-meeting.md │ ├── keyboard-shortcuts.md │ ├── share-a-jitsi-meeting.md │ ├── start-a-jitsi-meeting.md │ └── use-jitsi-meet-on-mobile.md ├── docusaurus.config.js ├── package-lock.json ├── package.json ├── sidebars.js ├── src ├── css │ └── custom.css └── pages │ ├── help.md │ ├── index.js │ └── styles.module.css └── static ├── .nojekyll └── img ├── 8x8-copyright-icon.svg ├── favicon.svg ├── logo.svg ├── undraw_code_review.svg ├── undraw_going_up.svg ├── undraw_online.svg ├── undraw_real_time_sync.svg └── undraw_tweetstorm.svg /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: Build GH pages and deploy if on master 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | build-deploy: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version-file: '.nvmrc' 17 | 18 | - name: Build 19 | run: npm ci && npm run build 20 | 21 | - name: Deploy 22 | uses: peaceiris/actions-gh-pages@v2.5.0 23 | if: ${{ github.ref == 'refs/heads/master' }} 24 | env: 25 | ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }} 26 | PUBLISH_BRANCH: gh-pages 27 | PUBLISH_DIR: ./build 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules 4 | translated_docs 5 | build 6 | yarn.lock 7 | .docusaurus 8 | .vscode 9 | .idea 10 | 11 | *~ 12 | *.sw? 13 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The Jitsi Handbook 2 | 3 | This is The Jitsi Handbook. Your one-stop shop for Jitsi documentation. It's powered by [Docusaurus](https://docusaurus.io/). 4 | The documentation website can be found [here](https://jitsi.github.io/handbook/). 5 | 6 | ## Building the site 7 | 8 | The site is built automatically with every push thanks to a [GH Actions](https://github.com/jitsi/handbook/blob/master/.github/workflows/gh-pages.yml). 9 | 10 | **NOTE:** You need to have Node.Js(>=16) installed in your system to build this site. NodeJs can be downloaded from [here](https://nodejs.org/en/download/) 11 | 12 | If you want to build it locally, follow these simple steps: 13 | 14 | 1. Clone the repository 15 | 16 | ```shell 17 | git clone https://github.com/jitsi/handbook.git 18 | ``` 19 | 20 | 2. Move to the folder where the repository is cloned 21 | 22 | ```shell 23 | cd handbook 24 | ``` 25 | 26 | 3. Install the dependencies 27 | 28 | ```shell 29 | npm install 30 | ``` 31 | 32 | 4. Start the website 33 | 34 | ```shell 35 | npm start 36 | ``` 37 | 38 | The website will be running at http://127.0.0.1:3000/handbook/ 39 | 40 | You can now edit the files in the `docs` folder and the site will reflect the changes immediately thanks to 41 | live reloading. 42 | 43 | ## Contributing 44 | 45 | We appreciate all contributions to this repository. Please make a Pull Request, no matter how small, all contributions 46 | are valuable! 47 | 48 | Please follow the given [Contributing Guidelines](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-contributing) before submitting a pull request. 49 | -------------------------------------------------------------------------------- /docs/architecture.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: architecture 3 | title: Architecture 4 | --- 5 | 6 | In this section, a global overview of the Jitsi infrastructure is provided. If you just started contributing to the project, we highly recommend reading this section thoroughly. 7 | 8 | 9 | ## Components 10 | Jitsi comprises a [collection of projects](https://jitsi.org/projects/): 11 | 12 | * [Jitsi Meet](https://jitsi.org/jitsi-meet) - WebRTC compatible JavaScript application that uses Jitsi Videobridge to provide high-quality, scalable video conferences. Build upon React and React Native. 13 | * [Jitsi Videobridge (JVB)](https://jitsi.org/jitsi-videobridge) - WebRTC compatible server designed to route video streams amongst participants in a conference. 14 | * [Jitsi Conference Focus (jicofo)](https://github.com/jitsi/jicofo) - server-side focus component used in Jitsi Meet conferences that manages media sessions and acts as a load balancer between each of the participants and the videobridge. 15 | * [Jitsi Gateway to SIP (jigasi)](https://github.com/jitsi/jigasi) - server-side application that allows regular SIP clients to join Jitsi Meet conferences 16 | * [Jitsi Broadcasting Infrastructure (jibri)](https://github.com/jitsi/jibri) - set of tools for recording and/or streaming a Jitsi Meet conference that works by launching a Chrome instance rendered in a virtual framebuffer and capturing and encoding the output with ffmpeg. 17 | 18 | External Software used by Jitsi: 19 | * [Prosody](https://prosody.im/) - XMPP server used for signalling 20 | 21 | 22 | ## Architecture Diagram 23 | The individual connections between the previously described components, as well as their external integrations are described in the figure below. 24 | 25 | ![](https://raw.githubusercontent.com/jitsi/handbook/master/docs/assets/ArchitectureDiagram.png) 26 | 27 | The external connections can be categorized into two main groups. Firstly, the connections between clients that request a video or audio connection are performed through remote requests and data streams. The second category of external connections is those to external services that help store recordings, stream recordings, stream videos, or help with creating meetings. 28 | 29 | ## Code Map 30 | In this section, we will look at the main parts of the codebase and see what they can be used for. 31 | 32 | **./react/features** 33 | This folder is where it is best to start writing your code, as it contains most of the app components that are used in the apps on Android and iOS, as well as on the web version. This source folder is split up into all the different features that Jitsi has to offer, such as authentication, chat interaction, keyboard shortcuts, screenshot capture, remote control, and virtual background. Each of these features has a folder in this map, which is then again split up to keep a hierarchy and consistency throughout the code. 34 | 35 | Each feature folder consists of a subfolder called components, in this folder all of the React, or React Native for mobile, components are expressed. Usually, in this folder there will be a separation between native and web components, however, in some cases, the same component could be used for both Android, iOS, and web browsers, in which case there is no separation made. 36 | 37 | As stated before, the codebase mostly consists of React and React Native, which is the React version for mobile applications. Most of the features make use of the so-called class component by React [^class-comp], however, some new features start to use the new way to write functional components by using hooks[^func-comp]. 38 | 39 | The application makes use of React Redux as well, this is used as a general state store to keep track of important parameters that are used throughout the application. More on React Redux can be found here [^react-redux]. 40 | 41 | Most features also contain a file called `middleware.js`. This file acts as a bridge between the component and the functionality of the rest of the application. 42 | 43 | **./modules/external-api** 44 | In this folder, the external API can be found. This API can be used in various events like participants joining/leaving the meeting, changes in avatars or chat, as well as errors in using the microphone or camera. 45 | 46 | **./android and ./ios** 47 | Both of these folders contain the basics of the Android and iOS apps respectively. However, the code for the application itself and its components can be found in the **react/features** folder, which is explained earlier in this section. 48 | 49 | **./conference.js** 50 | This file can be found at the root of the project and contains the foundation of any interaction between a user and a conference room. This consists of setting up a connection to it, joining the meeting room, muting and unmuting, but also functions to gather information about the participants that are in the room. 51 | 52 | **./lang** 53 | This folder contains all the different translations that are present in Jitsi Meet. The translations can be found in the code with each of the keys in the translation maps that can be found in the `main-[language].json` files. 54 | 55 | **./css** 56 | This folder contains all the CSS that is used in the project. The files (mostly .scss files[^scss]) are split up into features like the React features that they are used in. 57 | 58 | ## Testing 59 | The main form of testing code changes is done through torture tests, next to this the code is tested manually. 60 | 61 | The torture tests are located in a separate repository, [Jitsi Meet Torture](https://github.com/jitsi/jitsi-meet-torture). The project contains end-to-end tests for several key functions such as peer-to-peer and invites. The testing can be done for iOS, Android, and the web, which are all the platforms that Jitsi Meet can be used on. The testing is done automatically for pull requests by project members, where it is used in combination with the continuous integration by a Jenkins instance running the tests, testing on the [meet.jit.si](https://meet.jit.si) instance. Other members can run the tests locally. The test results can be viewed on an automatically generated web page. 62 | 63 | Manual testing is performed while doing code reviews, however, there are also testing releases that can be freely downloaded and deployed or can be used on the [beta test server](https://beta.meet.jit.si/). 64 | -------------------------------------------------------------------------------- /docs/assets/ArchitectureDiagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/ArchitectureDiagram.png -------------------------------------------------------------------------------- /docs/assets/appstore-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/appstore-badge.png -------------------------------------------------------------------------------- /docs/assets/docker-jitsi-meet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/docker-jitsi-meet.png -------------------------------------------------------------------------------- /docs/assets/f-droid-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/f-droid-badge.png -------------------------------------------------------------------------------- /docs/assets/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/google-play-badge.png -------------------------------------------------------------------------------- /docs/assets/iOS_screensharing_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/iOS_screensharing_1.png -------------------------------------------------------------------------------- /docs/assets/iOS_screensharing_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/iOS_screensharing_2.png -------------------------------------------------------------------------------- /docs/assets/iOS_screensharing_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/iOS_screensharing_3.png -------------------------------------------------------------------------------- /docs/assets/iOS_screensharing_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/iOS_screensharing_4.png -------------------------------------------------------------------------------- /docs/assets/reservation-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/reservation-api.png -------------------------------------------------------------------------------- /docs/assets/user_guide_join_meeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/user_guide_join_meeting.png -------------------------------------------------------------------------------- /docs/assets/user_guide_start_meeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jitsi/handbook/ab83bf1a708c399237e21c94513ef5265fb27ddc/docs/assets/user_guide_start_meeting.png -------------------------------------------------------------------------------- /docs/community/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: community-intro 3 | title: Our community 4 | --- 5 | 6 | Jitsi Meet and all accompanying Jitsi projects are maintained by a community of 7 | passionate individuals and corporations. 8 | 9 | If you have questions, need help, or want to make suggestions, please join our community 10 | [here](https://community.jitsi.org/). 11 | 12 |
13 | 14 | import DocCardList from '@theme/DocCardList'; 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/community/third-party-software.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: third-party-software 3 | title: Third-Party Software 4 | --- 5 | 6 | This page contains links to projects around Jitsi Meet, which are not maintained 7 | by the Jitsi team. 8 | 9 | Please keep this list in alphabetical order. 10 | 11 | :::warning 12 | As these packages are not maintained by the Jitsi team, please ask their 13 | respective forums / issue trackers for help if you find issues. 14 | ::: 15 | 16 | ## Cketti's Jitsi Hacks 17 | 18 | Some extra features using injected scripts. 19 | 20 | https://jitsi-hacks.cketti.eu/ 21 | 22 | ## Eparto Virtual Phone 23 | 24 | This is a Chrome extension that allow users to use their browser as a virtual 25 | phone and to make Jitsi-based calls without opening any web site. 26 | 27 | Chrome web store: 28 | [Eparto virtual phone extension](https://chromewebstore.google.com/detail/eparto-virtual-phone/njihflnogjnjnmflicfongbnehhpkhmj) 29 | 30 | GitHub: https://github.com/emrahcom/eparto-virtual-phone 31 | 32 | ## Flutter plugin 33 | 34 | Plugin for Flutter. 35 | 36 | https://pub.dev/packages/jitsi_meet 37 | 38 | ## Galaxy 39 | 40 | Galaxy is a web application for Jitsi admins and users to organize their Jitsi 41 | meetings, meeting schedules, and attendees. It supports 42 | [JaaS](https://jaas.8x8.vc/) and self-hosted Jitsi deployments. 43 | 44 | GitHub: https://github.com/emrahcom/galaxy 45 | 46 | Demo: https://eparto.net 47 | 48 | ## Galaxy-kc 49 | 50 | This is the version of `Galaxy` that uses `Keycloak` as the identity provider. 51 | 52 | https://github.com/emrahcom/galaxy-kc 53 | 54 | ## GStreamer pipeline integration 55 | 56 | Integrate Jitsi Meet conferences with GStreamer pipelines. 57 | 58 | https://github.com/avstack/gst-meet 59 | 60 | ## GStreamer plugin in C++ 61 | 62 | Jitsi Meet GStreamer plugin 63 | 64 | https://github.com/mojyack/gstjitsimeet 65 | 66 | ## Jitok: Jitsi Token generator 67 | 68 | Helper web tool and API for generating Jitsi Meet compatible JWT. 69 | 70 | GitHub: https://github.com/jitsi-contrib/jitok 71 | 72 | Demo: https://jitok.emrah.com/ 73 | 74 | Discussion: https://community.jitsi.org/t/jitok-jitsi-token-generator/94683 75 | 76 | ## Jitsi-Admin 77 | 78 | An open-source platform to organize your meetings. Includes all functions we 79 | know from the big conference-tools 80 | 81 | - Plan your Meeting 82 | - Secure your Meeting with user login credentials 83 | - Create a Report of each user visiting your conference 84 | - Create an appointment poll and transfer it into a conference with one click 85 | - Dockerised for easy installation 86 | 87 | Github: https://github.com/H2-invent/jitsi-admin 88 | 89 | Demo: https://jitsi-admin.de 90 | 91 | Docker: 92 | https://github.com/H2-invent/jitsi-admin/wiki/Install-jitsi-admin-in-docker 93 | 94 | ## Jitsi Config Differ 95 | 96 | Web app to compare reference configs between different Jitsi releases. This aims 97 | to help users identify potential changes in config keys and default values when 98 | upgrading their deployment. 99 | 100 | https://shawnchin.github.io/jitsi-config-differ/ 101 | 102 | Github: https://github.com/shawnchin/jitsi-config-differ 103 | 104 | ## Jitsi URL Generator 105 | 106 | A simple tool to illustrate how URL params can be composed to customize Jitsi. 107 | It only exposes a small fraction of what is possible, but should hopefully help 108 | build familiarity which users can then apply to other config values in the 109 | whitelist. 110 | 111 | https://shawnchin.github.io/jitsi-url-generator/ 112 | 113 | Github: https://github.com/shawnchin/jitsi-url-generator 114 | 115 | ## KeyCloak adapter 116 | 117 | Allow Jitsi to use Keycloak as an identity and OIDC provider. 118 | 119 | https://github.com/nordeck/jitsi-keycloak-adapter 120 | 121 | ## KeyCloak integration 122 | 123 | Integration of KeyCloak for authentication. 124 | 125 | https://github.com/D3473R/jitsi-keycloak 126 | 127 | ## Outlook Plugin 128 | 129 | Plugin for Adding a "Schedule Jitsi Meeting" Button to Microsoft Outlook. 130 | 131 | GitHub: https://github.com/timetheoretical/jitsi-meet-outlook 132 | 133 | ## Outlook Pluigin 134 | 135 | Plugin for Adding a "Schedule Jitsi Meeting" Button to Microsoft Outlook. 136 | Written according to Microsoft's modern architecture. 137 | 138 | GitHub: https://github.com/diggsweden/jitsi-outlook 139 | 140 | ## Prosody Plugins 141 | 142 | Collection of community-contributed prosody plugins that can be added to 143 | self-hosted Jitsi deployments. 144 | 145 | https://github.com/jitsi-contrib/prosody-plugins 146 | 147 | - **event_sync**: Sends HTTP POST to external API when occupant or room events 148 | are triggered. 149 | - **frozen_nick**: Prevents users from changing their display name if JWT auth 150 | is used and name is provided in token context. 151 | - **jibri_autostart**: Automatically starts recording when the moderator enters 152 | the room. 153 | - **lobby_autostart**: Automatically enables lobby for all rooms. 154 | - **per_room_max_occupants**: Set different max occupants based on room name and 155 | subdomain. 156 | - **secure_domain_lobby_bypass**: Allows secure domain authenticated users to 157 | bypass lobby. 158 | - **time_restricted**: Sets a time limit on rooms and terminates the conference 159 | when the time is up. 160 | - **token_affiliation**: Promotes users to moderators based on affiliation 161 | property in token (JWT). 162 | - **token_lobby_bypass**: Enables some users to bypass lobby based on a flag in 163 | token (JWT). 164 | - **token_lobby_ondemand**: Activates lobby based on a flag in token (JWT). 165 | - **token_owner_party**: Prevents unauthorized users from create a room and 166 | terminates the conference when the owner leaves. 167 | 168 | ## SAML to Jitsi JWT Authentification 169 | 170 | Intergration of SAML authentification with Shibboleth for a Jitsi Meet JWT 171 | generator. 172 | 173 | Github: https://github.com/Renater/Jitsi-SAML2JWT 174 | 175 | ## Unity plugin 176 | 177 | Plugin for using lib-jitsi-meet in a Unity environment (WebGL). 178 | 179 | https://github.com/avstack/jitsi-meet-unity-demo 180 | 181 | Plugin for using lib-jitsi-meet in a Unity environment (Android and iOS). 182 | 183 | https://github.com/SariskaIO/Sariska-Media-Unity-Demo 184 | 185 | ## Generic OIDC and SAML adapter 186 | 187 | Add support for OIDC and SAML to Jitsi with JWT and anonymous domain activated. 188 | Authenticaten for the meeting host, allowing guests to join without requiring 189 | authentication. 190 | 191 | Github: https://github.com/aadpM2hhdixoJm3u/jitsi-OIDC-SAML-adapter 192 | 193 | Github: https://github.com/aadpM2hhdixoJm3u/jitsi-OIDC-adapter 194 | -------------------------------------------------------------------------------- /docs/dev-guide/contributing.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-contributing 3 | title: Contributing Guidelines 4 | --- 5 | 6 | # 🤝 How to Contribute 7 | We greatly appreciate your willingness to contribute ❤️ Before you start working however, please take a moment to read and follow this brief guide. 8 | 9 | # 📥 Reporting Issues and Asking Questions 10 | 11 | - We prefer issues to be discussed first in the [community forum](https://community.jitsi.org/) and when confirmed, then an issue can be opened in the issue tracker of the appropriate project on GitHub. 12 | 13 | - Feel free to report ***any bugs, ask for new features or anything else*** you need help with. When opening an issue, please provide as much information as possible. 14 | 15 | - Please ask any general and implementation specific questions on the [community forum](https://community.jitsi.org/) for support. 16 | 17 | ### 🪲 Bug Reports and Other Issues 18 | 19 | For bugs please follow these steps: 20 | 21 | - **Provide Detailed Information:** 22 | Include versions of Jitsi Meet, Jicofo, and JVB. 23 | 24 | - **Description of the Issue:** 25 | Clearly explain the problem encountered. 26 | 27 | - **Reproduction Steps:** 28 | Provide step-by-step instructions to recreate the issue. 29 | 30 | - **Expected Behavior:** 31 | Describe the expected outcome when using the software. 32 | 33 | - **Actual Behavior:** 34 | Explain what actually happened, including any error messages. 35 | 36 | ### 💟 Feature Requests 37 | 38 | If you have an idea for a new feature or something you'd like to see improved in Jitsi, here's how you can let us know: 39 | 40 | - **Describe the feature:** Specify the desired functionality. 41 | - **Provide examples:** Share similar features from other apps. 42 | - **Explain importance:** Justify the feature's relevance. 43 | - **Considerations:** Assess potential challenges. 44 | - **Additional details:** Include specific preferences. 45 | 46 | # Code Contributions 47 | 48 | - Visit the issue tracker ([Jitsi Meet's for example](https://github.com/jitsi/jitsi-meet/issues)) to find a list of open issues that need attention. 49 | 50 | - Discovered a bug or have a feature request and know how to fix it? Excellent! Keep reading 🔍 51 | 52 | - The [Developer Guide](/docs/category/developer-guide) will help you to setup a development environment to start working on the Jitsi Meet applications. 53 | 54 | ## ✏️ Contributor License Agreement 55 | While the Jitsi projects are released under the 56 | [Apache License 2.0](https://github.com/jitsi/jitsi-meet/blob/master/LICENSE), the copyright 57 | holder and principal creator is [8x8](https://www.8x8.com/). To 58 | ensure that we can continue making these projects available under an Open Source license, 59 | we need you to sign our Apache-based contributor 60 | license agreement as either a [corporation](https://jitsi.org/ccla) or an 61 | [individual](https://jitsi.org/icla). If you cannot accept the terms laid out 62 | in the agreement, unfortunately, we cannot accept your contribution. 63 | 64 | ## 🔁 Creating Pull Requests 65 | - Fork the repository to your GitHub account. 66 | - Create a new branch for your changes, based on the master branch. Choose a descriptive name for your branch. 67 | - Make **one** logical change per pull request to keep things organized. 68 | - Keep your commit history clean and concise. If necessary, squash multiple commits into one. 69 | - Rebase your branch onto the latest changes in the master branch before submitting the pull request. **Never** merge master, always rebase. 70 | 71 | ### 📝 Commit messages 72 | Jitsi projects follow the [Conventional Commits](https://www.conventionalcommits.org) spec, while making the scope 73 | mandatory. 74 | 75 | That is, we use `feat(feature name) add some functionality` as opposed to `feat: add some functionality`. As projects 76 | grow large, scoping down changes is helpful. 77 | 78 | This is a non-exhaustive list of types of commits: 79 | 80 | ``` 81 | [ 82 | 'build', 83 | 'chore', 84 | 'ci', 85 | 'docs', 86 | 'feat', 87 | 'fix', 88 | 'perf', 89 | 'refactor', 90 | 'revert', 91 | 'style', 92 | 'test' 93 | ]; 94 | ``` 95 | 96 | As for what constitutes a "feature", that can vary across projects. "Subsystem" is another valid analogy. 97 | In Jitsi Meet, for example, the feature name can be the feature where you made the changes: `react/features/`. 98 | In lib-jitsi-meet, the module: `modules/`. 99 | 100 | Use your judgement and look into the commit history when in doubt. 101 | 102 | ## ❗️For 8x8 employees 103 | - Don't link any internal resources such as Jira issues, this is an Open Source project 104 | 105 | ## 📝 Coding Style 106 | 107 | ### Comments 108 | 109 | * Comments documenting the source code are required. 110 | 111 | * Comments from which documentation is automatically generated are **not** 112 | subject to case-by-case decisions. Such comments are used, for example, on 113 | types and their members. Examples of tools which automatically generate 114 | documentation from such comments include JSDoc, Javadoc, Doxygen. 115 | 116 | * Comments that are not automatically processed are strongly encouraged. They 117 | are subject to case-by-case decisions. Such comments are often observed in 118 | function bodies. 119 | 120 | * Comments should be formatted as proper English sentences. Such formatting pays 121 | attention to, for example, capitalization and punctuation. 122 | 123 | ### Duplication 124 | 125 | * Don't copy-paste source code. Reuse it. Be careful not to create bad abstractions just to reuse a small chunk of code, however. 126 | 127 | ### Naming 128 | 129 | * An abstraction should have one name within the project and across multiple 130 | projects. For example: 131 | 132 | * The instance of lib-jitsi-meet's `JitsiConnection` type should be named 133 | `connection` or `jitsiConnection` in jitsi-meet, not `client`. 134 | 135 | * The class `ReducerRegistry` should be defined in ReducerRegistry.js and its 136 | imports in other files should use the same name. Don't define the class 137 | `Registry` in ReducerRegistry.js and then import it as `Reducers` in other 138 | files. 139 | 140 | * The names of global constants (including ES6 module-global constants) should 141 | be written in uppercase with underscores to separate words. For example, 142 | `BACKGROUND_COLOR`. 143 | 144 | * The underscore character at the beginning of a name signals that the 145 | respective variable, function, or property is non-public i.e. private, protected, 146 | or internal. In contrast, the lack of an underscore at the beginning of a name 147 | signals public API. 148 | 149 | ### TypeScript 150 | 151 | #### Feature layout 152 | 153 | When adding a new feature, this would be the usual layout. 154 | 155 | ``` 156 | react/features/sample/ 157 | ├── actionTypes.ts 158 | ├── actions.ts 159 | ├── components 160 | │   ├── AnotherComponent.tsx 161 | │   └── OneComponent.tsx 162 | ├── middleware.ts 163 | └── reducer.ts 164 | ``` 165 | 166 | All new features must be written in TypeScript. When working on an old feature, 167 | converting the JavaScript files to TypeScript is encouraged. 168 | 169 | The middleware must be imported in `react/features/app/` specifically 170 | in `middlewares.any`, `middlewares.native.js` or `middlewares.web.js` where appropriate. 171 | Likewise for the reducer. 172 | 173 | In general, we want to avoid `index` files. We prefer using the full path for imports. 174 | However, there are cases where a common file (used by both web and native, eg. `actions.ts`) 175 | needs to import from components (from `/native` or from `/web`, depending on the platform the build is for). 176 | In this case, we create two `index` files in `components/`: `index.native.ts` and `index.web.ts` and export 177 | just the component we need. The common file should then be imported from `components/index`. 178 | 179 | This has not always been the case and the entire codebase hasn't been migrated to 180 | this model but new features should follow this new layout. 181 | 182 | When working on an old feature, adding the necessary changes to migrate to the new 183 | model is encouraged. 184 | 185 | #### Avoiding bundle bloat 186 | 187 | When adding a new feature it may trigger a build failure due to the increased bundle size. We have safeguards in place to avoid bundles growing disproportionately. While there are legitimate reasons for increasing the limits, please analyze the bundle first to make sure no unintended dependencies have been included, causing the increase in size. 188 | 189 | First, make a production build with bundle-analysis enabled: 190 | 191 | ``` 192 | npx webpack -p --analyze-bundle 193 | ``` 194 | 195 | Then open the interactive bundle analyzer tool: 196 | 197 | ``` 198 | npx webpack-bundle-analyzer build/app-stats.json 199 | ``` 200 | 201 | ### Kotlin 202 | 203 | - For Kotlin code we use the [standard convention](https://kotlinlang.org/docs/coding-conventions.html) and limit line length to 120 characters. We use `ktlint` to enforce formatting. 204 | 205 | ## ✅ Code Reviews 206 | 207 | - **Submit Your Contribution:** After completing your work, submit your contribution. 208 | - **Draft PRs for Discussion:** Consider opening a draft PR early to discuss your approach with the team before fully implementing it. Draft PRs facilitate early collaboration, ensuring efficient progress. 209 | - **Assign Reviewers:** Appropriate reviewers are assigned based on the affected code base and expertise required for changes. 210 | - **Review Process:** Reviewers will carefully examine your code, checking for adherence to coding standards, correctness, performance and potential issues. 211 | - **Feedback and Iteration:** If any issues or suggestions are identified during the review, you'll receive feedback from the reviewers. Address any comments or concerns raised and make necessary revisions to your code. 212 | - **Automated tests:** Once the PR is in a good state, a team member will trigger the automated tests. The PR needs to merge cleanly on top of master, and test failures or issues discovered at this stage will need to be addressed before the PR is approved for merging. 213 | - **Approval:** Once the code meets the required standards, passes the review, and tests, it will be approved for merging into the main codebase. 214 | 215 | ## 🎉 Issue Closing 216 | 217 | - You can close issues automatically with keywords in pull requests and commit messages. For more information, see "[Linking a pull request to an issue.](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword#linking-a-pull-request-to-an-issue-using-a-keyword)" 218 | -------------------------------------------------------------------------------- /docs/dev-guide/electron-sdk.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-electron-sdk 3 | title: Electron SDK 4 | --- 5 | 6 | The Jitsi Meet Electron SDK provides a toolkit for adding Jitsi Meet into electron applications with additional features for a better desktop experience. 7 | 8 | Supported Electron versions: >= 16. 9 | 10 | ## Sample Application 11 | 12 | The Jitsi Meet Electron Application is created using the Electron SDK and makes use of all its available features. The source code is available here: [jitsi-meet-electron application repository](https://github.com/jitsi/jitsi-meet-electron). 13 | 14 | ## Installation 15 | 16 | Install from npm: 17 | 18 | npm install @jitsi/electron-sdk 19 | 20 | Note: This package contains native code on Windows for the remote control module. Binary prebuilds are packaged with prebuildify as part of the npm package. 21 | 22 | ## Usage 23 | 24 | ### Screen Sharing 25 | 26 | **Requirements**: 27 | The screen sharing utility requires iframe HTML Element that will load Jitsi Meet. 28 | 29 | **Enable the screen sharing:** 30 | 31 | In the **render** electron process of the window where Jitsi Meet is displayed: 32 | 33 | ```js 34 | const { 35 | setupScreenSharingRender 36 | } = require("@jitsi/electron-sdk"); 37 | 38 | // api - The Jitsi Meet iframe api object. 39 | setupScreenSharingRender(api); 40 | ``` 41 | In the **main** electron process: 42 | 43 | ```js 44 | const { 45 | setupScreenSharingMain 46 | } = require("@jitsi/electron-sdk"); 47 | 48 | // jitsiMeetWindow - The BrowserWindow instance of the window where Jitsi Meet is loaded. 49 | // appName - Application name which will be displayed inside the content sharing tracking window 50 | // i.e. [appName] is sharing your screen. 51 | // osxBundleId - Mac Application bundleId for which screen capturer permissions will be reset if user denied them. 52 | setupScreenSharingMain(mainWindow, appName, osxBundleId); 53 | ``` 54 | 55 | **Note**: 56 | An example using screensharing in Electron without the SDK is available here: [screensharing example without the SDK](https://github.com/gabiborlea/jitsi-meet-electron-example). 57 | 58 | ### Remote Control 59 | 60 | **Requirements**: 61 | The remote control utility requires an iframe HTML Element that will load Jitsi Meet. 62 | 63 | **Enable the remote control:** 64 | 65 | In the **render** electron process of the window where Jitsi Meet is displayed: 66 | 67 | ```js 68 | const { 69 | RemoteControl 70 | } = require("@jitsi/electron-sdk"); 71 | 72 | // iframe - the Jitsi Meet iframe 73 | const remoteControl = new RemoteControl(iframe); 74 | ``` 75 | 76 | To disable the remote control: 77 | ```js 78 | remoteControl.dispose(); 79 | ``` 80 | 81 | NOTE: The `dispose` method will be called automatically when the Jitsi Meet iframe unloads. 82 | 83 | In the **main** electron process: 84 | 85 | ```js 86 | const { 87 | RemoteControlMain 88 | } = require("@jitsi/electron-sdk"); 89 | 90 | // jitsiMeetWindow - The BrowserWindow instance of the window where Jitsi Meet is loaded. 91 | const remoteControl = new RemoteControlMain(mainWindow); 92 | ``` 93 | 94 | ### Always On Top 95 | Displays a small window with the currently active speaker video when the main Jitsi Meet window is not focused. 96 | 97 | **Requirements**: 98 | 1. Jitsi Meet should be initialized through our [iframe API](https://github.com/jitsi/jitsi-meet/blob/master/doc/api.md) 99 | 2. The `BrowserWindow` instance where Jitsi Meet is displayed should use the [Chrome's window.open implementation](https://github.com/electron/electron/blob/master/docs/api/window-open.md#using-chromes-windowopen-implementation) (set `nativeWindowOpen` option of `BrowserWindow`'s constructor to `true`). 100 | 3. If you have a custom handler for opening windows you have to filter the always-on-top window. You can do this by its `frameName` argument which will be set to `AlwaysOnTop`. 101 | 102 | **Enable the aways on top:** 103 | 104 | In the **main** electron process: 105 | ```js 106 | const { 107 | setupAlwaysOnTopMain 108 | } = require("@jitsi/electron-sdk"); 109 | 110 | // jitsiMeetWindow - The BrowserWindow instance 111 | // of the window where Jitsi Meet is loaded. 112 | setupAlwaysOnTopMain(jitsiMeetWindow); 113 | ``` 114 | 115 | In the **render** electron process of the window where Jitsi Meet is displayed: 116 | ```js 117 | const { 118 | setupAlwaysOnTopRender 119 | } = require("@jitsi/electron-sdk"); 120 | 121 | const api = new JitsiMeetExternalAPI(...); 122 | const alwaysOnTop = setupAlwaysOnTopRender(api); 123 | 124 | alwaysOnTop.on('will-close', handleAlwaysOnTopClose); 125 | ``` 126 | 127 | `setupAlwaysOnTopRender` returns an instance of EventEmitter with the following events: 128 | 129 | * _dismissed_ - emitted when the always-on-top window is explicitly dismissed via its close button 130 | 131 | * _will-close_ - emitted right before the always-on-top window is going to close 132 | 133 | 134 | ### Power Monitor 135 | 136 | Provides a way to query Electron for system idle and receive power monitor events. 137 | 138 | **enable power monitor:** 139 | In the **main** electron process: 140 | ```js 141 | const { 142 | setupPowerMonitorMain 143 | } = require("@jitsi/electron-sdk"); 144 | 145 | // jitsiMeetWindow - The BrowserWindow instance 146 | // of the window where Jitsi Meet is loaded. 147 | setupPowerMonitorMain(jitsiMeetWindow); 148 | ``` 149 | 150 | In the **render** electron process of the window where Jitsi Meet is displayed: 151 | ```js 152 | const { 153 | setupPowerMonitorRender 154 | } = require("@jitsi/electron-sdk"); 155 | 156 | const api = new JitsiMeetExternalAPI(...); 157 | setupPowerMonitorRender(api); 158 | ``` 159 | 160 | ### NOTE: 161 | You'll need to add 'disable-site-isolation-trials' switch because of [https://github.com/electron/electron/issues/18214](https://github.com/electron/electron/issues/18214): 162 | ``` 163 | app.commandLine.appendSwitch('disable-site-isolation-trials') 164 | ``` 165 | 166 | For more information please check out the SDK's repository [https://github.com/jitsi/jitsi-meet-electron-sdk](https://github.com/jitsi/jitsi-meet-electron-sdk). 167 | -------------------------------------------------------------------------------- /docs/dev-guide/flutter-sdk.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-flutter-sdk 3 | title: Flutter SDK 4 | --- 5 | 6 | The Jitsi Meet Flutter SDK provides the same user experience as the Jitsi Meet app, in the form of a Flutter plugin so that you can embed and customize Jitsi Meet in your own Flutter app. 7 | 8 | ## Sample application using the Flutter 9 | 10 | If you want to see how easy integrating the Jitsi Meet Flutter SDK into a Flutter application is, take a look at the
11 | [sample applications repository](https://github.com/jitsi/jitsi-meet-sdk-samples#flutter). 12 | 13 | ## Installation 14 | 15 | ### Add dependency 16 | 17 | Add the dependency from command-line 18 | ```bash 19 | $ flutter pub add jitsi_meet_flutter_sdk 20 | ``` 21 | 22 | The command above will add this to the `pubspec.yaml` file in your project (you can do this manually): 23 | ```yaml 24 | dependencies: 25 | jitsi_meet_flutter_sdk: ^0.1.7 26 | ``` 27 | 28 | ### Install 29 | 30 | Install the packages from the terminal: 31 | 32 | ```bash 33 | $ flutter pub get 34 | ``` 35 | 36 | ### Import files 37 | 38 | Import the following files into your dart code: 39 | 40 | ```dart 41 | import 'package:jitsi_meet_flutter_sdk/jitsi_meet_flutter_sdk.dart'; 42 | ``` 43 | 44 | ### Usage 45 | 46 | #### Join meeting 47 | 48 | Firstly, create a `JitsiMeet` object, then call the method `join` from it with a `JitsiMeetConferenceOptions` object 49 | 50 | ```dart 51 | var jitsiMeet = JitsiMeet(); 52 | var options = JitsiMeetConferenceOptions(room: 'jitsiIsAwesome'); 53 | jitsiMeet.join(options); 54 | ``` 55 | 56 | ## Configuration 57 | 58 | ### iOS 59 | 60 | Make sure in `Podfile` from the `ios` directory you set the ios version `15.1 or higher` 61 | 62 | ``` 63 | platform :ios, '15.1' 64 | ``` 65 | 66 | The plugin requests camera and microphone access, make sure to include the required entries for `NSCameraUsageDescription` and `NSMicrophoneUsageDescription` in your `Info.plist` file from the `ios/Runner` directory. 67 | 68 | ```xml 69 | NSCameraUsageDescription 70 | The app needs access to your camera for meetings. 71 | NSMicrophoneUsageDescription 72 | The app needs access to your microphone for meetings. 73 | ``` 74 | 75 | ### Android 76 | 77 | Go to `android/app/build.gradle` and make sure that the `minSdkVersion` is set to at least 24` 78 | 79 | ```gradle 80 | android { 81 | ... 82 | defaultConfig { 83 | ... 84 | minSdkVersion 24 85 | } 86 | } 87 | ``` 88 | 89 | 90 | The `application:label` field from the Jitsi Meet Android SDK will conflict with your application's one . Go to `android/app/src/main/AndroidManifest.xml` and add the tools library and `tools:replace="android:label"` to the application tag. 91 | 92 | ```xml 93 | 95 | 100 | ... 101 | 102 | 103 | ``` 104 | ## Using the API 105 | 106 | ### JitsiMeet 107 | 108 | The `JitsiMeet` class is the entry point for the SDK. It is used to launch the meeting screen and to send and receive all the events. 109 | 110 | 1. #### JitsiMeet() 111 | The constructor for the class. 112 | 113 | 114 | 2. #### join(JitsiMeetConferenceOptions options, [JitsiMeetEventListener? listener]) 115 | Joins a meeting with the given options and optionally a listener is given 116 | 117 | - `options` : meeting options 118 | - `listener` : event listener for events triggered by the native SDKs 119 | 120 | 3. #### hangUp() 121 | 122 | The localParticipant leaves the current meeting. 123 | 124 | 4. #### setAudioMuted(bool muted) 125 | 126 | Sets the state of the localParticipant audio muted according to the `muted` parameter. 127 | 128 | 5. #### setVideoMuted(bool muted) 129 | Sets the state of the localParticipant video muted according to the `muted` parameter. 130 | 131 | 6. #### sendEndpointTextMessage(`{String? to, required String message}`) 132 | Sends a message via the data channel to one particular participant or all of them. If the `to` param is empty, the message will be sent to all the participants in the conference. 133 | 134 | To get the participantId, the `participantsJoined` event should be listened for, which has as a parameter the `participantId` and this should be stored somehow. 135 | 136 | 7. #### toggleScreenShare(bool enabled) 137 | Sets the state of the localParticipant screen sharing according to the `enabled` parameter. 138 | 139 | 8. #### openChat([String? to]) 140 | 141 | Opens the chat dialog. If `to` contains a valid participantId, the private chat with that particular participant will be opened. 142 | 143 | 9. #### sendChatMessage(`{String? to, required String message}`) 144 | 145 | Sends a chat message to one particular participant or all of them. If the `to` param is empty, the message will be sent to all the participants in the conference. 146 | 147 | To get the participantId, the `participantsJoined` event should be listened for, which has as a parameter the `participantId` and this should be stored somehow. 148 | 149 | 10. #### closeChat() 150 | 151 | Closes the chat dialog. 152 | 153 | 11. #### retrieveParticipantsInfo() 154 | 155 | Sends an event that will trigger the `participantsInfoRetrieved` event which will contain participants' information 156 | 157 | 158 | ### JitsiMeetConferenceOptions 159 | 160 | This object encapsulates all the options that can be tweaked when joining a conference. 161 | 162 | Example: 163 | 164 | ```dart 165 | var options = JitsiMeetConferenceOptions( 166 | serverURL: "https://meet.jit.si", 167 | room: "jitsiIsAwesomeWithFlutter", 168 | configOverrides: { 169 | "startWithAudioMuted": false, 170 | "startWithVideoMuted": false, 171 | "subject" : "Jitsi with Flutter", 172 | }, 173 | featureFlags: { 174 | "unsaferoomwarning.enabled": false 175 | }, 176 | userInfo: JitsiMeetUserInfo( 177 | displayName: "Flutter user", 178 | email: "user@example.com" 179 | ), 180 | ); 181 | ``` 182 | 183 | - All the values that can be added to the `configOverrides` can be found [here](https://github.com/jitsi/jitsi-meet/blob/master/config.js). 184 | 185 | - All the values that can be added to the `featureFlags` can be found [here](https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.ts). 186 | 187 | #### JitsiMeetUserInfo(`{String displayName, String email, String avatar}`) 188 | 189 | The constructor for the JitsiMeetUserInfo. 190 | 191 | P.S. the avatar should be an url. 192 | 193 | ### JitsiMeetEventListener 194 | 195 | This class intends to be used as a listener for events that come from the native sdks. It will receive as arguments the event handlers 196 | 197 | #### conferenceJoined(String url) 198 | 199 | Called when a conference was joined. 200 | - `url` : the conference URL 201 | 202 | #### conferenceTerminated(String url, Object? error) 203 | 204 | Called when the active conference ends, be it because of user choice or because of a failure. 205 | 206 | - `url` : the conference URL 207 | - `error` : missing if the conference finished gracefully, otherwise contains the error message 208 | 209 | #### conferenceWillJoin(String url) 210 | 211 | Called before a conference is joined. 212 | 213 | - url: the conference URL 214 | 215 | #### participantJoined(String? email, String? name, String? role, String? participantId) 216 | 217 | Called when a participant has joined the conference. 218 | 219 | - `email` : the email of the participant. It may not be set if the remote participant didn't set one. 220 | - `name` : the name of the participant. 221 | - `role` : the role of the participant. 222 | - `participantId` : the id of the participant. 223 | 224 | #### participantLeft(String? participantId) 225 | 226 | Called when a participant has left the conference. 227 | 228 | - `participantId` : the id of the participant that left. 229 | 230 | #### audioMutedChanged(bool muted) 231 | 232 | Called when the local participant's audio is muted or unmuted. 233 | 234 | - `muted` : a boolean indicating whether the audio is muted or not. 235 | 236 | #### videoMutedChanged(bool muted) 237 | 238 | Called when the local participant's video is muted or unmuted. 239 | 240 | - `muted` : a boolean indicating whether the video is muted or not. 241 | 242 | #### endpointTextMessageReceived(String senderId, String message) 243 | 244 | Called when an endpoint text message is received. 245 | 246 | - `senderId` : the participantId of the sender 247 | - `message` : the content. 248 | 249 | #### screenShareToggled(String participantId, bool sharing) 250 | 251 | Called when a participant starts or stops sharing his screen. 252 | 253 | - `participantId` : the id of the participant 254 | - `sharing` : the state of screen share 255 | 256 | #### chatMessageReceived(String senderId, String message, bool isPrivate, String? timestamp) 257 | 258 | Called when a chat text message is received. 259 | 260 | - `senderId` : the ID of the participant that sent the message. 261 | - `message` : the content of the message. 262 | - `isPrivate` : true if the message is private, false otherwise. 263 | - `timestamp` : the (optional) timestamp of the message. 264 | 265 | #### chatToggled(bool isOpen) 266 | 267 | Called when the chat dialog is opened or closed. 268 | 269 | - `isOpen` : true if the chat dialog is open, false otherwise. 270 | 271 | #### participantsInfoRetrieved(String participantsInfo) 272 | Called when the `retrieveParticipantsInfo` action is called 273 | 274 | - `participantsInfo` : a list of participants' information as a string. 275 | 276 | #### readyToClose() 277 | Called when the SDK is ready to be closed. No meeting is happening at this point. 278 | 279 | #### customButtonPressed() 280 | Called when a custom button is pressed. 281 | 282 | - `id` : the ID of the button. 283 | - `text` : the label of the button. 284 | 285 | 286 | #### Example of listener: 287 | 288 | ```dart 289 | var listener = JitsiMeetEventListener( 290 | conferenceJoined: (url) { 291 | debugPrint("conferenceJoined: url: $url"); 292 | }, 293 | 294 | participantJoined: (email, name, role, participantId) { 295 | debugPrint( 296 | "participantJoined: email: $email, name: $name, role: $role, " 297 | "participantId: $participantId", 298 | ); 299 | participants.add(participantId!); 300 | }, 301 | 302 | chatMessageReceived: (senderId, message, isPrivate) { 303 | debugPrint( 304 | "chatMessageReceived: senderId: $senderId, message: $message, " 305 | "isPrivate: $isPrivate", 306 | ); 307 | }, 308 | 309 | readyToClose: () { 310 | debugPrint("readyToClose"); 311 | }, 312 | ); 313 | ``` 314 | -------------------------------------------------------------------------------- /docs/dev-guide/iframe.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-iframe 3 | title: IFrame API 4 | --- 5 | 6 | Embedding the Jitsi Meet API into your site or app enables you to host and provide secure video meetings with your colleagues, teams, and stakeholders. The Meet API provides a full complement of comprehensive meeting features. 7 | 8 | Your Jitsi meetings can be hosted and attended using any device while keeping your data and privacy protected. You can reach your meeting participants anywhere in the world eliminating the need for travel and the associated inconvenience. 9 | 10 | The IFrame API enables you to embed Jitsi Meet functionality into your meeting application so you can experience the full functionality of the globally distributed and highly available deployment available with [meet.jit.si](https://meet.jit.si/). 11 | 12 | You can also embed and integrate the globally distributed and highly available deployment on the [meet.jit.si](https://meet.jit.si/) platform itself. 13 | 14 | :::note NOTE 15 | JaaS customers, please make sure you also read [this](https://developer.8x8.com/jaas/docs/iframe-api-overview)! 16 | ::: 17 | 18 | :::tip 19 | If you use React in your web application you might want to use our [React SDK](dev-guide-react-sdk) instead. 20 | ::: 21 | 22 | ## Integration 23 | 24 | To enable the Jitsi Meet API in your application you must use one of the following JavaScript (JS) Jitsi Meet API library scripts and integrate it into your application: 25 | 26 | For self-hosting in your domain: 27 | 28 | ```javascript 29 | 30 | ``` 31 | 32 | meet.jit.si: 33 | ```javascript 34 | 35 | 36 | ``` 37 | 38 | ## Mobile support 39 | 40 | The iframe API works on mobile browsers the same way as it does on desktop browsers. 41 | 42 | ### Opening meetings in the Jitsi Meet app 43 | 44 | In order to open meetings with the Jitsi Meet app you can use our custom URL scheme as follows: 45 | 46 | (let's assume the meeting is https://meet.jit.si/test123) 47 | 48 | * Android: `intent://meet.jit.si/test123#Intent;scheme=org.jitsi.meet;package=org.jitsi.meet;end` 49 | * iOS: `org.jitsi.meet://meet.jit.si/test123` 50 | 51 | This works with custom servers too, just replace `meet.jit.si` with your custom server URL. 52 | 53 | ## Creating the Jitsi Meet API object 54 | 55 | After you have integrated the Meet API library, you must then create the Jitsi Meet API object. 56 | 57 | The Meet API object takes the following form: 58 | 59 | **`api = new JitsiMeetExternalAPI(domain, options)`** 60 | 61 | The API object constructor uses the following options: 62 | 63 | * `domain`: The domain used to build the conference URL (e.g., **`meet.jit.si`**). 64 | * `options`: The object with properties. 65 | 66 | IFrame arguments include: 67 | 68 | * `roomName`: The name of the room to join. 69 | 70 | * `width`: _Optional._ The created IFrame width. 71 | 72 | The width argument has the following characteristics: 73 | 74 | - A numerical value indicates the width in pixel units. 75 | 76 | - If a string is specified the format is a number followed by **`px`**, **`em`**, **`pt`**, or **`%`**. 77 | 78 | * `height`: _Optional._ The height for the created IFrame. 79 | 80 | The height argument has the following characteristics: 81 | 82 | - A numerical value indicates the height in pixel units. 83 | 84 | - If a string is specified the format is a number followed by **`px`**, **`em`**, **`pt`**, or **`%`**. 85 | 86 | * `parentNode`: The HTML DOM Element where the IFrame is added as a child. 87 | 88 | * `configOverwrite`: _Optional._ The JS object with overrides for options defined in the [config.js] file. 89 | 90 | * `interfaceConfigOverwrite`: _Optional._ The JS object with overrides for options defined in the [interface_config.js] file. 91 | 92 | * `jwt`: _Optional._ The [JWT](https://jwt.io/) token. 93 | 94 | * `onload`: _Optional._ The IFrame onload event handler. 95 | 96 | * `invitees`: _Optional._ Object arrays that contain information about participants invited to a call. 97 | 98 | * `devices`: _Optional._ Information map about the devices used in a call. 99 | 100 | * `userInfo`: _Optional._ The JS object that contains information about the participant starting or joining the meeting (e.g., email). 101 | 102 | * `lang`: _Optional._ The default meeting language. 103 | 104 | * `iceServers`: _Optional._ Object with rules that will be used to modify/remove the existing ice server configuration. **NOTE: This property is currently experimental and may be removed in the future!** 105 | 106 | 107 | For example: 108 | 109 | ```javascript 110 | const domain = 'meet.jit.si'; 111 | const options = { 112 | roomName: 'JitsiMeetAPIExample', 113 | width: 700, 114 | height: 700, 115 | parentNode: document.querySelector('#meet'), 116 | lang: 'de' 117 | }; 118 | const api = new JitsiMeetExternalAPI(domain, options); 119 | ``` 120 | 121 | You can set the initial media devices for the call using the following: 122 | 123 | ```javascript 124 | const domain = 'meet.jit.si'; 125 | const options = { 126 | ... 127 | devices: { 128 | audioInput: '', 129 | audioOutput: '', 130 | videoInput: '' 131 | }, 132 | ... 133 | }; 134 | const api = new JitsiMeetExternalAPI(domain, options); 135 | ``` 136 | 137 | You can override options set in the [config.js] file and the [interface_config.js] file using the **`configOverwrite`** and **`interfaceConfigOverwrite`** objects, respectively. 138 | 139 | For example: 140 | 141 | ```javascript 142 | const options = { 143 | ... 144 | configOverwrite: { startWithAudioMuted: true }, 145 | interfaceConfigOverwrite: { DISABLE_DOMINANT_SPEAKER_INDICATOR: true }, 146 | ... 147 | }; 148 | const api = new JitsiMeetExternalAPI(domain, options); 149 | ``` 150 | To pass a JWT token to Jitsi Meet use the following: 151 | 152 | ```javascript 153 | const options = { 154 | ... 155 | jwt: '', 156 | ... 157 | }; 158 | const api = new JitsiMeetExternalAPI(domain, options); 159 | ``` 160 | 161 | You can set the **`userInfo`** (e.g., email, display name) for the call using the following: 162 | 163 | ```javascript 164 | var domain = "meet.jit.si"; 165 | var options = { 166 | ... 167 | userInfo: { 168 | email: 'email@jitsiexamplemail.com', 169 | displayName: 'John Doe' 170 | } 171 | } 172 | var api = new JitsiMeetExternalAPI(domain, options); 173 | ``` 174 | 175 | export const Anchor = ({children, name}) => ( 176 | 180 | {children} 181 | 182 | ); 183 | 184 | 185 | 186 | You can modify the default ice servers configuration with the **`iceServers`** property (**NOTE: This property is currently experimental and may be removed in the future!**) using the following: 187 | 188 | 189 | ```javascript 190 | var domain = "meet.jit.si"; 191 | var options = { 192 | ... 193 | iceServers: { 194 | replace: [ 195 | { // replace the URL of all existing ice servers with type matching targetType 196 | targetType: 'turn', 197 | urls: 'turn:example.com:443' 198 | }, 199 | { // replace the URL of all existing ice servers with type matching targetType 200 | targetType: 'turns', 201 | urls: 'turns:example.com:443?transport=tcp' 202 | }, 203 | { // remove all existing ice servers with type matching targetType 204 | targetType: 'stun', 205 | urls: null 206 | } 207 | ] 208 | }, 209 | ... 210 | } 211 | var api = new JitsiMeetExternalAPI(domain, options); 212 | ``` 213 | 214 | Configuring the tile view: 215 | 216 | You can configure the maximum number of columns in the tile view by overriding the **`TILE_VIEW_MAX_COLUMNS`** property from the [interface_config.js] file via the **`interfaceConfigOverwrite`** object: 217 | 218 | ```javascript 219 | const options = { 220 | ... 221 | interfaceConfigOverwrite: { TILE_VIEW_MAX_COLUMNS: 2 }, 222 | ... 223 | }; 224 | const api = new JitsiMeetExternalAPI(domain, options); 225 | ``` 226 | :::note 227 | **`TILE_VIEW_MAX_COLUMNS`** accepts values from 1 to 5. The default value is 5. 228 | ::: 229 | 230 | 231 | ## Functions 232 | 233 | All functions are documented [here](/handbook/docs/dev-guide/dev-guide-iframe-functions) now. 234 | 235 | ## Commands 236 | 237 | All commands are documented [here](/handbook/docs/dev-guide/dev-guide-iframe-commands) now. 238 | 239 | ## Events 240 | 241 | All events are documented [here](/handbook/docs/dev-guide/dev-guide-iframe-events) now. 242 | 243 | [config.js]: https://github.com/jitsi/jitsi-meet/blob/master/config.js 244 | [interface_config.js]: https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js 245 | -------------------------------------------------------------------------------- /docs/dev-guide/ljm-api.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-ljm-api 3 | title: lib-jitsi-meet API (low level) 4 | --- 5 | 6 | You can use Jitsi Meet API to create Jitsi Meet video conferences with a custom GUI. 7 | 8 | ## Installation 9 | 10 | To embed Jitsi Meet API in your application you need to source the Jitsi Meet API library. 11 | **It should be sourced from your deployment.** 12 | 13 | ```html 14 | 15 | ``` 16 | 17 | Now you can access Jitsi Meet API through the `JitsiMeetJS` global object. 18 | 19 | ## Getting Started 20 | 21 | 1. The first thing you must do in order to use Jitsi Meet API is to initialize `JitsiMeetJS` object: 22 | 23 | ```javascript 24 | JitsiMeetJS.init(); 25 | ``` 26 | 27 | 2. Then you must create the connection object: 28 | 29 | 30 | ```javascript 31 | var connection = new JitsiMeetJS.JitsiConnection(null, null, options); 32 | ``` 33 | 34 | 35 | 3. Now we can attach some listeners to the connection object and establish the server connection: 36 | 37 | ```javascript 38 | connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_ESTABLISHED, onConnectionSuccess); 39 | connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_FAILED, onConnectionFailed); 40 | connection.addEventListener(JitsiMeetJS.events.connection.CONNECTION_DISCONNECTED, disconnect); 41 | 42 | connection.connect(); 43 | ``` 44 | 45 | 4. After you receive the `CONNECTION_ESTABLISHED` event you are to create the `JitsiConference` object and 46 | also you may want to attach listeners for conference events (we are going to add handlers for remote track, conference joined, etc. ): 47 | 48 | 49 | ```javascript 50 | room = connection.initJitsiConference("conference1", confOptions); 51 | room.on(JitsiMeetJS.events.conference.TRACK_ADDED, onRemoteTrack); 52 | room.on(JitsiMeetJS.events.conference.CONFERENCE_JOINED, onConferenceJoined); 53 | ``` 54 | 55 | 5. You also may want to get your local tracks from the camera and microphone: 56 | ```javascript 57 | JitsiMeetJS.createLocalTracks().then(onLocalTracks); 58 | ``` 59 | 60 | NOTE: Adding listeners and creating local streams are not mandatory steps. 61 | 62 | 6. Then you are ready to create / join a conference : 63 | 64 | ```javascript 65 | room.join(); 66 | ``` 67 | 68 | After that step you are in the conference. Now you can continue with adding some code that will handle the events and manage the conference. 69 | 70 | ## Components 71 | 72 | See [the full API docs](https://jitsi.github.io/lib-jitsi-meet/). 73 | 74 | ## Usage 75 | 76 | :::note NOTE 77 | JaaS customers, please follow [this example](https://github.com/jitsi/ljm-jaas-example) or check out the [live demo](https://jitsi.github.io/ljm-jaas-example). 78 | ::: 79 | -------------------------------------------------------------------------------- /docs/dev-guide/ljm.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-ljm 3 | title: Modifying lib-jitsi-meet 4 | --- 5 | 6 | # Modifying `lib-jitsi-meet` 7 | 8 | By default the library is referenced as a prebuilt artifact in a GitHub release. Packages are NOT published to npm. The default dependency path in package.json is: 9 | 10 | ```json 11 | "lib-jitsi-meet": "https://github.com/jitsi/lib-jitsi-meet/releases/download/v+/lib-jitsi-meet.tgz)", 12 | ``` 13 | 14 | To work with local copy you may change the path to: 15 | 16 | ```json 17 | "lib-jitsi-meet": "file:///Users/name/local-lib-jitsi-meet-packed-copy.tgz", 18 | ``` 19 | 20 | In order to create the packed file run `npm pack` in the lib-jitsi-meet project directory. 21 | 22 | To make the project you must force it to take the sources as 'npm update': 23 | 24 | ``` 25 | npm install lib-jitsi-meet --force && make 26 | ``` 27 | 28 | Or if you are making only changes to the library: 29 | 30 | ``` 31 | npm install lib-jitsi-meet --force && make deploy-lib-jitsi-meet 32 | ``` 33 | 34 | Alternative way is to use [npm link](https://docs.npmjs.com/cli/link). 35 | It allows to link `lib-jitsi-meet` dependency to local source in few steps: 36 | 37 | ```bash 38 | cd lib-jitsi-meet 39 | 40 | #### create global symlink for lib-jitsi-meet package 41 | npm link 42 | 43 | cd ../jitsi-meet 44 | 45 | #### create symlink from the local node_modules folder to the global lib-jitsi-meet symlink 46 | npm link lib-jitsi-meet 47 | ``` 48 | 49 | :::note 50 | Linking will not work when building the mobile applications. 51 | ::: 52 | 53 | After changes in your local `lib-jitsi-meet` repository, you can rebuild it with `npm run build` and your `jitsi-meet` repository will use that modified library: 54 | 55 | ```bash 56 | cd node_modules/lib-jitsi-meet 57 | npm run build 58 | ``` 59 | 60 | If you do not want to use local repository anymore you should run: 61 | 62 | ```bash 63 | cd jitsi-meet 64 | npm unlink lib-jitsi-meet 65 | npm install 66 | ``` 67 | -------------------------------------------------------------------------------- /docs/dev-guide/mobile-dropbox.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: mobile-dropbox 3 | title: Setting up Dropbox integration 4 | --- 5 | 6 | 1. Create a Dropbox app. 7 | 2. Add the following to ```ios/app/src/Info.plist``` by replacing `` 8 | with your own Dropbox app key (which can be found in the 9 | [App Console](https://www.dropbox.com/developers/apps)): 10 | ``` 11 | CFBundleURLTypes 12 | 13 | 14 | CFBundleURLName 15 | 16 | CFBundleURLSchemes 17 | 18 | db- 19 | 20 | 21 | 22 | LSApplicationQueriesSchemes 23 | 24 | dbapi-2 25 | dbapi-8-emm 26 | 27 | ``` 28 | 29 | **NOTE:** Both Android and iOS builds of the apps will parse the Dropbox app key 30 | from ```ios/app/src/Info.plist```. 31 | 32 | **NOTE:** See [Dropbox developer guide](https://www.dropbox.com/developers/reference/developer-guide) for more information 33 | -------------------------------------------------------------------------------- /docs/dev-guide/mobile-feature-flags.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: mobile-feature-flags 3 | title: Feature flags 4 | --- 5 | 6 | The mobile SDK supports a number of feature flags which allow for customizing certain 7 | UI aspects and behavior. 8 | 9 | All flags are defined [here](https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.ts). 10 | -------------------------------------------------------------------------------- /docs/dev-guide/mobile-google-auth.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: mobile-google-auth 3 | title: Setting up Google sign-in integration 4 | --- 5 | 6 | - Create a Firebase project here: https://firebase.google.com/. You'll need a 7 | signed Android build for that, that can be a debug self-signed build too, just 8 | retrieve the signing hash. The key hash of an already signed ap can be obtained 9 | as follows (on macOS): ```keytool -list -printcert -jarfile the-app.apk``` 10 | - Place the generated ```google-services.json``` file in ```android/app``` 11 | for Android and the ```GoogleService-Info.plist``` into ```ios/app``` for 12 | iOS (you can stop at that step, no need for the driver and the code changes they 13 | suggest in the wizard). 14 | - You may want to exclude these files in YOUR GIT config (do not exclude them in 15 | the ```.gitignore``` of the application itself!). 16 | - Your web client ID is auto generated during the Firebase project 17 | creation. Find them in the Google Developer console 18 | (https://console.developers.google.com/) 19 | - Make sure your config reflects this ID by setting 20 | ```googleApiApplicationClientID``` in config.js. 21 | - Add your iOS client ID (the REVERSED_CLIENT_ID in the plist file) as an 22 | application URL schema into ```ios/app/src/Info.plist``` 23 | (replacing placeholder). 24 | - Enable YouTube API access on the developer console (see above) to enable live 25 | streaming. 26 | -------------------------------------------------------------------------------- /docs/dev-guide/mobile-jitsi-meet.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-mobile-jitsi-meet 3 | title: Developer Guide for Jitsi Meet 4 | sidebar_label: Jitsi Meet development 5 | --- 6 | 7 | This guide will help you setup a development environment to start working on the Jitsi Meet mobile app itself. 8 | 9 | :::caution 10 | Building the apps / SDKs is not supported on Windows. 11 | ::: 12 | 13 | ## Overview 14 | 15 | :::note 16 | This guide is about building the Jitsi Meet apps themselves. If you want to integrate the Jitsi Meet SDK into your own application check the dedicated page on the sidebar. 17 | ::: 18 | 19 | Jitsi Meet can be built as a standalone app for Android or iOS. It uses the 20 | [React Native] framework. 21 | 22 | First make sure the following dependencies are installed: 23 | 24 | * `watchman` 25 | * `nodejs` 26 | * `npm` 27 | 28 | :::warning Node version 29 | Node 20.x and npm 10.x are required. Any other version may result in runtime errors. 30 | ::: 31 | 32 | :::note Xcode 33 | Xcode 15 or higher is required. 34 | ::: 35 | 36 | ## iOS 37 | 38 | 1. Install dependencies 39 | 40 | - Install main dependencies: 41 | 42 | ```bash 43 | npm install 44 | ``` 45 | 46 | - Install the required pods (CocoaPods must be installed first, it can 47 | be done with Homebrew: `brew install cocoapods`) 48 | 49 | ```bash 50 | cd ios 51 | pod install 52 | cd .. 53 | ``` 54 | 55 | 2. Build the app using Xcode 56 | 57 | - Open `ios/jitsi-meet.xcworkspace` in Xcode. Make sure it's the workspace 58 | file! 59 | 60 | - Select your device from the top bar and hit the **Play ▶️** button. 61 | 62 | When the app is launched from Xcode, the Debug Console will show the application output 63 | logs. 64 | 65 | 3. Other remarks 66 | 67 | It's likely you'll need to change the bundle ID for deploying to a device. 68 | This can be changed in the **General** tab. Under **Identity** set 69 | **Bundle Identifier** to a different value, and adjust the **Team** in the 70 | **Signing** section to match your own. 71 | 72 | 73 | ## Android 74 | 75 | Make sure [Android Studio] is installed. 76 | 77 | Set the JDK in Android Studio to at least Java 11: https://developer.android.com/studio/intro/studio-config#jdk 78 | 79 | ### Adding extra dependencies 80 | 81 | Due to how our project is structured, React Native's automatic linking won't work so Android dependencies need to be manually linked. 82 | 83 | First, add your project to `android/settings.gradle` like so: 84 | 85 | ```gradle title="android/settings.gradle" 86 | include ':react-native-mydependency' 87 | project(':react-native-mydependency').projectDir = new File(rootProject.projectDir, '../node_modules/@somenamespace/react-native-mydependency/android') 88 | ``` 89 | 90 | Then add a dependency on `android/sdk/build.gradle` like so: 91 | 92 | ```gradle title="android/sdk/build.gradle" 93 | implementation project(':react-native-mydependency') 94 | ``` 95 | 96 | Last, link it in the `getReactNativePackages` method in `android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java` like so: 97 | 98 | ```java title="android/sdk/src/main/java/org/jitsi/meet/sdk/ReactInstanceManagerHolder.java" 99 | new com.companyname.library.AwesomeLibraryPackage(), 100 | ``` 101 | 102 | Make sure you adjust the fully qualified package name. 103 | 104 | ## Debugging 105 | 106 | The official documentation on [debugging] is quite extensive and specifies the 107 | preferred method for debugging. 108 | 109 | :::note 110 | When using Chrome Developer Tools for debugging the JavaScript source 111 | code is being interpreted by Chrome's V8 engine, instead of JSCore which React 112 | Native uses. It's important to keep this in mind due to potential differences in 113 | supported JavaScript features. Also note Jitsi Meet does not support Flipper. 114 | ::: 115 | 116 | ## Enabling extra features 117 | 118 | - [Dropbox Integration](mobile-dropbox.md) 119 | - [Google Sign-In Integration (For YouTube Live Streaming)](mobile-google-auth.md) 120 | 121 | [Android Studio]: https://developer.android.com/studio/index.html 122 | [debugging]: https://facebook.github.io/react-native/docs/debugging/ 123 | [React Native]: https://facebook.github.io/react-native/ 124 | -------------------------------------------------------------------------------- /docs/dev-guide/react-native-sdk.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-react-native-sdk 3 | title: React Native SDK 4 | --- 5 | 6 | The Jitsi React Native SDK provides the same user experience as the Jitsi Meet app, 7 | in a customizable way which you can embed in your React Native apps. 8 | 9 | ## Sample application using the React Native SDK 10 | 11 | If you want to see how easy integrating the Jitsi React Native SDK into a React Native application is, take a look at the
12 | [sample applications repository](https://github.com/jitsi/jitsi-meet-sdk-samples#react-native). 13 | 14 | ## Usage 15 | 16 | While this is a published library, you can `npm i @jitsi/react-native-sdk`.
17 | Dependency conflicts may occur between RNSDK and your app.
If that is the case, please run `npm i @jitsi/react-native-sdk --force`.
18 | To check if some dependencies need to be added, please run the following script `node node_modules/@jitsi/react-native-sdk/update_dependencies.js`.
19 | This will sync all of our peer dependencies with your dependencies.
20 | Next you will need to do `npm install`. 21 | 22 | Because our SDK uses SVG files, you will need to update your metro bundler configuration accordingly: 23 | 24 | ```config title="metro.config" 25 | const { getDefaultConfig } = require('metro-config'); 26 | 27 | module.exports = (async () => { 28 | const { 29 | resolver: { 30 | sourceExts, 31 | assetExts 32 | } 33 | } = await getDefaultConfig(); 34 | 35 | return { 36 | transformer: { 37 | babelTransformerPath: require.resolve('react-native-svg-transformer'), 38 | getTransformOptions: async () => ({ 39 | transform: { 40 | experimentalImportSupport: false, 41 | inlineRequires: true, 42 | }, 43 | }), 44 | }, 45 | resolver: { 46 | assetExts: assetExts.filter(ext => ext !== 'svg'), 47 | sourceExts: [...sourceExts, 'svg'] 48 | } 49 | } 50 | })(); 51 | ``` 52 | 53 | 54 | ### Android 55 | 56 | #### Permissions 57 | - In `android/app/src/debug/AndroidManifest.xml` and `android/app/src/main/AndroidManifest.xml`, under the `` tag, please include 58 | ```xml 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | ``` 69 | - Starting Android 14, specific foreground service types permissions require to be added in the manifest file: 70 | ```xml 71 | 72 | 73 | 74 | ``` 75 | 76 | #### Services 77 | - To enables the screen share feature you now need to go to your `MainApplication.java` file and: 78 | 1. `import com.oney.WebRTCModule.WebRTCModuleOptions;` that comes from `react-native-webrtc` dependency. 79 | 80 | 2. `WebRTCModuleOptions options = WebRTCModuleOptions.getInstance();` instance it. 81 | 3. `options.enableMediaProjectionService = true;` enable foreground service that takes care of screen-sharing feature. 82 | 83 | #### API 84 | - Our app use `react-native-orientation-locker` dependency that uses API 33 features. Make sure that your app, in `android\build.gradle`, targets, at least, that version: 85 | ```markdown 86 | buildscript { 87 | ext { 88 | compileSdkVersion = 33 89 | targetSdkVersion = 33 90 | } 91 | } 92 | ``` 93 | 94 | ### iOS 95 | 96 | #### Permissions 97 | - React Native SDK requests camera and microphone access, make sure to include the required entries for `NSCameraUsageDescription` and `NSMicrophoneUsageDescription`in your `Info.plist` file. 98 | - React Native SDK shows and hides the status bar based on the conference state, 99 | you may want to set `UIViewControllerBasedStatusBarAppearance` to `NO` in your 100 | `Info.plist` file. 101 | - For starting screen sharing React Native SDK provides the UI to present the `RPSystemBroadcastPickerView` to the user. By default, the picker will display a list of all the available broadcast providers. In order to limit the picker to our particular broadcast provider, we have to set `preferredExtension` to the bundle identifier of the broadcast extension. We are doing this by adding a new key named `RTCScreenSharingExtension` to the app's Info.plist and setting the broadcast extension bundle identifier as the value. 102 | - Make sure `voip` is added to `UIBackgroundModes`, in the app's `Info.plist`, in order to work when the app is in the background. 103 | 104 | 105 | #### Build Phases 106 | 107 | ##### Run Script Phases 108 | - For the sounds to work, please add the following script in Xcode: 109 | ```shell 110 | SOUNDS_DIR="${PROJECT_DIR}/../node_modules/@jitsi/react-native-sdk/sounds" 111 | cp $SOUNDS_DIR/* ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ 112 | ``` 113 | 114 | 115 | 116 | ## JitsiMeeting props 117 | 118 | Our JitsiMeeting component renders the full meeting experience. This has some customizable properties: 119 | 120 | 121 | ### config 122 | `Object` - Overwrite different [config](https://github.com/jitsi/jitsi-meet/blob/master/config.js) options. 123 | - For example: 124 | ```javascript 125 | 141 | ``` 142 | 143 | 144 | ### flags 145 | `Object` - Add different feature [flags](https://github.com/jitsi/jitsi-meet/blob/master/react/features/base/flags/constants.ts) 146 | that your meeting experience would like to have. 147 | - For example: 148 | ```javascript 149 | 154 | ``` 155 | 156 | 157 | ### eventListeners 158 | `Object` - Options that personalize your meeting experience: 159 | 160 | - onConferenceBlurred 161 | `Function` - Takes a function that gets triggered when ```CONFERENCE_BLURRED``` action is dispatched, more exactly when a conference screen is out of focus, more exactly when navigation to another screen is initiated. 162 | 163 | - onConferenceFocused 164 | `Function` - Takes a function that gets triggered when ```CONFERENCE_FOCUSED``` action is dispatched, more exactly when a conference screen is focused. 165 | 166 | - onAudioMutedChanged 167 | `Function` - Takes a function that gets triggered when ```SET_AUDIO_MUTED``` action is dispatched, more exactly when audio mute state is changed. 168 | 169 | - onConferenceJoined 170 | `Function` - Takes a function that gets triggered when ```CONFERENCE_JOINED``` action is dispatched, more exactly when a conference was joined. 171 | 172 | - onConferenceLeft 173 | `Function` - Takes a function that gets triggered when ```CONFERENCE_LEFT``` action is dispatched, more exactly when a conference was left. 174 | 175 | - onConferenceWillJoin 176 | `Function` - Takes a function that gets triggered when ```CONFERENCE_WILL_JOIN``` action is dispatched, more exactly when a conference will be joined. 177 | 178 | - onEnterPictureInPicture 179 | `Function` - Takes a function that gets triggered when ```ENTER_PICTURE_IN_PICTURE``` action is dispatched, more exactly when entering picture-in-picture is initiated. 180 | 181 | - onParticipantJoined 182 | `Function` - Takes a function that gets triggered when ```PARTICIPANT_JOINED``` action is dispatched, more exactly when a specific participant joined a conference. 183 | 184 | - onReadyToClose 185 | `Function` - Takes a function that gets triggered when ```READY_TO_CLOSE``` action is dispatched, more exactly when one exits a conference. 186 | 187 | - onVideoMutedChanged 188 | `Function` - Takes a function that gets triggered when ```SET_VIDEO_MUTED``` action is dispatched, more exactly when video mute state is changed. 189 | 190 | 191 | ### room 192 | `string` - Name of the room where the conference takes place. 193 | 194 | 195 | ### serverURL 196 | `string` - Server where the conference should take place. 197 | 198 | 199 | ### style 200 | `Object` - CSS your meeting experience. 201 | 202 | 203 | ### token 204 | `string` - JWT token used for authentication. 205 | 206 | 207 | ### userInfo 208 | 209 | - avatarUrl 210 | `string` - Path to participant's avatar. 211 | 212 | - displayName 213 | `string` - Default participant name to be displayed. 214 | 215 | - email 216 | `string` - Default email for participant. 217 | -------------------------------------------------------------------------------- /docs/dev-guide/react-sdk.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-react-sdk 3 | title: React SDK 4 | --- 5 | 6 | The Jitsi Meet React SDK provides the same user experience as the Jitsi Meet app, in a customizable way which you can embed in your apps. 7 | 8 | :::important 9 | React 16 or higher is required. 10 | ::: 11 | 12 | ## Sample application using the SDK 13 | If you want to see how easy integrating the Jitsi Meet React SDK into a React application is, take a look at our [example](https://github.com/jitsi/jitsi-meet-react-sdk/tree/main/example). 14 | 15 | ## Installation 16 | To access the React SDK modules in your application you need to install it as a dependency: 17 | ```bash 18 | npm install @jitsi/react-sdk 19 | ``` 20 | 21 | ## Modules 22 | The SDK exposes two components with similar properties, intended for different use-cases. 23 | 24 | ### JitsiMeeting 25 | To be used with custom domains as-it-is in React projects: 26 | ```jsx 27 | { 43 | // here you can attach custom event listeners to the Jitsi Meet External API 44 | // you can also store it locally to execute commands 45 | } } 46 | getIFrameRef = { (iframeRef) => { iframeRef.style.height = '400px'; } } 47 | /> 48 | ``` 49 | #### Properties specific to the `JitsiMeeting` component 50 | * `domain`: Optional. Field used to retrieve the external_api.js file that initializes the IFrame. If omitted, defaults to `meet.jit.si`. 51 | 52 | ### JaaSMeeting 53 | To be used with the `8x8.vc` domain as-it-is in React projects: 54 | ```jsx 55 | { ... } } 70 | /> 71 | ``` 72 | ...or with the `stage.8x8.vc` domain: 73 | ```js 74 | 80 | ``` 81 | #### Properties specific to the `JaaSMeeting` component 82 | * `appId`: Required. Provides an isolated context and prefixes the room name. 83 | * `useStaging`: Optional. Tells whether to use the staging environment or not. 84 | 85 | ## Common properties 86 | The component modules support a similar kind of customization to the Jitsi Meet IFrame. The following properties can be passed down to your instances of `JitsiMeeting` or `JaaSMeeting`. 87 | 88 | * `roomName`: Required. The name of the room to join. 89 | 90 | * `configOverwrite`: Optional. The JS object with overrides for options defined in the [config.js] file. 91 | 92 | * `interfaceConfigOverwrite`: Optional. The JS object with overrides for options defined in the [interface_config.js] file. 93 | 94 | * `jwt`: Optional. The [JWT](https://jwt.io/) token. 95 | 96 | * `invitees`: Optional. Object arrays that contain information about participants invited to a call. 97 | 98 | * `devices`: Optional. Information map about the devices used in a call. 99 | 100 | * `userInfo`: Optional. The JS object that contains information about the participant starting or joining the meeting (e.g., email). 101 | 102 | * `release`: Optional. Information regarding the `stage.8x8.vc` or `8x8.vc` release version. Expects the following format: `release-1234`. 103 | 104 | * `spinner`: Optional. The custom spinner to be displayed while the IFrame is loading. 105 | 106 | * `onApiReady`: Optional. The external API reference for events and commands. 107 | 108 | * `onReadyToClose`: Optional. The callback for when the meeting is ready to be closed. 109 | 110 | * `getIFrameRef`: Optional. The parent node used by the IFrame. 111 | 112 | [config.js]: https://github.com/jitsi/jitsi-meet/blob/master/config.js 113 | [interface_config.js]: https://github.com/jitsi/jitsi-meet/blob/master/interface_config.js 114 | -------------------------------------------------------------------------------- /docs/dev-guide/web-integrations.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-web-integrations 3 | title: Web integrations 4 | sidebar_label: Integrations 5 | --- 6 | 7 | ## Creating the Google API client for Google Calendar and YouTube integration 8 | 9 | 1. Log into a Google admin account. 10 | 1. Go to Google cloud platform dashboard. https://console.cloud.google.com/apis/dashboard 11 | 1. In the Select a Project dropdown, click New Project. 12 | 1. Give the project a name. 13 | 1. Proceed to the Credentials settings of the new project. 14 | 1. In the Credentials tab of the Credentials settings, click Create Credentials and select the type OAuth client ID. 15 | 1. Proceed with creating a Web application and add the domains (origins) on which the application will be hosted. Local development environments (http://localhost:8000 for example) can be added here. 16 | 1. While still in the Google cloud platform dashboard, click the Library settings for the calendar project. 17 | 1. Search for the Google Calendar API (used for calendar accessing), click its result, and enable it. 18 | 1. Do the same for YouTube Data API v3 19 | 20 | ## Creating the Microsoft app for Microsoft Outlook integration 21 | 22 | 1. Go to https://apps.dev.microsoft.com/ 23 | 1. Proceed through the "Add an app" flow. Once created, a page with several Graph Permissions fields should display. 24 | 1. Under "Platforms" add "Web" 25 | 1. Add a redirect URL for the Microsoft auth flow to visit once a user has confirmed authentication. Target domain if available is just 'yourdomain.com' (the deployment address) and the redirect URL is `https://yourdomain.com/static/msredirect.html`. 26 | 1. Add Microsoft Graph delegated permissions, if this option is available: Calendars.Read, Calendars.ReadWrite, Calendars.Read.Shared, Calendars.ReadWrite.Shared. 27 | 1. Check `Allow Implicit Flow` (and `Restrict token issuing to this app` if available). 28 | 1. Save the changes. 29 | 30 | ## Creating the Dropbox app for Dropbox recording integration 31 | 32 | 1. You need a Dropbox account (If you don't already have one, you can sign up for a free account [here](https://www.dropbox.com/register).) 33 | 2. Create new App as described in [Getting Started Guide](https://www.dropbox.com/developers/reference/getting-started?_tk=guides_lp&_ad=guides2&_camp=get_started#app%20console) in App Console section. 34 | 3. Choose 35 | 1. 'Dropbox API - For apps that need to access files in Dropbox.' 36 | 1. 'App folder– Access to a single folder created specifically for your app.' 37 | 1. Fill in the name of your app 38 | 4. You need only, the newly created App key, goes in `/etc/jitsi/meet/yourdeployment.com-config.js` in 39 | ``` title="/etc/jitsi/meet/yourdeployment.com-config.js" 40 | dropbox: { 41 | appKey: '__dropbox_app_key__', 42 | redirectURI: 'https://yourdeployment.com/static/oauth.html' 43 | } 44 | ``` 45 | 5. Add your Dropbox Redirect URIs in the Dropbox form `https://yourdeployment.com/static/oauth.html` 46 | 6. Fill in Branding 47 | -------------------------------------------------------------------------------- /docs/dev-guide/web-jitsi-meet.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: dev-guide-web-jitsi-meet 3 | title: Developer Guide for Jitsi Meet 4 | sidebar_label: Jitsi Meet development 5 | --- 6 | 7 | This guide will help you setup a development environment to start working on the Jitsi Meet web app itself. 8 | 9 | ## Building the sources 10 | 11 | :::note 12 | Node.js >= 22 and npm >= 10 are required. 13 | ::: 14 | 15 | :::caution 16 | Windows is not supported. 17 | ::: 18 | 19 | Make sure you have Node.js installed. If you don't, follow [these instructions](https://nodejs.org/en/download/). 20 | 21 | Then go ahead: 22 | ```bash 23 | # Clone the repository 24 | git clone https://github.com/jitsi/jitsi-meet 25 | cd ./jitsi-meet 26 | 27 | npm install 28 | 29 | # To build the Jitsi Meet production application: 30 | make 31 | 32 | # For development: 33 | make dev 34 | ``` 35 | 36 | :::warning 37 | **DO NOT** run `npm update` or use `yarn` or delete `package-lock.json`. Dependencies are pinned for a reason. 38 | ::: 39 | 40 | ### Running with webpack-dev-server for development 41 | 42 | Use the following command in your terminal: 43 | 44 | ```bash 45 | make dev 46 | ``` 47 | 48 | By default the backend deployment used is `alpha.jitsi.net`. You can point the Jitsi Meet app at a different backend by using a proxy server. To do this, set the WEBPACK_DEV_SERVER_PROXY_TARGET variable: 49 | 50 | ```bash 51 | export WEBPACK_DEV_SERVER_PROXY_TARGET=https://your-example-server.com 52 | make dev 53 | ``` 54 | 55 | The app should be running at https://localhost:8080/ 56 | 57 | #### Certificate Error 58 | 59 | Browsers may show a certificate error since the development certificate is self-signed. It's safe to disregard those 60 | warning and continue to your site. 61 | 62 | ### Building .debs 63 | 64 | To make a deb you can easily deploy to a public test server, ensure you have the lib-jitsi-meet sources you wish, then: 65 | ``` 66 | npm install 67 | make 68 | dpkg-buildpackage -A -rfakeroot -us -uc -tc 69 | ``` 70 | 71 | You'll have a bunch of .deb files in the parent directory, and can push the updated source to your server and install it with the jitsi-meet-web deb file. 72 | 73 | ### Running from source on existing deployment 74 | 75 | Follow the document https://community.jitsi.org/t/how-to-how-to-build-jitsi-meet-from-source-a-developers-guide/75422 76 | -------------------------------------------------------------------------------- /docs/devops-guide/bsd.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: devops-guide-bsd 3 | title: Self-Hosting Guide - FreeBSD/NetBSD/OpenBSD 4 | sidebar_label: BSD 5 | --- 6 | 7 | This document is a reference point for pointing to the upstream packages provided by the FreeBSD, NetBSD and OpenBSD distributions. Jitsi only officially supports Linux, for any problems with the BSD packages you can contact their respective mailing lists. 8 | 9 | __Note__: Many of the installation steps require root access. 10 | 11 | ## FreeBSD 12 | 13 | FreeBSD provides ports for [Jitsi](https://www.freshports.org/net-im/jitsi-meet-full) along with documentation on how to configure it and the current limitations - https://wiki.freebsd.org/Jitsi. 14 | 15 | Jitsi can be installed using the meta port [net-im/jitsi-meet-full](https://www.freshports.org/net-im/jitsi-meet-full) which pulls in Jitsi Videobridge, Jicofo and Jitsi Meet Web UI, along with prosody, the Jitsi prosody plugins, nginx and other required dependencies. Instructions on how to build the port can be read on the FreeBSD Foundation site - https://freebsdfoundation.org/freebsd-project/resourcesold/installing-a-port-on-freebsd/. 16 | 17 | ## NetBSD 18 | 19 | NetBSD provides individual ports for [Jitsi Videobridge](https://pkgsrc.se/chat/jitsi-videobridge), [Jicofo](https://pkgsrc.se/chat/jicofo), [Jitsi prosody plugins](https://pkgsrc.se/chat/jitsi-meet-prosody) and [Jitsi Meet Web UI](https://pkgsrc.se/wip/jitsi-meet). They can be installed using the command `pkg_add `. 20 | 21 | ## OpenBSD 22 | 23 | OpenBSD provides ports for [Jitsi](https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/meta/jitsi/), along with a pkg-readme which details how to configure Jitsi for a single host install, located at [/usr/local/share/docs/pkg-readme/jitsi](https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/meta/jitsi/pkg/). 24 | 25 | The meta port can be installed by the command `pkg_add jitsi`, which pulls in the individual ports, Jitsi Videobridge, Jicofo and Jitsi Meet Web UI, along with prosody, Jitsi prosody plugins and other required dependencies. 26 | 27 | ## Limitations 28 | 29 | - Jigasi and Jibri have not yet been ported to work with any BSD systems. 30 | -------------------------------------------------------------------------------- /docs/devops-guide/cloud-api.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: cloud-api 3 | title: Cloud API 4 | --- 5 | 6 | The Jitsi Meet Cloud API is a specification for services which can support the integration of Jitsi Meet into other applications, for mapping conferences for dial-in support, and for supporting directory search and user invitations to conferences. 7 | 8 | The swagger for these services is provided in [cloud-api.swagger](https://github.com/jitsi/jitsi-meet/blob/master/resources/cloud-api.swagger). 9 | 10 | ## Sample conference mapper application 11 | 12 | https://github.com/luki-ev/conferencemapper 13 | -------------------------------------------------------------------------------- /docs/devops-guide/devops-guide.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: devops-guide-start 3 | title: Self-Hosting Guide - Overview 4 | sidebar_label: Overview 5 | --- 6 | 7 | :::note 8 | These guides help you to ___host your own Jitsi-Meet server___. 9 | If you want to have a video conference without setting up any infrastructure, use https://meet.jit.si instead. 10 | ::: 11 | 12 | ## First, a bit of general advice 13 | 14 | Jitsi Meet being based on [WebRTC](https://en.wikipedia.org/wiki/WebRTC), an encrypted communication link (https) is ___necessary___ to get working multimedia, and the setup is not always trivial. 15 | 16 | The best option is an Internet server with a certificate for a domain registered in the [DNS](https://en.wikipedia.org/wiki/Domain_Name_System#Domain_name_registration). 17 | 18 | While it's possible to setup a server on a private network and/or a self-signed certificate, it can be less straightforward and you can expect difficulties, first if you want access both from the private network and the public internet, and second when using phones as these clients often don't accept self-signed certificates. 19 | 20 | In case of trouble with clients using phones, [check your certificate](https://whatsmychaincert.com). 21 | 22 |
23 | 24 | import DocCardList from '@theme/DocCardList'; 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/devops-guide/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faq 3 | title: FAQ 4 | --- 5 | 6 | ## How to migrate away from multiplexing and enable bridge websockets 7 | 8 | For a while, we were using nginx multiplexing to serve Jitsi Meet's content on https(port 443) and use the same port for running a turn server. 9 | This proved to be problematic(you cannot use websockets with this setup) and we moved away from it. 10 | Here is how to remove multiplexing and enable websockets in favor of WebRTC Data Channels. 11 | 1. Dropping multiplexing in nginx 12 | - delete `/etc/nginx/modules-enabled/60-jitsi-meet.conf` 13 | - Then go to `/etc/nginx/sites-available/your-conf` and change your virtual host to listen on 443 instead of 4444. 14 | 2. Edit turnserver config 15 | - make sure your turnserver is listening on standard port tls port `5349`. Make sure in `/etc/turnserver.conf` you have the following: `tls-listening-port=5349` 16 | - In `/etc/prosody/conf.avail/your-conf.cfg.lua` prosody is instructed to announce `turns` turn server on port `5349` by having this line: 17 | `{ type = "turns", host = "your-domain", port = "5349", transport = "tcp" }`. Make sure you replace `your-domain` with the DNS of your deployment. 18 | 3. Add the bridge websocket location in your nginx config (add it after the `location = /xmpp-websocket` section): 19 | ``` 20 | # colibri (JVB) websockets for jvb1 21 | location ~ ^/colibri-ws/default-id/(.*) { 22 | proxy_pass http://127.0.0.1:9090/colibri-ws/default-id/$1$is_args$args; 23 | proxy_http_version 1.1; 24 | proxy_set_header Upgrade $http_upgrade; 25 | proxy_set_header Connection "upgrade"; 26 | tcp_nodelay on; 27 | } 28 | ``` 29 | 4. Enable the websockets in Jitsi Videobridge. Make sure in `/etc/jitsi/videobridge/jvb.conf` you have: 30 | ``` 31 | videobridge { 32 | http-servers { 33 | public { 34 | port = 9090 35 | } 36 | } 37 | websockets { 38 | enabled = true 39 | domain = "your-domain:443" 40 | tls = true 41 | } 42 | } 43 | ``` 44 | Make sure you replace `your-domain` with the DNS of your deployment. 45 | 5. After restarting the bridge (`systemctl restart jitsi-videobridge2`) and nginx (`systemctl restart nginx`) you are good to go! 46 | -------------------------------------------------------------------------------- /docs/devops-guide/ldap-authentication.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: ldap-authentication 3 | title: LDAP authentication 4 | sidebar_label: LDAP Authentication 5 | --- 6 | 7 | :::note 8 | This is a first draft and might not work on your system. It has been tested on Debian 11 installation with prosody 0.11 and authenticates against an OpenLDAP directory, and on Ubuntu 24.04 with Prosody 0.12 against an Active Directory. 9 | ::: 10 | 11 | If you want to authenticate your users against an LDAP directory instead 12 | of the local Prosody user database, you can use the Cyrus SASL package. 13 | Using this package you might be able to validate user-supplied credentials 14 | against other sources, such as PAM, SQL and more - but this is beyond 15 | this article. 16 | 17 | ## Prerequisites 18 | 19 | Before following this article, make sure you have set up Prosody as 20 | described in [Authentication (Secure Domain)](secure-domain.md) first. 21 | 22 | ### Required packages 23 | 24 | On Debian systems you need to install some required packages: 25 | 26 | ``` 27 | sudo apt-get install sasl2-bin libsasl2-modules-ldap lua-cyrussasl prosody-modules 28 | sudo prosodyctl install --server=https://modules.prosody.im/rocks/ mod_auth_cyrus 29 | ``` 30 | 31 | The first two packages are necessary for Cyrus' `saslauthd` and allow it 32 | to connect to an LDAP directory. The `lua-cyrussasl`-package allows 33 | Prosody to access Cyrus SASL. 34 | 35 | Installing the [mod_auth_cyrus](https://modules.prosody.im/mod_auth_cyrus) module is neccessary because support for Cyrus SASL has been [removed](https://prosody.im/doc/cyrus_sasl) from mainline Prosody and placed in the community module repository. 36 | 37 | ## Install and set up Cyrus SASL 38 | 39 | The following options define a basic LDAP configuration. A full set of 40 | possible options can be found in [LDAP_SASLAUTHD](https://github.com/winlibs/cyrus-sasl/blob/master/saslauthd/LDAP_SASLAUTHD). 41 | 42 | By default Cyrus' `saslauthd` searches for its LDAP configuration in 43 | `/etc/saslauthd.conf`. So create this file and enter something similar 44 | to define your LDAP environment: 45 | 46 | ``` 47 | ldap_servers: ldaps://ldap.example.com 48 | ldap_bind_dn: admin@example.com 49 | ldap_bind_pw: topsecret 50 | ldap_auth_method: bind 51 | ldap_search_base: ou=people,dc=example,dc=com 52 | ``` 53 | 54 | :::note 55 | One omitted option you might want to look into is `ldap_filter` which defaults to `uid=%u` and should work for a lot of systems. If you are using a Samba or Microsoft AD instance as your LDAP server you may need to change this to `ldap_filter: (sAMAccountName=%U)` as `uid` is NULL by default many configurations. You can also use the `ldap_filter` to allow only specific users access. For more details on this and other options see the `LDAP_SASLAUTHD` document linked above. 56 | 57 | Please note that Prosody may experience issues with usernames containing the "@"-symbol. You can work around this issue by changing `uid=%u` to `uid=%U`, which is [defined](https://github.com/winlibs/cyrus-sasl/blob/d933c030ce12ec0668469d79ab8378e347a1b3ba/saslauthd/LDAP_SASLAUTHD#L126) as the "user portion of %u (%U = test when %u = test@domain.tld)" 58 | ::: 59 | 60 | ### Test LDAP authentication 61 | 62 | To test if the LDAP configuration is working, you can start `saslauthd` in 63 | debug mode while specifying the mandatory LDAP authentication mechanism: 64 | 65 | ``` 66 | sudo saslauthd -d -a ldap 67 | ``` 68 | 69 | The test utility for the SASL authentication server can then be used in a 70 | secondary terminal. Replace `user` and `password` with credentials stored 71 | in LDAP. 72 | 73 | ``` 74 | sudo testsaslauthd -u user -p password 75 | 0: OK "Success." 76 | 77 | sudo testsaslauthd -u user -p wrongpassword 78 | 0: NO "authentication failed" 79 | ``` 80 | 81 | After testing, you can stop `saslauthd` using `ctrl-c`. 82 | 83 | ### Enable the `saslauthd` service 84 | 85 | You will need to edit the `/etc/default/saslauthd` to enable the `saslauthd` service to run at boot and have it use LDAP for authentication. You can use sed to do this quickly. 86 | ``` 87 | sudo sed -i -e "s/START=.*/START=yes/" -e "s/MECHANISMS=.*/MECHANISMS=\"ldap\"/" /etc/default/saslauthd 88 | ``` 89 | 90 | This will make the following changes to `/etc/default/saslauthd`. 91 | ``` 92 | [...] 93 | # Should saslauthd run automatically on startup? (default: no) 94 | START=yes 95 | [...] 96 | # Example: MECHANISMS="pam" 97 | MECHANISMS="ldap" 98 | [...] 99 | ``` 100 | 101 | 102 | It is not necessary to point `MECH_OPTIONS` to the LDAP configuration file 103 | since this is the default for this mechanism. 104 | 105 | Now you can start, restart and stop `saslauthd` using the `service` scripts: 106 | 107 | ``` 108 | sudo service saslauthd restart 109 | ``` 110 | 111 | If you experience issues, check `/var/log/auth.log` for `saslauthd` entries. 112 | 113 | ### Cyrus SASL Configuration file 114 | 115 | Cyrus SASL requires a configuration file in order to know how to check user 116 | credentials. For Prosody, the file is named `prosody.conf` by default. 117 | Its location varies by OS and distribution as shown in the following table: 118 | 119 | | Platform | Location | 120 | | ----------------- | ---------- | 121 | | Debian and Ubuntu | /etc/sasl | 122 | | Arch, RHEL/CentOS | /etc/sasl2 | 123 | 124 | So for Debian systems, create the file `/etc/sasl/prosody.conf`. 125 | The directory `/etc/sasl` might not yet exist. 126 | 127 | ``` 128 | sudo mkdir /etc/sasl/ 129 | 130 | cat << 'EOF' |sudo tee /etc/sasl/prosody.conf > /dev/null 131 | pwcheck_method: saslauthd 132 | mech_list: PLAIN 133 | EOF 134 | ``` 135 | 136 | :::note 137 | The filename `prosody.conf` corresponds to a value for `cyrus_application_name` 138 | in the Prosody config. Since we have not changed the default this has a value of `prosody`. 139 | 140 | ::: 141 | 142 | The Prosody documentation has more details on a 143 | [Cyrus SASL-related setup](https://prosody.im/doc/cyrus_sasl). 144 | 145 | ## Set up Prosody 146 | 147 | If you have tested the LDAP authentication successfully and enabled the `saslauthd` service, you can change Prosody's authentication to the Cyrus backend by changing the `authentication` setting in `/etc/prosody/conf.avail/$(hostname -f).cfg.lua` via the command: 148 | ``` 149 | sed -i -E -e "/^ *VirtualHost \"$(hostname -f)\"/,/^ *VirtualHost/ {s/authentication ?=.*$/authentication = \"cyrus\"/}" /etc/prosody/conf.avail/$(hostname -f).cfg.lua 150 | ``` 151 | 152 | You might also have to add the `allow_unencrypted_plain_auth` option to allow 153 | plain-text passwords to be sent over the network. *This is not recommended* as it 154 | makes the setup less secure. So please try without this line first and only add 155 | it if you have problems authenticating. 156 | 157 | ``` 158 | authentication = "cyrus" 159 | allow_unencrypted_plain_auth = true 160 | ``` 161 | 162 | ### Set Permissions 163 | 164 | Prosody will now try to access the saslauthd socket in 165 | `/var/run/saslauthd/` to communicate with the authentication daemon. 166 | This folder only allows access to user `root` and group `sasl` while prosody 167 | runs as the system user/group `prosody`. 168 | 169 | The easiest solution is to add the `sasl` group to the `prosody` user and 170 | restart the service. 171 | 172 | ``` 173 | sudo adduser prosody sasl 174 | sudo service prosody restart 175 | ``` 176 | 177 | -------------------------------------------------------------------------------- /docs/devops-guide/requirements.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: devops-guide-requirements 3 | title: Requirements 4 | --- 5 | 6 | :::note 7 | Jitsi Meet is a real-time system. 8 | Requirements are very different from a web server and depend on many factors. 9 | Miscalculations can very easily destroy basic functionality rather than cause slow performance. 10 | Avoid adding other functions to your Jitsi Meet setup as it can harm performance and complicate optimizations. 11 | 12 | Note that Jitsi Meet design priorizes scalability by adding servers on using a huge server. Check Jitsi-videobridge documentation on adding several bridges to a Jitsi Meet server, and OCTO to go even beyond that (federation of Jitsi Meet servers). If you feel that you are a network and server administration newbie, don't even think of going there. 13 | ::: 14 | 15 | # Jitsi Meet needs, by order of importance 16 | 17 | - Network link: basic speed and reliability are essential. Check speed against the provider claims using any download tool (or ftp), and 18 | verify latency using a tool such as iperf3. 19 | Exact calculation is very complex and depend on many optimisations and tricks, but you should at least remember these numbers on resolution: 20 | 180 = 200 kbits/s 21 | 360 = 500 kbits/s 22 | 720 (HD) = 2500 kbits/s 23 | 4k = 10 Mbits/s 24 | So don't expect to have 20 users using 4K on a server with 100Mbits/s upload and download. 25 | For a friends/small organization server, 1 Gbits/s will often be enough but for a serious server 10 Gbits/s 26 | is advisable. Several (or many...) bridges having each a 10 Gbits/s link are used by big deployments. 27 | 28 | **These requirements concern the videobridge. If there are only external videobridges (as can be the case on high end Jitsi Meet servers), network performance matters much less.** 29 | 30 | - **RAM:** it's usually suggested to get 8 GB. 31 | For small meetings you can get away with 4 GB, for test servers or very small meetings you can try to use 2 GB. 32 | For big meetings it's suggested to go the scalable way over getting huge amounts of memory. 33 | 34 | 35 | - **CPU:** very low processor performance can seriously harm a real time system, especially when using a shared server (where your CPU performance can be stolen by other customers of your hoster, check on 'dedicated CPU' if you are getting a VPS, rather than a physical server). However, a consideration is that a Jitsi Meet component, Prosody, can only use ONE (1) core. So getting a lot of cores, let's say more than 32, is not always useful. For a basic server, 4 dedicated cores can be enough. 36 | 37 | - **Disk:** unless you are doing heavy logging or have very specific needs, you can get away with 20 Gbytes of standard hard disk. 38 | SSD are more a nice to have than a necessity. 39 | 40 | 41 | **If you want additional services, requirements can go up.** 42 | 43 | 44 | # Recording 45 | 46 | Jibri needs ONE system per recording. 47 | One Jibri instance = one meeting. For 5 meetings recorded simultaneously, you need 5 Jibris. 48 | There is no workaround to that. 49 | If you are knowledgeable, you can setup Jibris in containers and use a big server to save a bit on resources but that's about it. 50 | 51 | Jibri RAM, CPU and hard disk needs are far higher than Jitsi Meet itself, as it does video encoding. 52 | For `1080x720` you currently need at least 8 GB RAM, for `1280x1024` 12 GB (this is for recording a __single__ meeting). 53 | For cloud storage you will need at least SSD drives. 54 | If memory is not sufficient, CPU can't encode fast enough or hard disk is not fast enough, recordings will fail. 55 | 56 | While Jibri and Jitsi Meet can technically be hosted in a single server, it's not recommended because Jibri is a resource drain and it can harm Jitsi Meet performance, and can exhaust disk space and stop Jitsi Meet function altogether. 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /docs/devops-guide/reservation.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: reservation 3 | title: Reservation System setup 4 | sidebar_label: Reservation System 5 | --- 6 | 7 | ### Support for a reservation system over REST API 8 | 9 | It is possible to connect to an external conference reservation system using a 10 | REST API. Before a new Jitsi Meet conference is created, the reservation system will be 11 | queried for room availability. The system is supposed to return a positive or 12 | negative response code, which also contains conference duration. Prosody will enforce 13 | conference duration and if the time limit is exceeded the conference will be 14 | terminated. 15 | 16 | #### Enable reservation system 17 | 18 | In order to enable the reservation system, the URL base for the REST API endpoint must be 19 | configured. Under the main virtual host in prosody, enable module "reservations" and 20 | add the config `reservations_api_prefix`: 21 | 22 | ``` 23 | VirtualHost "jitmeet.example.com" 24 | -- .... 25 | modules_enabled = { 26 | -- .... 27 | "reservations"; 28 | } 29 | reservations_api_prefix = "http://reservation.example.com" 30 | ``` 31 | 32 | The URL base is used to construct the request URL. Currently, only `'/conference'` 33 | endpoint is supported, so all request will go to: 34 | 35 | ``` 36 | http://reservation.example.com/conference 37 | ``` 38 | Additional configuration options are available: 39 | * "reservations_api_timeout" to change API call timeouts (defaults to 20 seconds) 40 | * "reservations_api_headers" to specify custom HTTP headers included in 41 | all API calls e.g. to provide auth tokens. 42 | * "reservations_api_retry_count" to specify the number of times API call failures are retried (defaults to 3) 43 | * "reservations_api_retry_delay" seconds to wait between retries (defaults to 3s) 44 | * "reservations_api_should_retry_for_code" as a function that takes an HTTP response code and 45 | returns true if the API call should be retried. By default, retries are done for 5XX 46 | responses. Timeouts are never retried, and HTTP call failures are always retried. 47 | * "reservations_enable_max_occupants" to enable support for setting max occupants. If this is set to `true`, and if 48 | the API response payload includes a "max_occupants" value, then that value will be set as the max occupancy limit 49 | for that specific room. 50 | * "muc_max_occupants" module must also be enabled for this to work. 51 | * "reservations_enable_lobby_support" to enable support for lobby. If this is set to `true`, and if 52 | the API response payload includes a "lobby" field set to `true` , then the lobby will be enabled for the room. 53 | * "muc_lobby_rooms" and "persistent_lobby" modules must also be enabled for this to work. 54 | * "reservations_enable_password_support" to enable support for room password. If this is set to `true`, and if 55 | the API response payload includes a "password" value, then that value will be set as room password. Users will then 56 | be required to know that password to be able to join the room, or in the case where lobby is enabled, can use the 57 | password to bypass the lobby. 58 | 59 | ``` 60 | --- The following are all optional 61 | reservations_api_headers = { 62 | ["Authorization"] = "Bearer TOKEN-237958623045"; 63 | } 64 | reservations_api_timeout = 10 -- timeout if API does not respond within 10s 65 | reservations_api_retry_count = 5 -- retry up to 5 times 66 | reservations_api_retry_delay = 1 -- wait 1s between retries 67 | reservations_api_should_retry_for_code = function (code) 68 | return code >= 500 or code == 408 69 | end 70 | reservations_enable_max_occupants = true -- enable integration with muc_max_occupants 71 | reservations_enable_lobby_support = true -- enable integration with muc_lobby_rooms 72 | reservations_enable_password_support = true -- enable support for setting room passwords 73 | ``` 74 | 75 | #### Call flow 76 | 77 | ##### Notes 78 | 79 | All API calls use the following datetime format: 80 | 81 | `yyyy-MM-dd'T'HH:mm:ss.SSSX` - more info can be found in 82 | `SimpleDateFormat` [JavaDoc] 83 | 84 | [JavaDoc]: https://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html 85 | 86 | ##### Conference allocation 87 | 88 | When the first user joins a MUC room (i.e. Jitsi Meet URL is opened), an `HTTP POST` 89 | request is sent to `'/conference'` endpoint with the following parameters 90 | included: 91 | 92 | * `name (string)` - short name of the conference room (not full MUC address). If tenant is used, the name will be `[tenant]roomname`. 93 | * `start_time (string)` - conference start date and time 94 | * `mail_owner (string)` - if authentication system is enabled this field will 95 | contain user's identity. It that case it will not be possible to create a new 96 | conference room without authenticating. 97 | 98 | The payload sent to the endpoint will be encoded as `application/x-www-form-urlencoded`. 99 | 100 | The reservation system is expected to respond with one of the following 101 | responses: 102 | 103 | ###### HTTP 200 or 201 Conference created successfully 104 | 105 | In the HTTP response, a JSON object is expected. It should contain conference `id` 106 | assigned by the system and `duration` measured in seconds. Sample response body: 107 | 108 | ``` 109 | { 110 | "id": 364758328, 111 | "name": "conference1234", 112 | "mail_owner": "user@server.com", 113 | "start_time": "2048-04-20T17:55:12.000Z", 114 | "duration": 900000 115 | } 116 | ``` 117 | 118 | The object can optionally include a `max_occupants` key with an integer value. When provided, and if 119 | `reservations_enable_max_occupants` is enabled, then the value will be passed to muc_mod_max_occupants to enforce 120 | per-room occupancy limits. 121 | 122 | 123 | ###### HTTP 409 - Conference already exists 124 | 125 | This is to recover from previous failures. If for some reason the conference was 126 | restarted and the user tries to create the room again, this response informs Prosody 127 | that the conference room already exists. It is expected to contain 128 | `conflict_id` in the JSON response body: 129 | 130 | ``` 131 | { 132 | "conflict_id": 364758328 133 | } 134 | ``` 135 | 136 | Prosody will use `HTTP GET` to fetch information about the conflicting conference for the 137 | given `conflict_id`. More info about this request can be found in the "Reading conference info" 138 | section. 139 | 140 | ###### HTTP 4xx 141 | 142 | Other response codes will cause conference creation failure. The JSON response 143 | can contain a `message` object which will be sent back to the client. 144 | 145 | For example `user1` tries to start a new conference by sending 146 | `conference` IQ to Jicofo. The system will reject the request. 147 | 148 | Client -> Jicofo: 149 | 150 | ``` 151 | 152 | 153 | 154 | ``` 155 | 156 | Prosody -> Reservation system: 157 | 158 | ``` 159 | POST /conference HTTP/1.1 160 | content-type:application/x-www-form-urlencoded;charset=utf-8 161 | host: http://reservation.example.com 162 | content-length: length 163 | 164 | name=testroom1&start_time=2048-04-20T17%3A55%3A12.000Z&mail_owner=client1%40xmpp.com 165 | ``` 166 | 167 | Reservation system -> Prosody: 168 | 169 | ``` 170 | HTTP/1.1 403 Forbidden 171 | Content-Type: application/json; charset=utf-8 172 | Content-Length: length 173 | 174 | { 175 | "message": "client1 is not allowed to create the room at this time" 176 | } 177 | ``` 178 | 179 | Prosody -> Client: 180 | 181 | ``` 182 | 183 | 184 | 185 | 186 | client1 is not allowed to create the room at this time 187 | 188 | 189 | 190 | 191 | ``` 192 | 193 | The application can use `text` and `reservation-error` elements to 194 | provide meaningful information to the user. 195 | 196 | ##### Reading conference info 197 | 198 | In case of a `409` response to the `HTTP POST` request, Prosody will try 199 | to read information about the conflicting conference using an `HTTP GET` 200 | `/conference/{conflict_id}` endpoint. The response should provide all 201 | information about the conference stored in the reservation system: 202 | 203 | * `"id"`: conference identifier assigned by the reservation system 204 | * `"name"`: conference room name 205 | * `"mail_owner"`: identity of the user who has created the conference 206 | * `"start_time"`: conference start date and time 207 | * `"duration"`: scheduled conference duration in seconds 208 | 209 | The optional `max_occupants` value should also be provided if applicable. 210 | 211 | Sample response JSON body (contains the same info as `200 OK` to 212 | `HTTP POST`): 213 | 214 | ``` 215 | { 216 | "id": 364758328, 217 | "name": "conference1234", 218 | "mail_owner": "user@server.com", 219 | "start_time": "2048-04-20T17:55:12.000Z", 220 | "duration": 900000 221 | } 222 | ``` 223 | 224 | ##### Deleting conference 225 | 226 | Prosody deletes conferences in the reservation system in two cases. First when 227 | all users leave XMPP Multi User Chat room. Secondly when the conference duration limit 228 | is exceeded. In the latter case Prosody will destroy the XMPP MUC room. 229 | After the MUC room is destroyed, Prosody sends an `HTTP DELETE` request to 230 | `'/conference/{id}'` endpoint where `{id}` is replaced with 231 | conference identifier assigned by the reservation system. 232 | 233 | ``` 234 | DELETE /conference/364758328 HTTP/1.1 235 | host: http://reservation.example.com 236 | ... 237 | ``` 238 | 239 | #### Implementation diagram 240 | 241 | ![](https://raw.githubusercontent.com/jitsi/handbook/master/docs/assets/reservation-api.png) 242 | -------------------------------------------------------------------------------- /docs/devops-guide/scalable.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: devops-guide-scalable 3 | title: DevOps Guide (scalable setup) 4 | sidebar_label: Scalable setup 5 | --- 6 | 7 | A single server Jitsi installation is good for a limited size of concurrent conferences. 8 | The first limiting factor is the videobridge component, that handles the actual video and audio traffic. 9 | It is easy to scale the video bridges horizontally by adding as many as needed. 10 | In a cloud based environment, additionally the bridges can be scaled up or down as needed. 11 | 12 | :::warning 13 | The [Youtube Tutorial on Scaling](https://www.youtube.com/watch?v=LyGV4uW8km8) is outdated and describes an old configuration method. 14 | The current default Jitsi Meet install is already configured for horizontal scalability. 15 | ::: 16 | 17 | :::note 18 | Building a scalable infrastructure is not a task for beginning Jitsi Administrators. 19 | The instructions assume that you have installed a single node version successfully, and that 20 | you are comfortable installing, configuring and debugging Linux software. 21 | This is not a step-by-step guide, but will show you, which packages to install and which 22 | configurations to change. 23 | It is highly recommended to use configuration management tools like Ansible or Puppet to manage the 24 | installation and configuration. 25 | ::: 26 | 27 | ## Architecture (Single Jitsi-Meet, multiple videobridges) 28 | 29 | A first step is to split the functions of the central jitsi-meet instance (with nginx, prosody and jicofo) and 30 | videobridges. 31 | 32 | A simplified diagram (with open network ports) of an installation with one Jitsi-Meet instance and three 33 | videobridges that are load balanced looks as follows. Each box is a server/VM. 34 | 35 | ``` 36 | + + 37 | | | 38 | | | 39 | v v 40 | 80, 443 TCP 443 TCP, 10000 UDP 41 | +--------------+ +---------------------+ 42 | | nginx | 5222 TCP | | 43 | | Jitsi Meet |<-------------------+| jitsi-videobridge | 44 | | prosody | | | | 45 | | jicofo | | +---------------------+ 46 | +--------------+ | 47 | | +---------------------+ 48 | | | | 49 | +----------+| jitsi-videobridge | 50 | | | | 51 | | +---------------------+ 52 | | 53 | | +---------------------+ 54 | | | | 55 | +----------+| jitsi-videobridge | 56 | | | 57 | +---------------------+ 58 | ``` 59 | 60 | ## Machine Sizing 61 | 62 | The Jitsi-Meet server will generally not have that much load (unless you have many) conferences 63 | going at the same time. A 4 CPU, 8 GB machine will probably be fine. 64 | 65 | The videobridges will have more load. 4 or 8 CPU with 8 GB RAM seems to be a good configuration. 66 | 67 | 68 | ### Installation of Jitsi-Meet 69 | 70 | Assuming that the installation will run under the following FQDN: `meet.example.com` and you have 71 | SSL cert and key in `/etc/ssl/meet.example.com.{crt,key}` 72 | 73 | Set the following DebConf variables prior to installing the packages. 74 | (We are not installing the `jitsi-meet` package which would handle that for us) 75 | 76 | Install the `debconf-utils` package 77 | 78 | ``` 79 | $ cat << EOF | sudo debconf-set-selections 80 | jitsi-videobridge jitsi-videobridge/jvb-hostname string meet.example.com 81 | jitsi-meet jitsi-meet/jvb-serve boolean false 82 | jitsi-meet-prosody jitsi-videobridge/jvb-hostname string meet.example.com 83 | jitsi-meet-web-config jitsi-meet/cert-choice select I want to use my own certificate 84 | jitsi-meet-web-config jitsi-meet/cert-path-crt string /etc/ssl/meet.example.com.crt 85 | jitsi-meet-web-config jitsi-meet/cert-path-key string /etc/ssl/meet.example.com.key 86 | jitsi-meet-web-config jitsi-meet/jaas-choice boolean false 87 | EOF 88 | ``` 89 | 90 | To enable integration with [Jitsi Meet Components](https://jaas.8x8.vc/#/components) for telephony support, set 91 | the `jitsi-meet/jaas-choice` option above to `true`. 92 | 93 | On the jitsi-meet server, install the following packages: 94 | 95 | * `nginx` 96 | * `prosody` 97 | * `jicofo` 98 | * `jitsi-meet-web` 99 | * `jitsi-meet-prosody` 100 | * `jitsi-meet-web-config` 101 | 102 | ### Installation of Videobridge(s) 103 | 104 | For simplicities sake, set the same `debconf` variables as above and install 105 | 106 | * `jitsi-videobridge2` 107 | 108 | ### Configuration of jitsi-meet 109 | 110 | #### Firewall 111 | 112 | Open the following ports: 113 | 114 | Open to world: 115 | 116 | * 80 TCP 117 | * 443 TCP 118 | 119 | Open to the videobridges only 120 | 121 | * 5222 TCP (for Prosody) 122 | 123 | 124 | #### NGINX 125 | 126 | Create the `/etc/nginx/sites-available/meet.example.com.conf` as usual 127 | 128 | #### Jitsi-Meet 129 | 130 | Adapt `/usr/share/jitsi-meet/config.js` and `/usr/share/jitsi-meet/interface-config.js` to your specific needs 131 | 132 | #### Jicofo 133 | 134 | No changes necessary from the default install. 135 | 136 | ### Configuration of the Videobridge 137 | 138 | #### Firewall 139 | 140 | Open the following ports: 141 | 142 | Open to world: 143 | 144 | * 10000 UDP (for media) 145 | 146 | #### jitsi-videobridge2 147 | 148 | No changes necessary from the default setup. 149 | 150 | ## Testing 151 | 152 | After restarting all services (`prosody`, `jicofo` and all the `jitsi-videobridge2`) you can see in 153 | `/var/log/prosody/prosody.log` and 154 | `/var/log/jitsi/jicofo.log` that the videobridges connect to Prososy and that Jicofo picks them up. 155 | 156 | When a new conference starts, Jicofo picks a videobridge and schedules the conference on it. 157 | -------------------------------------------------------------------------------- /docs/devops-guide/secure-domain.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: secure-domain 3 | title: Secure Domain setup 4 | sidebar_label: Authentication (Secure Domain) 5 | --- 6 | 7 | It is possible to allow only authenticated users to create new conference 8 | rooms. Whenever a new room is about to be created, Jitsi Meet will prompt for 9 | a user name and password. After the room is created, others will be able to join 10 | from anonymous domain. Here's what has to be configured: 11 | 12 | ## Prosody configuration 13 | 14 | If you have installed Jitsi Meet from the Debian package, these changes should be made in `/etc/prosody/conf.avail/[your-hostname].cfg.lua` 15 | 16 | ### Enable authentication 17 | 18 | Inside the `VirtualHost "[your-hostname]"` block, replace anonymous authentication with hashed password authentication: 19 | 20 | ``` 21 | VirtualHost "jitsi-meet.example.com" 22 | authentication = "internal_hashed" 23 | ``` 24 | 25 | Replace `jitsi-meet.example.com` with your hostname. 26 | 27 | ### Enable anonymous login for guests 28 | 29 | Add this block **after the previous VirtualHost** to enable the anonymous login method for guests: 30 | 31 | ``` 32 | VirtualHost "guest.jitsi-meet.example.com" 33 | authentication = "anonymous" 34 | c2s_require_encryption = false 35 | ``` 36 | 37 | _Note that `guest.jitsi-meet.example.com` is internal to Jitsi, and you do not need to (and should not) create a DNS record for it, or generate an SSL/TLS certificate, or do any web server configuration. While it is internal, you should still replace `jitsi-meet.example.com` with your hostname._ 38 | 39 | ## Jitsi Meet configuration 40 | 41 | In config.js, the `anonymousdomain` options has to be set. 42 | 43 | If you have installed jitsi-meet from the Debian package, these changes should be made in `/etc/jitsi/meet/[your-hostname]-config.js`. 44 | 45 | ``` 46 | var config = { 47 | hosts: { 48 | domain: 'jitsi-meet.example.com', 49 | anonymousdomain: 'guest.jitsi-meet.example.com', 50 | ... 51 | }, 52 | ... 53 | } 54 | ``` 55 | 56 | ## Jicofo configuration 57 | 58 | When running Jicofo, specify your main domain in an additional configuration 59 | property. Jicofo will accept conference allocation requests only from the 60 | authenticated domain. This should go as a new 'authentication' section in `/etc/jitsi/jicofo/jicofo.conf`: 61 | 62 | ``` 63 | jicofo { 64 | authentication: { 65 | enabled: true 66 | type: XMPP 67 | login-url: jitsi-meet.example.com 68 | } 69 | ... 70 | ``` 71 | 72 | When using token based authentication, the type must use `JWT` as the scheme instead: 73 | 74 | ``` 75 | jicofo { 76 | authentication: { 77 | enabled: true 78 | type: JWT 79 | login-url: jitsi-meet.example.com 80 | } 81 | ... 82 | ``` 83 | 84 | ## Create users in Prosody (internal auth) 85 | 86 | Finally, run `prosodyctl` to create a user in Prosody: 87 | 88 | ``` 89 | sudo prosodyctl register jitsi-meet.example.com 90 | ``` 91 | and then restart prosody, jicofo and jitsi-videobridge2 92 | ``` 93 | systemctl restart prosody 94 | systemctl restart jicofo 95 | systemctl restart jitsi-videobridge2 96 | ``` 97 | 98 | :::note 99 | Docker users may require an alternate config path. Users of the official [`jitsi/prosody`](https://github.com/jitsi/docker-jitsi-meet) image should invoke `prosodyctl` as follows. 100 | 101 | ``` 102 | prosodyctl --config /config/prosody.cfg.lua register meet.jitsi 103 | ``` 104 | 105 | Full documentation for `prosodyctl` can be found on [the official site](https://prosody.im/doc/prosodyctl). 106 | ::: 107 | 108 | ## Optional: Jigasi configuration 109 | 110 | ### Enable Authentication 111 | 112 | If you are using Jigasi, set it to authenticate by editing the following lines in `/etc/jitsi/jigasi/sip-communicator.properties`: 113 | 114 | ```` 115 | org.jitsi.jigasi.xmpp.acc.USER_ID=SOME_USER@SOME_DOMAIN 116 | org.jitsi.jigasi.xmpp.acc.PASS=SOME_PASS 117 | org.jitsi.jigasi.xmpp.acc.ANONYMOUS_AUTH=false 118 | ```` 119 | 120 | Note that the password is the actual plaintext password, not a base64 encoding. 121 | 122 | ### Debugging 123 | 124 | If you experience problems with a certificate chain, you may need to uncomment the following line, also in `sip-communicator.properties`: 125 | 126 | ```` 127 | net.java.sip.communicator.service.gui.ALWAYS_TRUST_MODE_ENABLED=true 128 | ```` 129 | 130 | :::note 131 | This should only be used for testing/debugging purposes, or in controlled environments. If you confirm that this is the problem, you should then solve it in another way (e.g. get a signed certificate for Prosody, or add the particular certificate to Jigasi’s trust store). 132 | ::: 133 | -------------------------------------------------------------------------------- /docs/devops-guide/speakerstats.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: speakerstats 3 | title: Enabling Speaker Stats 4 | sidebar_label: Speaker Stats 5 | --- 6 | 7 | To enable the speaker stats we need to enable speakerstats module under the main 8 | virtual host, this is to enable the advertising the speaker stats component, 9 | which address needs to be specified in `speakerstats_component` option. 10 | 11 | We need to also enable the component with the address specified in `speakerstats_component`. 12 | The component needs also to have the option with the muc component address in 13 | `muc_component` option. 14 | 15 | ```lua 16 | VirtualHost "jitsi.example.com" 17 | speakerstats_component = "speakerstats.jitsi.example.com" 18 | modules_enabled = { 19 | "speakerstats"; 20 | } 21 | 22 | Component "speakerstats.jitsi.example.com" "speakerstats_component" 23 | muc_component = "conference.jitsi.example.com" 24 | 25 | Component "conference.jitsi.example.com" "muc" 26 | ``` 27 | -------------------------------------------------------------------------------- /docs/devops-guide/turn.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: turn 3 | title: Setting up TURN 4 | sidebar_label: TURN setup 5 | --- 6 | 7 | One-to-one calls should avoid going through the JVB for optimal performance and for optimal resource usage. This is why we've added the peer-to-peer mode where the two participants connect directly to each other. Unfortunately, a direct connection is not always possible between the participants. In those cases you can use a TURN server to relay the traffic (n.b. the JVB does much more than just relay the traffic, so this is not the same as using the JVB to "relay" the traffic). 8 | 9 | This document describes how to enable TURN server support in one-to-one calls in Jitsi Meet. Even though it gives some hints how to configure [prosody](https://prosody.im) and [coTURN](https://github.com/coturn/coturn), it assumes a properly configured TURN server, and a properly configured XMPP server. 10 | 11 | One way to configure TURN support in meet is with a static configuration. You can simply fill out the `p2p.stunServers` option with appropriate values, e.g.: 12 | 13 | ``` 14 | [ 15 | { urls: 'turn:turn.example.com1', username: 'user', credential: 'pass' }, 16 | ] 17 | ``` 18 | 19 | :::caution 20 | This technique doesn't require any special configuration on the XMPP server, but it exposes the credentials to your TURN server and other people can use your bandwidth freely, so while it's simple to implement, it's not recommended. 21 | ::: 22 | 23 | This [draft](https://tools.ietf.org/html/draft-uberti-behave-turn-rest-00) describes a proposed standard REST API for obtaining access to TURN services via ephemeral (i.e. time-limited) credentials. These credentials are vend by a web service over HTTP, and then supplied to and checked by a TURN server using the standard TURN protocol. The usage of ephemeral credentials ensures that access to the TURN server can be controlled even if the credentials can be discovered by the user. 24 | 25 | Jitsi Meet can fetch the TURN credentials from the XMPP server via [XEP-0215](https://xmpp.org/extensions/xep-0215.html) and this is configured by default using [mod_external_services](https://prosody.im/doc/modules/mod_external_services). The default configured turnserver uses the default ports for the protocol UDP 3478 and TCP(TLS) on 5349. 26 | 27 | ## Use TURN server on port 443 28 | 29 | By default, TURN server listens on standard ports UDP 3478 and TCP 5349 (for TLS connections). 30 | There are certain corporate networks which allow only TCP connections using port 443(https) and to cover 31 | this kind of scenarios it is useful to have TURN server listening on port 443 for TLS connections. 32 | Here is how to run nginx and TURN server on the same machine sharing port. 33 | For this you will need a second DNS record for your turn domain pointing to the same machine (as a reference below we will use `turn-jitsi-meet.example.com`). 34 | 35 | - You need to enable the multiplexing based on that new DNS record. You need to create a file in `/etc/nginx/modules` or `/etc/nginx/modules-available`. If you are placing the file in `/etc/nginx/modules-available` you need to add a symlink in `/etc/nginx/modules-enabled`. 36 | The file content should be: 37 | ``` 38 | stream { 39 | map $ssl_preread_server_name $name { 40 | jitsi-meet.example.com web_backend; 41 | turn-jitsi-meet.example.com turn_backend; 42 | } 43 | 44 | upstream web_backend { 45 | server 127.0.0.1:4444; 46 | } 47 | 48 | upstream turn_backend { 49 | server __your_public_ip__:5349; 50 | } 51 | 52 | server { 53 | listen 443; 54 | listen [::]:443; 55 | 56 | # since 1.11.5 57 | ssl_preread on; 58 | 59 | proxy_pass $name; 60 | 61 | # Increase buffer to serve video 62 | proxy_buffer_size 10m; 63 | } 64 | } 65 | ``` 66 | Make sure you edit the file and replace `jitsi-meet.example.com` with your domain of deployment, `turn-jitsi-meet.example.com` with the DNS name you will use for the TURN server and `__your_public_ip__` with your public IP of the deployment. 67 | If you have more virtual hosts make sure you add them here and do the port change for them (the next step). 68 | 69 | - Then go to `/etc/nginx/sites-available/your-conf` and change your virtual host to listen on port 4444 instead of 443. 70 | ``` 71 | server { 72 | listen 4444 ssl; 73 | listen [::]:4444 ssl; 74 | server_name jitsi-meet.example.com; 75 | ``` 76 | 77 | - Next you need to make sure Prosody is advertising the correct DNS name and port for the TURN server. You should edit the line using port `5349` in the file `/etc/prosody/conf.d/jitsi-meet.example.com.cfg.lua` and make it look like (change port and address): 78 | ``` 79 | { type = "turns", host = "turn-jitsi-meet.example.com", port = "443", transport = "tcp" } 80 | ``` 81 | - Now you need to make sure the TURN server (coturn) uses trusted certificates. 82 | Here is how to request those from Let's Encrypt (make sure you set correct values for the domain and email): 83 | ``` 84 | systemctl stop nginx 85 | DOMAIN="turn-jitsi-meet.example.com" 86 | apt install socat 87 | /opt/acmesh/.acme.sh/acme.sh -f --issue -d ${DOMAIN} --standalone --server letsencrypt 88 | /opt/acmesh/.acme.sh/acme.sh -f --install-cert \ 89 | -d ${DOMAIN} \ 90 | --key-file /etc/jitsi/meet/${DOMAIN}.key \ 91 | --fullchain-file /etc/jitsi/meet/${DOMAIN}.crt \ 92 | --reloadcmd "/usr/share/jitsi-meet/scripts/coturn-le-update.sh ${DOMAIN}" 93 | systemctl start nginx 94 | ``` 95 | - After restarting prosody (`systemctl restart prosody`) you are good to go! 96 | -------------------------------------------------------------------------------- /docs/devops-guide/video-sipgw.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: videosipgw 3 | title: Configuring a video SIP gateway 4 | sidebar_label: Video SIP gateway 5 | --- 6 | 7 | This document describes how you can configure jitsi-meet to use sipgw jibri and enable rooms in 'Add people dialog' 8 | You will need a working deployment of jibri configured to use a regular sip video device, for more info check out the [jibri documentation](https://github.com/jitsi/jibri/blob/master/README.md). 9 | 10 | This feature is available for non-guests of the system, so this relies on setting in config.js ``enableUserRolesBasedOnToken: true`` and providing a jwt token when accessing the conference. 11 | 12 | * Jicofo configuration: 13 | edit /etc/jitsi/jicofo/sip-communicator.properties (or similar), set the appropriate MUC to look for the Jibri Controllers. This should be the same MUC as is referenced in jibri's config.json file. Restart Jicofo after setting this property. 14 | 15 | ``` 16 | org.jitsi.jicofo.jibri.SIP_BREWERY=TheSipBrewery@conference.yourdomain.com 17 | ``` 18 | 19 | * Jitsi Meet configuration: 20 | - config.js: add 21 | ``` 22 | enableUserRolesBasedOnToken: true, 23 | peopleSearchQueryTypes: ['conferenceRooms'], 24 | peopleSearchUrl: 'https://api.yourdomain.com/testpath/searchpeople', 25 | ``` 26 | 27 | The combination of the above settings and providing a jwt token will enable a button under invite option which will show the dialog 'Add people'. 28 | 29 | ## People search service 30 | 31 | When searching in the dialog, a request for results is made to the `peopleSearchUrl` service. 32 | 33 | The request is in the following format: 34 | ``` 35 | https://api.yourdomain.com/testpath/searchpeople?query=testroomname&queryTypes=[%22conferenceRooms%22]&jwt=somejwt 36 | ``` 37 | The parameters are: 38 | - query - The text entered by the user. 39 | - queryTypes - What type of results we want people, rooms, conferenceRooms. This is the value from config.js `peopleSearchQueryTypes` 40 | - jwt - The token used by the user to access the conference. 41 | 42 | The response of the service is a json in the following format: 43 | ``` 44 | [ 45 | { 46 | "id": "address@sip.domain.com", 47 | "name": "Some room name", 48 | "type": "videosipgw" 49 | }, 50 | { 51 | "id": "address2@sip.domain.com", 52 | "name": "Some room name2", 53 | "type": "videosipgw" 54 | } 55 | ] 56 | ``` 57 | Type should be `videosipgw`, `name` is the name shown to the user and `id` is the sip address to be called by the sipgw jibri. 58 | -------------------------------------------------------------------------------- /docs/devops-guide/videotutorials.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: devops-guide-videotutorials 3 | title: Video Tutorials 4 | --- 5 | 6 | ## [Installing Jitsi Meet on your own Linux Server](https://jitsi.org/news/new-tutorial-installing-jitsi-meet-on-your-own-linux-server/) 7 | 8 |
9 | 10 |
11 | 12 | ## [How to Load Balance Jitsi Meet](https://jitsi.org/blog/tutorial-video-how-to-load-balance-jitsi-meet/) 13 | 14 |
15 | 16 |
17 | 18 | ## [Scaling Jitsi Meet in the Cloud](https://jitsi.org/blog/new-tutorial-video-scaling-jitsi-meet-in-the-cloud/) 19 | 20 |
21 | 22 |
23 | -------------------------------------------------------------------------------- /docs/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: faq 3 | title: FAQ 4 | --- 5 | 6 | ## How to tell if my server instance is behind NAT? 7 | 8 | In general, if the tool ifconfig (or ipconfig) shows the assigned IPv4 address to be a private / local address (10.x.x.x, or 172.16.x.x - 172.31.x.x, or 192.168.x.x) but you know that its public IPv4 address is different from that, the server is most probably behind NAT. 9 | 10 | If you are hosting your server on a VPS, and you are not sure, ask your VPS provider's support team. 11 | 12 | ## Clients could communicate well in the room created at `meet.jit.si`. The same clients still could connect to my self-hosted instance but could neither hear nor see one another. What's wrong? 13 | 14 | Most probably, the server is behind NAT, but you haven't added the NAT-specific configuration. See this [resolved question](https://community.jitsi.org/t/cannot-see-video-or-hear-audio-on-self-hosted-instance/). You need to follow the steps detailed [here](devops-guide/devops-guide-quickstart#advanced-configuration). 15 | 16 | ## It works with two participants but crashes or does not work properly when a third joins 17 | 18 | P2P mode is working, but it fails when you are trying to pass traffic via jitsi-videobridge2. 19 | 20 | Check you've got your firewall / NAT set up correctly — especially UDP 10000. For more information, see [here](devops-guide/devops-guide-quickstart#setup-and-configure-your-firewall). 21 | 22 | ## Can I mute and unmute other participants? 23 | 24 | If you are the moderator of a conference, you can mute everyone's microphone. You cannot unmute other people's microphones, and they can unmute their microphones at any time. 25 | 26 | You may want to set some "ground rules" for who can talk and when, just as with any physical meeting or classroom. 27 | 28 | If you would like to limit who can become a moderator, you need to set up your instance of Jitsi and enable "secure domain". Please see [here](#4-enable-secure-domain-if-you-are-using-your-instance-of-jitsi) for more information. 29 | 30 | ## How can I protect my meetings with Jitsi? 31 | 32 | ### _1. Create a "strong" room name._ 33 | 34 | Use a strong room name, that no one else is likely to be using. Use the name generator on the welcome page, or else generate your own "strong" name. 35 | 36 | For example, on macOS, in the terminal, you can use `uuidgen` to generate a string of letters of numbers (e.g. B741B63E-C5E6-4D82-BAC4-048BE25D8CC7). 37 | 38 | Your room name would be `meet.jit.si/B741B63E-C5E6-4D82-BAC4-048BE25D8CC7` on the hosted `meet.jit.si` platform. 39 | 40 | If you use "test" or "LucysMeeting" "pilates" or similar, then it's highly likely that other users will have had the same idea. 41 | 42 | ### _2. Use a different room name for each meeting / conference you have._ 43 | 44 | If you are going to have multiple meetings, ideally use a different room name for each one. 45 | 46 | If that is not practical, at least use a different room name for each group of people. 47 | 48 | ### _3. Add a password to the room._ 49 | 50 | Once you have started your room, set a password for it. Only people who have the password can join from that point on, but it does not affect people who have already joined. 51 | 52 | You will need to tell everyone the password. 53 | 54 | If they give the password to others, those other people can also join. 55 | 56 | ### _4. Enable "secure domain" if you are using your instance of Jitsi._ 57 | 58 | In addition to the tips above, consider enabling the ["secure domain" configuration](https://jitsi.github.io/handbook/docs/devops-guide/secure-domain). This requires you (or someone else) to enter a username and password to open a room. It also allows you to become a moderator. 59 | 60 | ## It's working when I connect from a browser, but not from the iOS or Android apps 61 | 62 | This probably means that you are not serving the fullchain for your TLS certificate. You can check if your cert chain 63 | is properly configured [here](https://whatsmychaincert.com/). 64 | 65 | In nginx, if you are using Let's Encrypt, you should have a line like this: 66 | 67 | `ssl_certificate /etc/letsencrypt/live/jitsi.example.com/fullchain.pem;` 68 | 69 | 70 | ## Can I record and save the video? 71 | 72 | Yes. There are multiple methods (using external software, services or the embedded feature): 73 | 74 | #### Record using the native feature 75 | 76 | Jitsi offers the possiblity to record locally the video (with audio) of the room. When the recording is stopped (either manually or when the max size of the file is reached) the file (in webm format) is saved into the device storage. 77 | 78 | To configure the feature, for self-hosted instances, see information [here](dev-guide/dev-guide-configuration/#recording). 79 | 80 | #### Record using external software / services 81 | 82 | _Note_: If you want to use a privacy-friendly method, use method 1 or 2. 83 | 84 | 1. **OBS**: Use [OBS](https://obsproject.com/) to record your Session (e.g. your browser window). 85 | 86 | 2. **RTMP-Server**: For this you have to setup your own RTMP-Server and then use your RTMP URL + Stream key instead of the Youtube Stream key as described [here](https://jitsi.org/blog/live-streaming-with-jitsi-and-youtube/). Self-installed Jitsi Meet deployments will need to setup Jibri to do this. 87 | 88 | 3. **Dropbox**: [Connect to Dropbox with Jitsi Meet](/handbook/docs/dev-guide/dev-guide-web-integrations#creating-the-dropbox-app-for-dropbox-recording-integration) and save the video in the Dropbox. 89 | 90 | 4. **Video Services/Websites**: Stream your conference to YouTube or other sites (e.g. Twitch) and access the recording there (see [howto](https://jitsi.org/blog/live-streaming-with-jitsi-and-youtube/)). Self-installed Jitsi Meet deployments will need to setup Jibri to do this. 91 | 92 | ## I set the password in meeting but it is not working the next time 93 | Once the meeting ends it's password also gets removed, so you need to set the password again for next meeting. 94 | 95 | ## How to limit the number of participants? 96 | 97 | 1. Use the command `prosodyctl about` to view the version of prosody and plug directory, similar to the output below. 98 | 99 | ``` 100 | Prosody 0.11.6 101 | 102 | # Prosody directories 103 | 104 | Data directory: /var/lib/prosody 105 | 106 | Config directory: /etc/prosody 107 | 108 | Source directory: /usr/lib/prosody 109 | 110 | Plugin directories: 111 | 112 | /usr/share/jitsi-meet/prosody-plugins/ 113 | 114 | /usr/lib/prosody/modules/ 115 | ``` 116 | 117 | 2. Check if there is a `mod_muc_max_occupants.lua` file in your plugin directory. 118 | 119 | If not, please create a new file `mod_muc_max_occupants.lua` in the plugin directory And copy everything from [here](https://github.com/jitsi/jitsi-meet/blob/master/resources/prosody-plugins/mod_muc_max_occupants.lua) to paste. 120 | 121 | If it exists, please ignore this step. 122 | 123 | 3.Edit your `/etc/prosody/conf.avail/meet.example.com.cfg.lua` file and add `muc_max_occupants` as a module_enabled in the conference.meet.example.com "muc" section. 124 | 125 | Then, add the options below that. You need both `muc_max_occupants` and `muc_access_whitelist` defined. 126 | 127 | Example: 128 | 129 | ``` 130 | Component "conference.meet.example.com" "muc" 131 | storage = "memory" 132 | modules_enabled = { 133 | "muc_meeting_id"; 134 | "muc_domain_mapper"; 135 | "muc_max_occupants"; 136 | } 137 | muc_max_occupants = "5" 138 | muc_access_whitelist = { "focus@auth.meet.example.com" } 139 | admins = { "focus@auth.meet.example.com" } 140 | muc_room_locking = false 141 | muc_room_default_public_jids = true 142 | ``` 143 | 144 | Note: the relationship between storage = "" and your prosody version, and you need to modify all storage="" . 145 | - Prosody nightly747 storage = "null" 146 | - Prosody 0.10 storage = "none" 147 | - Prosody 0.11 storage = "memory" 148 | 149 | 4. You need to use the command `prosodyctl restart` to see the effect. 150 | 151 | 5. If you want to update to use prosody, you can check [here](https://community.jitsi.org/t/how-to-how-do-i-update-prosody/72205). 152 | 153 | ## Other participants complain my screen sharing is very bright and appears washed out? 154 | You might have HDR streaming enabled in your OS display or graphic card settings. If you are on Windows, you can quickly toggle HDR on/off using `Win + Alt + B` for all your HDR-capable screens at any time, even while screen sharing. 155 | 156 | -------------------------------------------------------------------------------- /docs/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: intro 3 | title: Introduction 4 | --- 5 | 6 | ## What is Jitsi? 7 | 8 | Jitsi is a [collection of Open Source projects](architecture.md) which provide state-of-the-art video conferencing 9 | capabilities that are secure, easy to use, and easy to self-host. 10 | 11 | ## About this handbook 12 | 13 | This handbook aims to be the one-stop shop for all Jitsi documentation. 14 | 15 | :::note It's work in progress. 16 | If you want to help, please create a **Pull Request** in our [GitHub repository](https://github.com/jitsi/handbook)! 17 | ::: 18 | 19 | The content is divided into 3 main areas: 20 | 21 | * [User guide](/docs/category/user-guide): Designed to help users of the service, to better 22 | understand all the available features and how to use them. 23 | 24 | * [Developer guide](/docs/category/developer-guide): Designed to help developers who want to either 25 | integrate the Jitsi Meet API / SDK in their products or want to improve Jitsi Meet 26 | itself by developing new features or fixing bugs. 27 | 28 | * [Self-Hosting guide](devops-guide/devops-guide.md): Designed for folks wanting to self-host, system administrators 29 | or anyone who wishes to deploy and operate their own Jitsi Meet instance. 30 | 31 | ## JaaS customers 32 | 33 | Are you a JaaS customer? If so, please start [here](https://developer.8x8.com/jaas/docs/jaas-onboarding). 34 | -------------------------------------------------------------------------------- /docs/releases.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: releases 3 | title: Releases 4 | --- 5 | 6 | :::tip 7 | Release notes for Jitsi Meet are kept [here](https://github.com/jitsi/jitsi-meet-release-notes). 8 | ::: 9 | 10 | import Tabs from '@theme/Tabs'; 11 | import TabItem from '@theme/TabItem'; 12 | 13 | 14 | 15 | ### Apps 16 | 17 | | Android | Android (F-Droid) | iOS | 18 | |:-:|:-:|:-:| 19 | | [](https://play.google.com/store/apps/details?id=org.jitsi.meet) | [](https://f-droid.org/en/packages/org.jitsi.meet/) | [](https://itunes.apple.com/us/app/jitsi-meet/id1165103905) | 20 | 21 | ### Apps (beta) 22 | 23 | If you are feeling adventurous and want to get an early scoop of the features as they are being 24 | developed you can also sign up for our open beta testing here: 25 | 26 | | Android | iOS | 27 | |:-:|:-:| 28 | | [Play Store Beta](https://play.google.com/apps/testing/org.jitsi.meet) | [TestFlight](https://testflight.apple.com/join/isy6ja7S) 29 | 30 | ### SDKs 31 | 32 | | Android | iOS | 33 | | :--: | :--: | 34 | | [Maven repository](https://jitsi.github.io/handbook/docs/dev-guide/dev-guide-android-sdk#use-pre-build-sdk-artifactsbinaries) | [CocoaPods](https://cocoapods.org/pods/JitsiMeetSDK) 35 | 36 | 37 | | Windows | macOS | GNU/Linux (AppImage) | GNU/Linux (Deb) | 38 | | :--: | :--: | :--: | :--: | 39 | | [Download](https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.exe) | [Download](https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet.dmg) | [Download](https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet-x86_64.AppImage) | [Download](https://github.com/jitsi/jitsi-meet-electron/releases/latest/download/jitsi-meet-amd64.deb) | 40 | 41 | The desktop applications are based on Electron. For macOS, it is also available as a `brew` cask which can be installed using `brew install jitsi-meet`. 42 | 43 | 44 | ### Docker images 45 | 46 | See the Docker image releases [here](https://github.com/jitsi/docker-jitsi-meet/releases). 47 | 48 | ### Debian/Ubuntu packages 49 | 50 | * [`stable`](https://download.jitsi.org/stable/) ([instructions](https://jitsi.org/downloads/ubuntu-debian-installations-instructions/)) 51 | * [`testing`](https://download.jitsi.org/testing/) ([instructions](https://jitsi.org/downloads/ubuntu-debian-installations-instructions-for-testing/)) 52 | * [`nightly`](https://download.jitsi.org/unstable/) ([instructions](https://jitsi.org/downloads/ubuntu-debian-installations-instructions-nightly/)) 53 | 54 | ### Web frontend 55 | 56 | Latest stable release | [![release](https://img.shields.io/badge/release-latest-green.svg)](https://github.com/jitsi/jitsi-meet/releases/latest) | 57 | |---|---| 58 | 59 | Prebuilt [source builds](https://download.jitsi.org/jitsi-meet/src/) are also available. 60 | 61 | :::note 62 | Generally, you won't need to download this, as it's part of the Debian packages and Docker images already. 63 | ::: 64 | 65 | 66 | -------------------------------------------------------------------------------- /docs/security.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: security 3 | title: Security 4 | --- 5 | 6 | This topic is relatively complex, so we created a post that covers it much 7 | more broadly here: https://jitsi.org/security 8 | -------------------------------------------------------------------------------- /docs/user-guide/advanced.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-advanced 3 | title: User Guide (advanced) 4 | sidebar_label: Advanced options 5 | --- 6 | 7 | There are some options to tweak the invitation link to unlock more features in 8 | Jitsi. The following parameters apply to the web, iframe and mobile version. 9 | 10 | All keys listed here are prefixed with `config.`. 11 | You pick a key, combine it with its value using `=` and link parameters 12 | with `&`, e.g. `#config.defaultLanguage=en&config.minParticipants=3`. 13 | 14 | 20 | 21 | ## Invitations 22 | 23 | These parameters affect how you can invite people either before or within a session. 24 | 25 | Key | Value | Effect 26 | ------------------------------- | ------ | ----------------------------------- 27 | `disableInviteFunctions` | `true` | disable invite function of the app 28 | `minParticipants` | `2` | override the minimum number of participants before starting a call 29 | `prejoinConfig.enabled` | `true` | show an intermediate page before joining to allow for adjustment of devices 30 | 31 | ## UI 32 | 33 | These parameters have an effect on the user interface. 34 | 35 | Key | Value | Effect 36 | ------------------------------- | ------ | ----------------------------------- 37 | `defaultLanguage` | `en` | change the UI default language 38 | `disableThirdPartyRequests` | `true` | generate avatars locally and disable callstats integration 39 | `enableDisplayNameInStats` | `true` | send display names of participants to callstats 40 | `enableEmailInStats` | `true` | send email (if available) to callstats and other analytics 41 | `enableInsecureRoomNameWarning` | `true` | show a warning label if the room name is deemed insecure 42 | 43 | ## Video 44 | 45 | Use these parameters to influence the video of a session. 46 | 47 | Key | Value | Effect 48 | ------------------------------- | ------ | ----------------------------------- 49 | `desktopSharingFrameRate.min` | `5` | override the minimum framerate for desktop sharing 50 | `desktopSharingFrameRate.max` | `5` | override the maximum framerate for desktop sharing 51 | `startWithVideoMuted` | `true` | disable video when joining 52 | 53 | ## Audio 54 | 55 | Use these parameters to influence the audio of a session. 56 | 57 | Key | Value | Effect 58 | ------------------------------- | ------ | ----------------------------------- 59 | `disableAudioLevels` | `true` | disable audio statistics polling (thereby perhaps improving performance) 60 | `disableRemoteMute` | `true` | disable all muting operations of remote participants 61 | `startWithAudioMuted` | `true` | turn off audio input when joining 62 | `startSilent` | `true` | mute audio input and output 63 | -------------------------------------------------------------------------------- /docs/user-guide/basic.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-basic 3 | title: User Guide (basic) 4 | sidebar_label: Basic options 5 | --- 6 | 7 | Welcome to the user guide! 8 | 9 | Check back soon! 10 | -------------------------------------------------------------------------------- /docs/user-guide/browsers.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: supported-browsers 3 | title: Supported Browsers 4 | --- 5 | 6 | ## Desktop browsers 7 | 8 | | Browser | Support | Versions | Notes | 9 | |---|:---:|:---:|---| 10 | | Chrome [^1] | ✅ | >= 72 | Best results with >= 96 | 11 | | Firefox | ✅ | >= 68 | Best results with >= 101 | 12 | | Safari | ✅ | >= 14 | Best results with >= 15, output device selection unsupported | 13 | | Edge | ✅ | >= 79 | Edge Legacy is unsupported | 14 | | Internet Explorer | ❌ | | | 15 | 16 | ## Mobile browsers 17 | 18 | ### Android 19 | 20 | | Browser | Support | Versions | Notes | 21 | |---|:---:|:---:|---| 22 | | Chrome [^1] | ✅ | | Same support as the desktop version | 23 | | Firefox | ✅ | | Same support as the desktop version | 24 | 25 | :::note 26 | For a better mobile experience (background support, Bluetooth support, etc.) we recommend using a 27 | native app instead. We provide a [native Android SDK](/handbook/docs/dev-guide/dev-guide-android-sdk). 28 | ::: 29 | 30 | ### iOS 31 | 32 | | Browser | Support | Versions | Notes | 33 | |---|:---:|:---:|---| 34 | | Chrome | ✅ | | Same support as Safari as they share the engine | 35 | | Firefox | ✅ | | Same support as Safari as they share the engine | 36 | | Safari | ✅ | >= 14.3 | Best results with 15.4 | 37 | | Edge | ✅ | | Same support as Safari as they share the engine | 38 | 39 | :::note 40 | On iOS all browsers share the same engine, Safari. As such all features and limitations on all iOS 41 | browsers are those of Safari. 42 | 43 | For a better mobile experience (background support, CallKit integration, etc.) we recommend using a 44 | native app instead. We provide a [native iOS SDK](/handbook/docs/dev-guide/dev-guide-ios-sdk). 45 | ::: 46 | 47 | [^1]: This also applies to all Chromium based browsers such as Brave, (current) Edge, Opera, Vivaldi and others. 48 | -------------------------------------------------------------------------------- /docs/user-guide/client-connection-status-indicators.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: client connection status indicators 3 | title: Client Connection Status Indicators 4 | --- 5 | 6 | This document explains what the different connection quality indicators on the video thumbnails actually mean. 7 | 8 | ## GOOD 9 | * With video enabled, when the send bitrate for the video stream is at least 50% of the target bitrate expected for the stream. Please refer to the target bitrates table below. 10 | * With video disabled or screen sharing is in progress, when the downstream packet loss is less than 6%. 11 | 12 | ## NON-OPTIMAL 13 | * With video enabled, when the send bitrate for the video stream is at least 30% of the target bitrate expected for the stream. Please refer to the target bitrates table below. 14 | * With video disabled or screen sharing is in progress, when the downstream packet loss is between 6% and 8%. 15 | 16 | ## POOR 17 | * With video enabled, when the send bitrate for the video stream is at least 10% of the target bitrate expected for the stream. Please refer to the target bitrates table below. 18 | * With video disabled or screen sharing is in progress, when the downstream packet loss is between 8% and 12%. 19 | 20 | ## LOST 21 | * When the user stops receiving video for the remote endpoint even when the endpoint is not video muted and it is in LastN as indicated by the bridge’s LastNEndpointChangeEvent. 22 | * When the bridge sends an EndpointConnectivityStatusChangeEvent indicating that the remote endpoint is no longer active, i.e., when the bridge has not received media from the remote endpoint for more than 3 secs. 23 | 24 | ## GHOST/NINJA 25 | * When the user stops receiving video for the remote endpoint even when the endpoint is not video muted and it is not in LastN as indicated by the bridge’s LastNEndpointChangeEvent. This means that the bridge decided to suspend the video for this user. Bridge takes into consideration the available downlink bandwidth for the receiving endpoint and the number of video streams requested using the channelLast setting. 26 | 27 | ## Target bitrates expected for the video streams 28 | 29 | CodecType | 180p (in Kbps) | 360p (in Kbps) | 720p (in Kbps) 30 | ----------- | -------------- | -------------- | ------------------- 31 | VP8 | 200 | 500 | 1500 32 | VP9 | 100 | 300 | 1200 33 | -------------------------------------------------------------------------------- /docs/user-guide/jitsi-meet-for-google-calendar.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-jitsi-meet-for-google-calendar 3 | title: Jitsi Meet for Google Calendar 4 | sidebar_label: Jitsi Meet for Google Calendar 5 | --- 6 | 7 | Welcome to the user guide! 8 | 9 | Check back soon! 10 | -------------------------------------------------------------------------------- /docs/user-guide/join-a-jitsi-meeting.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-join-jitsi-meeting 3 | title: Join a Jitsi Meeting 4 | --- 5 | 6 | # Join by using a Jitsi link 7 | 8 | People can invite each other to Jitsi meetings by simply sending a link. 9 | 10 | 1. If you have received such an invite link from a trusted source, 11 | copy it into your browser's address bar and press Enter / Return. 12 | 2. Your browser may first ask you to grant microphone and/or camera access. 13 | If you trust the person who invited you, confirm this access request. 14 | Please refer to the browser's documentation for details (e.g. 15 | [Firefox](https://support.mozilla.org/kb/how-manage-your-camera-and-microphone-permissions#w_using-prompts-to-allow-or-block-camera-and-microphone-permissions-for-a-site), 16 | [Chrome](https://support.google.com/chrome/answer/2693767)). 17 | 3. If prompted, enter a name, which will be visible to other participants in the Jitsi Meeting room. 18 | 4. (Optional) Adjust the camera and/or microphone settings via the `v` dropdown menu items. 19 | 5. Click on `Join meeting`. 20 | 6. If your meeing is taking place on https://meet.jit.si and you are the first to join you will be asked to authenticate or wait for a moderator. You can authenticate with a Google, Facebook or GitHub account. 21 | -------------------------------------------------------------------------------- /docs/user-guide/keyboard-shortcuts.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: keyboard-shortcuts 3 | title: Keyboard shortcuts 4 | --- 5 | 6 | * F - Show or hide video thumbnails 7 | * M - Mute or unmute your microphone 8 | * V - Start or stop your camera 9 | * A - Manage video quality 10 | * C - Open or close the chat 11 | * D - Switch between camera and screen sharing 12 | * P - Show or hide the participants pane 13 | * R - Raise or lower your hand 14 | * S - View or exit full screen 15 | * W - Toggle tile view 16 | * T - Show participants stats 17 | * Alt T - Send thumbs up reaction 18 | * Alt C - Send clap reaction 19 | * Alt L - Send laugh reaction 20 | * Alt O - Send surprised reaction 21 | * Alt B - Send boo reaction 22 | * Alt S - Send silence reaction 23 | * G - Toggle GIPHY menu 24 | * ? - Show or hide keyboard shortcuts 25 | * SPACE - Push to talk 26 | * 0 - Focus on your video 27 | * 1-9 - Focus on another person's video 28 | -------------------------------------------------------------------------------- /docs/user-guide/share-a-jitsi-meeting.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-share-a-jitsi-meeting 3 | title: Share a Jitsi Meeting 4 | sidebar_label: Share a Jitsi Meeting 5 | --- 6 | 7 | First, you need to [Join](https://jitsi.github.io/handbook/docs/user-guide/user-guide-join-jitsi-meeting) / [Start](https://jitsi.github.io/handbook/docs/user-guide/user-guide-start-a-jitsi-meeting) a Jitsi Meeting. 8 | 9 | Next: 10 | 11 | - Click on the **More actions** "..." Button. 12 | - Click on **Invite people**. 13 | - Select the desired option using which you want to share the meeting. 14 | -------------------------------------------------------------------------------- /docs/user-guide/start-a-jitsi-meeting.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-start-a-jitsi-meeting 3 | title: Start a Jitsi Meeting 4 | sidebar_label: Start a Jitsi Meeting 5 | --- 6 | 7 | ## Desktop or Mobile Browser 8 | 9 | 1. You need a browser (please note our separate information). 10 | 2. Open the browser and in the address bar type, for example "https://meet.jit.si" (without "") and press Enter. 11 | 3. The page opens as shown in the figure: 12 | 13 | ![screenshot 1](../assets/user_guide_start_meeting.png "screenshot 1") 14 | 15 | 4. Now enter a name for your conference (e.g. new meeting) in the "Start new meeting" field. 16 | Note: Please do not use any special characters, spaces or umlauts, as this can lead to problems. 17 | Note: Jitsi offers a functionality that automatically suggests names for the conferences. These can be overwritten. 18 | 5. Click the blue `Go` button. 19 | 6. The following window opens: 20 | 21 | ![screenshot 2](../assets/user_guide_join_meeting.png "screenshot 2") 22 | 23 | 7. It is possible that no picture of you will appear at first. To do this, the browser will ask you whether you want to allow camera access. Please confirm this by clicking on `allow` or `permit`. Sometimes you also have to click the camera button at the bottom of the screen first to activate the dialog for allowing camera access. Do the same with the microphone the first time you use Jitsi. 24 | 8. Now enter your display name in the "enter your name" field. 25 | 9. Click the blue `Join meeting` button. 26 | 10. If you are connecting to https://meet.jit.si and you are first participant you will be asked to either authenticate or wait for a moderator. You can authenticate with a Google, Facebook or GitHub account. 27 | 11. Have fun in your first conference. 28 | 29 | :::note 30 | If you do not see a video image of yourself, check the following points: 31 | The camera on your device is: 32 | - present (small lens at the top of the screen / an external webcam on the monitor), 33 | - activated (on some laptops you can actively switch the webcam on/off), 34 | - plugged in (only necessary for external webcams), 35 | - installed (some devices require the camera to be installed first). 36 | ::: 37 | 38 | :::note 39 | If you cannot transmit sound, check the following points: 40 | The microphone on your device is: 41 | - available (especially with desktop devices, a microphone is never actually integrated. Here you need an external microphone or headset, which you connect to the appropriate ports on your PC), 42 | - activated (on some laptops with an integrated microphone or headsets there is a switch to activate / deactivate the microphone), 43 | - plugged in (only necessary for external microphones), 44 | - installed (on some old computers the microphone must be installed). 45 | ::: 46 | -------------------------------------------------------------------------------- /docs/user-guide/use-jitsi-meet-on-mobile.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: user-guide-jitsi-meet-on-mobile 3 | title: Use Jitsi Meet on Mobile 4 | sidebar_label: Use Jitsi Meet on Mobile 5 | --- 6 | 7 | When you Join a Jitsi Meeting using a Mobile Phone, there are always options to join the meeting using the Jitsi Meet App or Continue on the web. The most convenient option is to Join using the **Jitsi Meet App**. 8 | 9 | You can download and Join / Create Meetings using the App as follows: 10 | 11 | - Download the Jitsi Meet App for [Android](https://play.google.com/store/apps/details?id=org.jitsi.meet) / [iOS](https://apps.apple.com/us/app/jitsi-meet/id1165103905) / [F-Droid](https://f-droid.org/en/packages/org.jitsi.meet/) 12 | - Open the app. 13 | - Join / Create a Meeting. 14 | -------------------------------------------------------------------------------- /docusaurus.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | title: "Jitsi Meet", 3 | tagline: "State-of-the-art video conferencing you can self-host.", 4 | url: "https://jitsi.github.io", 5 | baseUrl: "/handbook/", 6 | organizationName: "jitsi", 7 | projectName: "handbook", 8 | favicon: "img/favicon.svg", 9 | onBrokenLinks: "throw", 10 | onBrokenMarkdownLinks: "throw", 11 | presets: [ 12 | [ 13 | "@docusaurus/preset-classic", 14 | { 15 | docs: { 16 | showLastUpdateAuthor: false, 17 | showLastUpdateTime: true, 18 | editUrl: "https://github.com/jitsi/handbook/edit/master/", 19 | path: "docs", 20 | sidebarPath: require.resolve("./sidebars.js"), 21 | }, 22 | theme: { 23 | customCss: [require.resolve("./src/css/custom.css")], 24 | }, 25 | }, 26 | ], 27 | ], 28 | plugins: [ 29 | [ 30 | '@docusaurus/plugin-client-redirects', 31 | { 32 | redirects: [ 33 | { 34 | to: '/docs/category/user-guide', 35 | from: [ '/docs/user-guide', '/docs/user-guide/user-guide-start' ], 36 | }, 37 | { 38 | to: '/docs/category/developer-guide', 39 | from: [ '/docs/dev-guide', '/docs/dev-guide/dev-guide-start' ], 40 | }, 41 | { 42 | to: '/docs/devops-guide/', 43 | from: '/docs/devops-guide/devops-guide-start', 44 | }, 45 | ] 46 | } 47 | ] 48 | ], 49 | themeConfig: { 50 | prism: { 51 | additionalLanguages: ["java", "markdown", "bash", "gradle", "lua", "dart"], 52 | lang: { 53 | "shell": "bash" 54 | }, 55 | }, 56 | algolia: { 57 | appId: 'K2ODL876OV', 58 | apiKey: 'fc233b31ee025aa87cf553bd9e7ce9e9', 59 | indexName: 'jitsi', 60 | }, 61 | navbar: { 62 | title: "Jitsi Meet Handbook", 63 | logo: { 64 | src: "img/logo.svg", 65 | }, 66 | items: [ 67 | { 68 | to: "docs/intro", 69 | label: "Docs", 70 | position: "left", 71 | }, 72 | { 73 | to: "docs/category/sdks", 74 | label: "SDKs", 75 | position: "left", 76 | }, 77 | { 78 | to: "docs/releases", 79 | label: "Releases", 80 | position: "left", 81 | }, 82 | { 83 | href: "https://community.jitsi.org", 84 | label: "Community", 85 | position: "left", 86 | }, 87 | { 88 | href: "https://jaas.8x8.vc", 89 | label: "JaaS", 90 | position: "left", 91 | }, 92 | { 93 | href: 'https://github.com/jitsi', 94 | position: 'right', 95 | className: 'header-github-link', 96 | 'aria-label': 'GitHub repository', 97 | }, 98 | ], 99 | }, 100 | image: "img/undraw_online.svg", 101 | footer: { 102 | style: "dark", 103 | links: [ 104 | { 105 | title: "Docs", 106 | items: [ 107 | { 108 | label: "Introduction", 109 | to: "docs/intro", 110 | }, 111 | { 112 | label: "User Guide", 113 | to: "docs/category/user-guide", 114 | }, 115 | { 116 | label: "Developer Guide", 117 | to: "docs/category/developer-guide", 118 | }, 119 | { 120 | label: "Self-Hosting Guide", 121 | to: "docs/devops-guide", 122 | }, 123 | ], 124 | }, 125 | { 126 | title: "Community", 127 | items: [ 128 | { 129 | label: "Forum", 130 | href: "https://community.jitsi.org", 131 | }, 132 | { 133 | label: "Twitter", 134 | href: "https://twitter.com/jitsinews", 135 | }, 136 | ], 137 | }, 138 | { 139 | title: "More", 140 | items: [ 141 | { 142 | label: "Blog", 143 | href: "https://jitsi.org", 144 | }, 145 | { 146 | label: "GitHub", 147 | href: "https://github.com/jitsi", 148 | }, 149 | { 150 | label: "JaaS: Jitsi as a Service", 151 | href: "https://jaas.8x8.vc" 152 | }, 153 | ], 154 | }, 155 | ], 156 | logo: { 157 | alt: "8x8 Footer Logo", 158 | src: "img/8x8-copyright-icon.svg", 159 | href: "https://8x8.com", 160 | }, 161 | copyright: `Copyright © 8x8, Inc.`, 162 | }, 163 | }, 164 | }; 165 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@jitsi/handbook", 3 | "private": true, 4 | "scripts": { 5 | "examples": "docusaurus-examples", 6 | "start": "docusaurus start", 7 | "build": "docusaurus build", 8 | "serve": "docusaurus serve", 9 | "publish-gh-pages": "docusaurus-publish", 10 | "write-translations": "docusaurus-write-translations", 11 | "version": "docusaurus-version", 12 | "rename-version": "docusaurus-rename-version", 13 | "swizzle": "docusaurus swizzle", 14 | "deploy": "docusaurus deploy", 15 | "docusaurus": "docusaurus" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "3.5.2", 19 | "@docusaurus/plugin-client-redirects": "3.5.2", 20 | "@docusaurus/preset-classic": "3.5.2", 21 | "@mdx-js/react": "3.0.1", 22 | "clsx": "2.1.1", 23 | "prism-react-renderer": "2.4.0", 24 | "react": "18.3.1", 25 | "react-dom": "18.3.1" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /sidebars.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | docs: [ 3 | { 4 | type: "category", 5 | label: "Getting Started", 6 | items: [ 7 | "intro", 8 | "architecture", 9 | "security", 10 | "faq", 11 | ], 12 | }, 13 | { 14 | type: "category", 15 | label: "Community", 16 | link: { 17 | type: "doc", 18 | id: "community/community-intro", 19 | }, 20 | items: [ 21 | "community/third-party-software", 22 | ], 23 | }, 24 | { 25 | type: "category", 26 | label: "User Guide", 27 | link: { 28 | type: "generated-index", 29 | }, 30 | items: [ 31 | "user-guide/supported-browsers", 32 | "user-guide/user-guide-join-jitsi-meeting", 33 | "user-guide/user-guide-start-a-jitsi-meeting", 34 | "user-guide/user-guide-share-a-jitsi-meeting", 35 | "user-guide/user-guide-jitsi-meet-on-mobile", 36 | "user-guide/user-guide-jitsi-meet-for-google-calendar", 37 | "user-guide/keyboard-shortcuts", 38 | "user-guide/user-guide-basic", 39 | "user-guide/user-guide-advanced", 40 | ], 41 | }, 42 | { 43 | type: "category", 44 | label: "Developer Guide", 45 | link: { 46 | type: "generated-index", 47 | }, 48 | items: [ 49 | "dev-guide/dev-guide-contributing", 50 | { 51 | type: "category", 52 | label: "SDKs", 53 | link: { 54 | type: "generated-index", 55 | }, 56 | items: [ 57 | "dev-guide/dev-guide-iframe", 58 | "dev-guide/dev-guide-ljm-api", 59 | "dev-guide/dev-guide-electron-sdk", 60 | "dev-guide/dev-guide-react-sdk", 61 | "dev-guide/dev-guide-android-sdk", 62 | "dev-guide/dev-guide-ios-sdk", 63 | "dev-guide/dev-guide-react-native-sdk", 64 | "dev-guide/dev-guide-flutter-sdk", 65 | ] 66 | }, 67 | { 68 | type: "category", 69 | label: "Web", 70 | link: { 71 | type: "generated-index", 72 | }, 73 | items: [ 74 | "dev-guide/dev-guide-web-jitsi-meet", 75 | "dev-guide/dev-guide-ljm", 76 | "dev-guide/dev-guide-web-integrations", 77 | { 78 | type: "category", 79 | label: "IFrame API", 80 | link: { 81 | type: "doc", 82 | id: "dev-guide/dev-guide-iframe", 83 | }, 84 | items: [ 85 | "dev-guide/dev-guide-iframe-functions", 86 | "dev-guide/dev-guide-iframe-commands", 87 | "dev-guide/dev-guide-iframe-events" 88 | ] 89 | }, 90 | "dev-guide/dev-guide-react-sdk", 91 | "dev-guide/dev-guide-ljm-api", 92 | ], 93 | }, 94 | { 95 | type: "category", 96 | label: "Mobile", 97 | link: { 98 | type: "generated-index", 99 | }, 100 | items: [ 101 | "dev-guide/dev-guide-mobile-jitsi-meet", 102 | "dev-guide/mobile-feature-flags", 103 | "dev-guide/dev-guide-android-sdk", 104 | "dev-guide/dev-guide-ios-sdk", 105 | "dev-guide/dev-guide-react-native-sdk", 106 | "dev-guide/dev-guide-flutter-sdk", 107 | ], 108 | }, 109 | "dev-guide/dev-guide-configuration", 110 | ], 111 | }, 112 | { 113 | type: "category", 114 | label: "Self-Hosting Guide", 115 | link: { 116 | type: "doc", 117 | id: "devops-guide/devops-guide-start", 118 | }, 119 | items: [ 120 | { 121 | type: "category", 122 | label: "Deployment", 123 | link: { 124 | type: "generated-index", 125 | }, 126 | items: [ 127 | "devops-guide/devops-guide-requirements", 128 | "devops-guide/devops-guide-quickstart", 129 | "devops-guide/devops-guide-opensuse", 130 | { 131 | type: "category", 132 | label: "Docker", 133 | link: { 134 | type: "doc", 135 | id: "devops-guide/devops-guide-docker", 136 | }, 137 | items: [ 138 | { 139 | type: "doc", 140 | id: "devops-guide/devops-guide-log-analyser", 141 | label: "Log Analyser", 142 | }, 143 | ], 144 | }, 145 | ], 146 | }, 147 | { 148 | type: "category", 149 | label: "Configuration", 150 | link: { 151 | type: "generated-index", 152 | }, 153 | items: [ 154 | "devops-guide/secure-domain", 155 | "devops-guide/ldap-authentication", 156 | "devops-guide/devops-guide-scalable", 157 | "devops-guide/reservation", 158 | "devops-guide/turn", 159 | "devops-guide/speakerstats", 160 | "devops-guide/videosipgw", 161 | "devops-guide/cloud-api", 162 | ], 163 | }, 164 | "devops-guide/devops-guide-videotutorials", 165 | "devops-guide/faq", 166 | ], 167 | }, 168 | ], 169 | "releases-sidebar": [ 170 | { 171 | type: "doc", 172 | label: "Releases", 173 | id: "releases", 174 | }, 175 | ], 176 | }; 177 | -------------------------------------------------------------------------------- /src/css/custom.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --ifm-color-primary-lightest: #3897e0; 3 | --ifm-color-primary-lighter: #2188d6; 4 | --ifm-color-primary-light: #2082cd; 5 | --ifm-color-primary: #1d76ba; 6 | --ifm-color-primary-dark: #1a6aa7; 7 | --ifm-color-primary-darker: #19649e; 8 | --ifm-color-primary-darkest: #145382; 9 | } 10 | 11 | .header-github-link:hover { 12 | opacity: 0.6; 13 | } 14 | 15 | .header-github-link::before { 16 | content: ""; 17 | width: 24px; 18 | height: 24px; 19 | display: flex; 20 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 21 | no-repeat; 22 | } 23 | 24 | [data-theme="dark"] .header-github-link::before { 25 | background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") 26 | no-repeat; 27 | } 28 | 29 | @media only screen and (min-device-width: 360px) and (max-device-width: 736px) { 30 | } 31 | 32 | @media only screen and (min-width: 1024px) { 33 | } 34 | 35 | @media only screen and (max-width: 1023px) { 36 | } 37 | 38 | @media only screen and (min-width: 1400px) { 39 | } 40 | 41 | @media only screen and (min-width: 1500px) { 42 | } 43 | 44 | .video-container { 45 | height: 0; 46 | margin: 0; 47 | margin-bottom: 30px; 48 | overflow: hidden; 49 | padding-bottom: 56.25%; 50 | padding-top: 30px; 51 | position: relative; 52 | } 53 | 54 | .video-container iframe { 55 | position: absolute; 56 | top: 0; 57 | left: 0; 58 | width: 100%; 59 | height: 100%; 60 | } 61 | 62 | img[alt="ios-screensharing"] { 63 | display: inline; 64 | } 65 | -------------------------------------------------------------------------------- /src/pages/help.md: -------------------------------------------------------------------------------- 1 | # Getting help 2 | 3 | Jitsi is maintained by a dedicated group of enthusiasts. 4 | 5 | If you need help with Jitsi [our community](https://community.jitsi.org) is the best place to start. 6 | 7 | You can learn more about using Jitsi or developing applications with it by browsing our [docs](/handbook/docs/intro). 8 | -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import clsx from "clsx"; 3 | import Layout from "@theme/Layout"; 4 | import Link from "@docusaurus/Link"; 5 | import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; 6 | import useBaseUrl from "@docusaurus/useBaseUrl"; 7 | import styles from "./styles.module.css"; 8 | 9 | const features = [ 10 | { 11 | title: <>Hey there Fellow Jitster!, 12 | imageUrl: "img/undraw_code_review.svg", 13 | description: ( 14 | <> 15 | Jitsi Meet is a set of Open Source projects which empower users to 16 | deploy secure, scalable and easy to use video conferencing platforms 17 | with state-of-the-art video quality and features. 18 | 19 |

20 | 21 | On This site you'll find documentation for all your Jitsi needs. 22 | 23 |

24 | 25 | Get started here. 26 | 27 | ), 28 | }, 29 | { 30 | title: <>Batteries included, 31 | imageUrl: "img/undraw_real_time_sync.svg", 32 | description: ( 33 | <> 34 | Jitsi Meet supports all common browsers and also mobile devices. 35 | 36 |

37 | 38 | Our APIs allow developers to easily integrate Jitsi Meet into existing 39 | applications, whether those are web based or native mobile apps. 40 | 41 |

42 | 43 | You can use our freely available instance at{" "} 44 | 45 | meet.jit.si 46 | {" "} 47 | or self-host it yourself using our readily available Debian packages or 48 | comprehensive Docker setup. 49 | 50 | ), 51 | }, 52 | { 53 | title: <>JaaS: Jitsi as a Service, 54 | imageUrl: "img/undraw_going_up.svg", 55 | description: ( 56 | <> 57 | Looking for configuration flexibility without the complexity of 58 | self-hosting and scalability management? 59 | 60 |

61 | 62 | Look no further than JaaS. 8x8 Jitsi as a Service (JaaS) is 63 | an enterprise-ready video meeting platform that allows developers, 64 | organizations and businesses to easily build and deploy video 65 | solutions. With Jitsi as a Service we now give you all the power of 66 | Jitsi running on our global platform so you can focus on building secure 67 | and branded video experiences. 68 | 69 |

70 | Check JaaS out{" "} 71 | 72 | here 73 | 74 | . 75 | 76 | ), 77 | }, 78 | ]; 79 | 80 | function VideoContainer() { 81 | return ( 82 |
83 |
84 |
85 |

What is Jitsi?

86 |