Contribute to Jami

Contributions to Jami are always welcome and are much appreciated. There are many ways to contribute to Jami, including reporting bugs and issues, contributing code, helping package and maintain Jami for your GNU/Linux distribution or other operating system, as well as contributing to these very docs themselves.

Please see below for how to get started contributing to Jami!

Reporting bugs and issues

Please see the Bug report guide for step-by-step instructions on how to report bugs and issues you encounter in Jami.

Contributing code

If you want to start to contribute to Jami, you can start by looking good first issues at:

You can contact developers directly by adding a comment on the ticket you want to start with. They will be able to guide you through the process.

At some point, you will need to push a patch on For more information on how to do this, please refer to the developer/working-with-gerrit guide.

Packaging Jami

There is two possible ways to package Jami: + Via our internal process to create packages available on the Snap Store or + Via the packaging process of your favorite GNU/Linux distribution


Jami is a quite complex project with a lot of dependencies. This isn’t a quick and easy task and ask for some maintainance.

If you choose the second option, here are some useful notes: + For our official release, we stick to a certain Qt version, because Qt is a big dependency and we need to ensure that Jami works with the version we use. Every slight change in the Qt version can break Jami or bring some small unwanted changes (e.g. 6.2->6.4 broke the video pipeline) + We also fork pjproject due to ICE over TCP that is not planned upstream + libupnp got some patches to be sure that it’s build with the non-blocking API. + FFMpeg got some patches for screen sharing. + You can check how dependencies are built in daemon/contrib/src

For internal packaging, everything is located in extras/packaging/gnu-linux. You can follow previous patches to understand your needs. e.g.:

We use 3 channels: + Internal for testing purposes + Nightly/Beta/Edge for public beta + Stable for public releases

We generally use internal when we test new distribution or when we package a new Qt version Then we try to generate a nightly per week and one stable per month (if unit tests are green).

Packages are pushed to: + (2 machines, with a rsync every 15 min) + Ubuntu store (

If you want to add a new distribution, you will need to: + Add Dockerfile + Change Makefile + Update packaging script + Cross fingers + Test the package in a VM


Chromium is a hard part to build. the 3 commons problems we got are:

  • GCC is too recent:
    • Generally the fix consist of importing patches from chromium’s gerrit to fix GCC issues

  • Python is too recent:
    • Generally the fix consist of using PyEnv to get a virtual environment with the correct Python’s version

  • Missing dependencies:
    • During the configuration step of Qt, the list of built components is listed and the missing dependencies are listed. Generally installing a package or updating node.js fix the issue

    • Note that if Qt is generated without chromium, we must remove the package in the cache of the build machines to regenerate a new one (/var/cache/jami)

If you want to remove a distribution: + If a distribution is EOL OR if there is 2 more recent LTS, we can remove the distribution (e.g. ubuntu 20, 22, 24 - remove ubuntu 20) by removing related files and checks


For the next big changes we want to:

  • Use CMake instead autotools for jami-daemon

  • Use core22 instead core20 in snap

  • Flatpak/AppImage support? This may simplify custom packaging for RPMs/Debs

  • Only generate one deb instead one per distribution. Same for RPMs

  • Use Jenkinsfile to generate package for Linux/Windows/MacOs at the same time if possible

For internal information (such as how to publish to stores, cf internal wiki).

Contributing to this documentation

Contributions to these docs are always welcome and appreciated, from small corrections to whole new chapters.

This page will walk through the steps to create a new page or submit a correction. The patch review process is the same as for any other Jami project, so we will not explain every command.


By contributing to this documentation, you agree to make your contributions available under the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

You are also promising that you are the author of your changes, or that you copied them from a work in the public domain or a work released under a free license that is compatible with the GNU Free Documentation License. DO NOT SUBMIT COPYRIGHTED WORK WITHOUT PERMISSION.


If you want to help to translate this page, you can join the project and start translating this page on


You will need Git installed and configured to use your SSH keypair, and an account on the Jami Gerrit, where you would send your patches for review. If you need help with this, see the beginning of our patch submission guide (TODO).

If you want to preview your changes locally in your web browser, you need to install Sphinx, the Read the Docs Sphinx theme, and the MyST Markdown parser.

$ pip install --upgrade sphinx sphinx_rtd_theme myst_parser

If you want to use the auto-build and auto-refresh feature, also install sphinx-autobuild.

$ pip install --upgrade sphinx-autobuild

Cloning the repository

Clone the repository and configure the push settings like this:

$ git clone "ssh://"
$ cd jami-docs
$ git config remote.origin.push HEAD:refs/for/master

You may want to checkout a new branch for each contribution/change before you make any change to the files, so that you could easily git pull any future changes from upstream into your main local branch:

$ git checkout -b my-example-change

Editing a page

Pages are written in either markdown or reStructuredText. You can click “View page source” at the top of any page to open the raw source of the page and see how it was written.

Go ahead and make your changes to the .rst or .md files.

Previewing your work

From the base of the repository, run:

$ make clean && make html

You should now be able to view the documentation in your web browser. The homepage is at _build/html/index.html.


This documentation does not currently build with the latest version of sphinx. Please see this issue on GitLab for a workaround and updates regarding this problem.

To automatically build the documentation and refresh your web browser whenever you save changes, run:

$ make clean && make watch

Keep this running in the background, then navigate to (not the local .html file).

Saving your work

$ git add source/file/you/
$ git commit

Your commit message should look something like this:

Short summary of your change in present tense

Longer description of your change in complete sentences, if necessary.

Jami GitLab issue numbers (e.g. GitLab: #445), if relevant.

For example:

Add new page section to contribute guide

Add a new section explaining how to add a new page to these docs,
including listing it in the `toctree` directive of the containing
section/folder index.

GitLab: #123

Submitting a change

The first time you try to push your changes, Gerrit will complain that you don’t have a Change-Id in your commit, and provide an scp command to install the commit hook. After running the command, you should be able to recommit and push your change:

$ git commit --amend --no-edit
$ git push

Modifying your work

A reviewer may ask you to make changes to your patch before merging it. This is no problem! Simply make the changes, git add them, and run git commit --amend to modify the patch. Note the --amend switch, which is needed to tell git to amend/tweak the existing newest commit rather than making a new commit. This is the workflow for updating a proposed change when using Gerrit.

Adding a page

If you decide to add a whole new page to the documentation, you must also add it to the toctree directive of that chapter.

For instance, if you added a new page called to the Jami user manual in the user folder, you should add it in the toctree directive of user/index.rst, without the file extension:

.. toctree::