Skip to content
Switch branches/tags
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Video Chat with JupyterHub peers inside JupyterLab, powered by Jitsi.

install from pypi install from conda-forge reuse from npm continuous integration interactive demo

This extension is composed of:

  • a Python package named jupyter_videochat, which offers:
    • a jupyter_server extension which provides convenient, configurable defaults for rooms on a JupyterHub
    • a JupyterLab federated extension named jupyter-videochat
      • also distributed on npm
      • for more about the TypeScript/JS API, see CONTRIBUTING

jupyter-videochat screenshot


  • python >=3.6
  • jupyterlab ==3.*


Install the server extension and JupyterLab extension with pip:

pip install -U jupyter-videochat

...or conda:

conda install -c conda-forge jupyter-videochat


If you are seeing the frontend extension but it is not working, check that the server extension is enabled:

jupyter server extension list
jupyter server extension enable --sys-prefix --py jupyter_videochat

If you launch your Jupyter server with jupyter notebook, as Binder does, the equivalent commands are:

jupyter serverextension list
jupyter serverextension enable --sys-prefix --py jupyter_videochat

If the server extension is installed and enabled but you are not seeing the frontend, check the frontend is installed:

jupyter labextension list

If you do not see jupyterlab-videochat, the best course of action is to uninstall and reinstall, and carefully watch the log output.


pip uninstall jupyter-videochat


Server Configuration

In your jupyter_server_config.json (or equivalent .py or conf.d/*.json), you can configure the VideoChat:

  • room_prefix, a prefix used for your group, by default a URL-frieldy version of your JupyterHub's hostname
    • can be overriden with the JUPYTER_VIDEOCHAT_ROOM_PREFIX environment variable
  • jitsi_server, an HTTPS host that serves the Jitsi web application, by default
  • rooms, a list of Room descriptions that everyone on your Hub will be able to join


  "VideoChat": {
    "room_prefix": "our-spiffy-room-prefix",
    "rooms": [
        "id": "stand-up",
        "displayName": "Stand-Up",
        "description": "Daily room for meeting with the team"
        "id": "all-hands",
        "displayName": "All-Hands",
        "description": "A weekly room for the whole team"
    "jitsi_server": ""

Client Configuration

In the JupyterLab Advanced Settings panel, the Video Chat settings can be further configured, as can a user's default displayName and email. The defaults provided are generally pretty conservative, and disable as many third-party services as possible. Additionally, access to globally-accessible public rooms may be enabled.

Binder Client Example

For example, to enable all third-party features, public rooms, and open in the main area by default:

  • create an overrides.json

      "jupyter-videochat:plugin": {
        "interfaceConfigOverwrite": null,
        "configOverwrite": null,
        "disablePublicRooms": false,
        "area": "main"
  • Copy it to the JupyterLab settings directory

    # postBuild
    mkdir -p ${NB_PYTHON_PREFIX}/share/jupyter/lab/settings
    cp overrides.json ${NB_PYTHON_PREFIX}/share/jupyter/lab/settings

Start a Meet by URL

Appending ?jvc=room-name to a JupyterLab URL will automatically open the Meet (but not fully start it, as browsers require a user gesture to start audio/video).

Binder URL Example

On Binder, use the urlpath to append the argument, ensuring the arguments get properly URL-encoded.
                                                         # URL-encoded  [? ] [=  ]


If you have two repos (or branches) that contain:

  • content that changes frequently
  • a stable environment can use nbgitpuller to have fast-building, (almost) single-click URLs that launch right into JupyterLab showing your meeting and content. For example, to use...

...and launch directly into JupyterLab showing

  • the Preface notebook
  • the Office Hours room

...the doubly-escaped URL would be something like: