CINXE.COM
Contributing guide — Zulip 10.0-dev+git documentation
<!DOCTYPE html> <html class="writer-html5" lang="en" data-content_root="../"> <head> <meta charset="utf-8" /> <meta name="readthedocs-addons-api-version" content="1"><meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Contributing guide — Zulip 10.0-dev+git documentation</title> <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=fa44fd50" /> <link rel="stylesheet" type="text/css" href="../_static/css/theme.css?v=e59714d7" /> <link rel="stylesheet" type="text/css" href="../_static/theme_overrides.css?v=8dd47d50" /> <link rel="stylesheet" type="text/css" href="../_static/sphinx-design.min.css?v=95c83b7e" /> <script src="../_static/jquery.js?v=5d32c60e"></script> <script src="../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script> <script src="../_static/documentation_options.js?v=3b98d1ac"></script> <script src="../_static/doctools.js?v=9bcbadda"></script> <script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script src="../_static/design-tabs.js?v=f930bc37"></script> <script src="../_static/js/theme.js"></script> <script src="../_static/js/versions.js"></script> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> <link rel="next" title="Zulip Code of Conduct" href="../code-of-conduct.html" /> <link rel="prev" title="Contributing to Zulip" href="index.html" /> <script async type="text/javascript" src="/_/static/javascript/readthedocs-addons.js"></script><meta name="readthedocs-project-slug" content="zulip" /><meta name="readthedocs-version-slug" content="latest" /><meta name="readthedocs-resolver-filename" content="/contributing/contributing.html" /><meta name="readthedocs-http-status" content="200" /></head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="../index.html"> <img src="../_static/zulip-logo.svg" class="logo" alt="Logo"/> </a> <div class="switch-menus"> <div class="version-switch"></div> <div class="language-switch"></div> </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="../search.html" method="get"> <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> <ul> <li class="toctree-l1"><a class="reference external" href="https://zulip.com/">Zulip homepage</a></li> <li class="toctree-l1"><a class="reference internal" href="../overview/index.html">Overview</a><ul> <li class="toctree-l2"><a class="reference internal" href="../overview/readme.html">Zulip overview</a><ul> <li class="toctree-l3"><a class="reference internal" href="../overview/readme.html#getting-started">Getting started</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../overview/architecture-overview.html">Zulip architectural overview</a><ul> <li class="toctree-l3"><a class="reference internal" href="../overview/architecture-overview.html#key-codebases">Key codebases</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/architecture-overview.html#usage-assumptions-and-concepts">Usage assumptions and concepts</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/architecture-overview.html#components">Components</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#django-and-tornado">Django and Tornado</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#nginx">nginx</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#supervisor">Supervisor</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#memcached">memcached</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#redis">Redis</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#rabbitmq">RabbitMQ</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#postgresql">PostgreSQL</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/architecture-overview.html#nagios">Nagios</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/architecture-overview.html#glossary">Glossary</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../overview/directory-structure.html">Directory structure</a><ul> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#core-python-files">Core Python files</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#html-templates">HTML templates</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#javascript-typescript-and-other-frontend-assets">JavaScript, TypeScript, and other frontend assets</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#tests">Tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#management-commands">Management commands</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#scripts">Scripts</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#api-and-bots">API and bots</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#production-puppet-configuration">Production Puppet configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#additional-django-apps">Additional Django apps</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#jinja2-compatibility-files">Jinja2 compatibility files</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#translation-files">Translation files</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/directory-structure.html#documentation">Documentation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../overview/release-lifecycle.html">Release lifecycle</a><ul> <li class="toctree-l3"><a class="reference internal" href="../overview/release-lifecycle.html#server-and-web-app">Server and web app</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#stable-releases">Stable releases</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#git-versions">Git versions</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#compatibility-and-upgrading">Compatibility and upgrading</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#security-releases">Security releases</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#upgrade-nag">Upgrade nag</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#operating-system-support">Operating system support</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/release-lifecycle.html#server-roadmap">Server roadmap</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/release-lifecycle.html#client-apps">Client apps</a></li> <li class="toctree-l3"><a class="reference internal" href="../overview/release-lifecycle.html#api-bindings">API bindings</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../overview/changelog.html">Version history</a><ul> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-10-x-series-development">Zulip Server 10.x series (development)</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-10-0">Zulip Server 10.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-9-x-series">Zulip Server 9.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-9-3">Zulip Server 9.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-9-2">Zulip Server 9.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-9-1">Zulip Server 9.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-9-0">Zulip Server 9.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-x-series">Zulip Server 8.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-5">Zulip Server 8.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-4">Zulip Server 8.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-3">Zulip Server 8.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-2">Zulip Server 8.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-1">Zulip Server 8.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-8-0">Zulip Server 8.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-x-series">Zulip Server 7.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-5">Zulip Server 7.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-4">Zulip Server 7.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-3">Zulip Server 7.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-2">Zulip Server 7.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-1">Zulip Server 7.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-7-0">Zulip Server 7.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-6-x-series">Zulip Server 6.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-6-2">Zulip Server 6.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-6-1">Zulip Server 6.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-6-0">Zulip Server 6.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-x-series">Zulip Server 5.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-7">Zulip Server 5.7</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-6">Zulip Server 5.6</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-5">Zulip Server 5.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-4">Zulip Server 5.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-3">Zulip Server 5.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-2">Zulip Server 5.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-1">Zulip Server 5.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-5-0">Zulip Server 5.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-x-series">Zulip Server 4.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-11">Zulip Server 4.11</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-10">Zulip Server 4.10</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-9">Zulip Server 4.9</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-8">Zulip Server 4.8</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-7">Zulip Server 4.7</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-6">Zulip Server 4.6</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-5">Zulip Server 4.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-4">Zulip Server 4.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-3">Zulip Server 4.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-2">Zulip Server 4.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-1">Zulip Server 4.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-4-0">Zulip Server 4.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-x-series">Zulip Server 3.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-4">Zulip Server 3.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-3">Zulip Server 3.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-2">Zulip Server 3.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-1">Zulip Server 3.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-3-0">Zulip Server 3.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-x-series">Zulip Server 2.1.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-8">Zulip Server 2.1.8</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-7">Zulip Server 2.1.7</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-6">Zulip Server 2.1.6</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-5">Zulip Server 2.1.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-4">Zulip Server 2.1.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-3">Zulip Server 2.1.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-2">Zulip Server 2.1.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-1">Zulip Server 2.1.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-1-0">Zulip Server 2.1.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-x-series">Zulip Server 2.0.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-8">Zulip Server 2.0.8</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-7">Zulip Server 2.0.7</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-6">Zulip Server 2.0.6</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-5">Zulip Server 2.0.5</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-4">Zulip Server 2.0.4</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-3">Zulip Server 2.0.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-2">Zulip Server 2.0.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-1">Zulip Server 2.0.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-2-0-0">Zulip Server 2.0.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-9-x-series">Zulip Server 1.9.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-9-2">Zulip Server 1.9.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-9-1">Zulip Server 1.9.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-9-0">Zulip Server 1.9.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-8-x-series">Zulip Server 1.8.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-8-1">Zulip Server 1.8.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-8-0">Zulip Server 1.8.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-7-x-series">Zulip Server 1.7.x series</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-7-2">Zulip Server 1.7.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-7-1">Zulip Server 1.7.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-7-0">Zulip Server 1.7.0</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-6-x-and-older">Zulip Server 1.6.x and older</a><ul> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-6-0">Zulip Server 1.6.0</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-5-2">Zulip Server 1.5.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-5-1">Zulip Server 1.5.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-5-0">Zulip Server 1.5.0</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-4-3">Zulip Server 1.4.3</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-4-2">Zulip Server 1.4.2</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-4-1">Zulip Server 1.4.1</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-4-0">Zulip Server 1.4.0</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-13">Zulip Server 1.3.13</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-12">Zulip Server 1.3.12</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-11">Zulip Server 1.3.11</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-10">Zulip Server 1.3.10</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-9">Zulip Server 1.3.9</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-8">Zulip Server 1.3.8</a></li> <li class="toctree-l4"><a class="reference internal" href="../overview/changelog.html#zulip-server-1-3-7">Zulip Server 1.3.7</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../overview/changelog.html#upgrade-notes">Upgrade notes</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../production/index.html">Zulip in production</a><ul> <li class="toctree-l2"><a class="reference internal" href="../production/requirements.html">Requirements and scalability</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/requirements.html#server">Server</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#general">General</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#operating-system">Operating system</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#hardware-specifications">Hardware specifications</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#network-and-security-specifications">Network and security specifications</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/requirements.html#credentials-needed">Credentials needed</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#ssl-certificate">SSL certificate</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/requirements.html#outgoing-email">Outgoing email</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/requirements.html#scalability">Scalability</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/install.html">Install a Zulip server</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#installation-process-overview">Installation process overview</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#step-0-set-up-a-base-server">Step 0: Set up a base server</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#step-1-download-the-latest-release">Step 1: Download the latest release</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#step-2-install-zulip">Step 2: Install Zulip</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/install.html#installer-options">Installer options</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#step-3-create-a-zulip-organization-and-log-in">Step 3: Create a Zulip organization, and log in</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/install.html#getting-started-with-zulip">Getting started with Zulip</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/troubleshooting.html">Troubleshooting and monitoring</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#overview-and-resources">Overview and resources</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#using-supervisorctl">Using supervisorctl</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#checking-status-with-supervisorctl-status">Checking status with <code class="docutils literal notranslate"><span class="pre">supervisorctl</span> <span class="pre">status</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#restarting-services-with-supervisorctl-restart">Restarting services with <code class="docutils literal notranslate"><span class="pre">supervisorctl</span> <span class="pre">restart</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#stopping-services-with-supervisorctl-stop">Stopping services with <code class="docutils literal notranslate"><span class="pre">supervisorctl</span> <span class="pre">stop</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#troubleshooting-services">Troubleshooting services</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#restrict-unattended-upgrades">Restrict unattended upgrades</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#monitoring">Monitoring</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#nagios-configuration">Nagios configuration</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#memory-leak-mitigation">Memory leak mitigation</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/troubleshooting.html#troubleshooting-the-zulip-installer">Troubleshooting the Zulip installer</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/troubleshooting.html#the-zulip-user-s-password">The <code class="docutils literal notranslate"><span class="pre">zulip</span></code> user’s password.</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/management-commands.html">Management commands</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/management-commands.html#running-management-commands">Running management commands</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/management-commands.html#accessing-an-organization-s-string-id">Accessing an organization’s <code class="docutils literal notranslate"><span class="pre">string_id</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/management-commands.html#manage-py-shell">manage.py shell</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/management-commands.html#other-useful-manage-py-commands">Other useful manage.py commands</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/management-commands.html#custom-management-commands">Custom management commands</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/settings.html">Server configuration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/settings.html#making-changes">Making changes</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/settings.html#specific-settings">Specific settings</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/settings.html#domain-and-email-settings">Domain and email settings</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/settings.html#authentication-backends">Authentication backends</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/settings.html#mobile-and-desktop-apps">Mobile and desktop apps</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/settings.html#terms-of-service-and-privacy-policy">Terms of Service and Privacy policy</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/settings.html#miscellaneous-server-settings">Miscellaneous server settings</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/settings.html#zulip-announcement-list">Zulip announcement list</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/settings.html#enjoy-your-zulip-installation">Enjoy your Zulip installation!</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/system-configuration.html">System configuration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#truthy-values">Truthy values</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#machine"><code class="docutils literal notranslate"><span class="pre">[machine]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#puppet-classes"><code class="docutils literal notranslate"><span class="pre">puppet_classes</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#pgroonga"><code class="docutils literal notranslate"><span class="pre">pgroonga</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#timesync"><code class="docutils literal notranslate"><span class="pre">timesync</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#deployment"><code class="docutils literal notranslate"><span class="pre">[deployment]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#deploy-options"><code class="docutils literal notranslate"><span class="pre">deploy_options</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#git-repo-url"><code class="docutils literal notranslate"><span class="pre">git_repo_url</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#application-server"><code class="docutils literal notranslate"><span class="pre">[application_server]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#http-only"><code class="docutils literal notranslate"><span class="pre">http_only</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#nginx-listen-port"><code class="docutils literal notranslate"><span class="pre">nginx_listen_port</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#nginx-worker-connections"><code class="docutils literal notranslate"><span class="pre">nginx_worker_connections</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#queue-workers-multiprocess"><code class="docutils literal notranslate"><span class="pre">queue_workers_multiprocess</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#rolling-restart"><code class="docutils literal notranslate"><span class="pre">rolling_restart</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#service-file-descriptor-limit"><code class="docutils literal notranslate"><span class="pre">service_file_descriptor_limit</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#s3-memory-cache-size"><code class="docutils literal notranslate"><span class="pre">s3_memory_cache_size</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#s3-disk-cache-size"><code class="docutils literal notranslate"><span class="pre">s3_disk_cache_size</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#s3-cache-inactive-time"><code class="docutils literal notranslate"><span class="pre">s3_cache_inactive_time</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#thumbnail-workers"><code class="docutils literal notranslate"><span class="pre">thumbnail_workers</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#nameserver"><code class="docutils literal notranslate"><span class="pre">nameserver</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#uwsgi-listen-backlog-limit"><code class="docutils literal notranslate"><span class="pre">uwsgi_listen_backlog_limit</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#uwsgi-processes"><code class="docutils literal notranslate"><span class="pre">uwsgi_processes</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#access-log-retention-days"><code class="docutils literal notranslate"><span class="pre">access_log_retention_days</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#katex-server"><code class="docutils literal notranslate"><span class="pre">katex_server</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#katex-server-port"><code class="docutils literal notranslate"><span class="pre">katex_server_port</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#postfix"><code class="docutils literal notranslate"><span class="pre">[postfix]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#mailname"><code class="docutils literal notranslate"><span class="pre">mailname</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#postgresql"><code class="docutils literal notranslate"><span class="pre">[postgresql]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#effective-io-concurrency"><code class="docutils literal notranslate"><span class="pre">effective_io_concurrency</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#listen-addresses"><code class="docutils literal notranslate"><span class="pre">listen_addresses</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#random-page-cost"><code class="docutils literal notranslate"><span class="pre">random_page_cost</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#replication-primary"><code class="docutils literal notranslate"><span class="pre">replication_primary</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#replication-user"><code class="docutils literal notranslate"><span class="pre">replication_user</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#skip-backups"><code class="docutils literal notranslate"><span class="pre">skip_backups</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#backups-disk-concurrency"><code class="docutils literal notranslate"><span class="pre">backups_disk_concurrency</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#backups-directory"><code class="docutils literal notranslate"><span class="pre">backups_directory</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#backups-incremental"><code class="docutils literal notranslate"><span class="pre">backups_incremental</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#backups-storage-class"><code class="docutils literal notranslate"><span class="pre">backups_storage_class</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#backups-compression-method"><code class="docutils literal notranslate"><span class="pre">backups_compression_method</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#missing-dictionaries"><code class="docutils literal notranslate"><span class="pre">missing_dictionaries</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#ssl-ca-file"><code class="docutils literal notranslate"><span class="pre">ssl_ca_file</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#ssl-cert-file"><code class="docutils literal notranslate"><span class="pre">ssl_cert_file</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#ssl-key-file"><code class="docutils literal notranslate"><span class="pre">ssl_key_file</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#ssl-mode"><code class="docutils literal notranslate"><span class="pre">ssl_mode</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#version"><code class="docutils literal notranslate"><span class="pre">version</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#memcached"><code class="docutils literal notranslate"><span class="pre">[memcached]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#memory"><code class="docutils literal notranslate"><span class="pre">memory</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#max-item-size"><code class="docutils literal notranslate"><span class="pre">max_item_size</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#size-reporting"><code class="docutils literal notranslate"><span class="pre">size_reporting</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#loadbalancer"><code class="docutils literal notranslate"><span class="pre">[loadbalancer]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#ips"><code class="docutils literal notranslate"><span class="pre">ips</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#http-proxy"><code class="docutils literal notranslate"><span class="pre">[http_proxy]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#host"><code class="docutils literal notranslate"><span class="pre">host</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#port"><code class="docutils literal notranslate"><span class="pre">port</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#listen-address"><code class="docutils literal notranslate"><span class="pre">listen_address</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#enable-for-camo"><code class="docutils literal notranslate"><span class="pre">enable_for_camo</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/system-configuration.html#sentry"><code class="docutils literal notranslate"><span class="pre">[sentry]</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#organization"><code class="docutils literal notranslate"><span class="pre">organization</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../production/system-configuration.html#project"><code class="docutils literal notranslate"><span class="pre">project</span></code></a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/mobile-push-notifications.html">Mobile push notification service</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#signing-up">Signing up</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#plan-management">Plan management</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/mobile-push-notifications.html#plan-management-for-a-zulip-organization">Plan management for a Zulip organization</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/mobile-push-notifications.html#plan-management-for-an-entire-zulip-server">Plan management for an entire Zulip server</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#why-a-push-notification-service-is-necessary">Why a push notification service is necessary</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#security-and-privacy">Security and privacy</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/mobile-push-notifications.html#uploading-basic-metadata">Uploading basic metadata</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/mobile-push-notifications.html#uploading-usage-statistics">Uploading usage statistics</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#rate-limits">Rate limits</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#updating-your-server-s-registration">Updating your server’s registration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#deactivating-your-server-s-registration">Deactivating your server’s registration</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/mobile-push-notifications.html#pausing-use-of-the-mobile-push-notification-service">Pausing use of the Mobile Push Notification Service</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/mobile-push-notifications.html#sending-push-notifications-directly-from-your-server">Sending push notifications directly from your server</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/upgrade.html">Upgrade Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#upgrading-to-a-release">Upgrading to a release</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#upgrading-from-a-git-repository">Upgrading from a Git repository</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#updating-settings-py-inline-documentation">Updating <code class="docutils literal notranslate"><span class="pre">settings.py</span></code> inline documentation</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#troubleshooting-and-rollback">Troubleshooting and rollback</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#rolling-back-to-a-prior-version">Rolling back to a prior version</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#deployment-hooks">Deployment hooks</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#preserving-local-changes-to-service-configuration-files">Preserving local changes to service configuration files</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#nginx-configuration-changes">nginx configuration changes</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#upgrading-the-operating-system">Upgrading the operating system</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-ubuntu-22-04-jammy-to-24-04-noble">Upgrading from Ubuntu 22.04 Jammy to 24.04 Noble</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-ubuntu-20-04-focal-to-22-04-jammy">Upgrading from Ubuntu 20.04 Focal to 22.04 Jammy</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-ubuntu-18-04-bionic-to-20-04-focal">Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-ubuntu-16-04-xenial-to-18-04-bionic">Upgrading from Ubuntu 16.04 Xenial to 18.04 Bionic</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-ubuntu-14-04-trusty-to-16-04-xenial">Upgrading from Ubuntu 14.04 Trusty to 16.04 Xenial</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-debian-11-to-12">Upgrading from Debian 11 to 12</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-debian-10-to-11">Upgrading from Debian 10 to 11</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/upgrade.html#upgrading-from-debian-9-to-10">Upgrading from Debian 9 to 10</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/upgrade.html#upgrading-postgresql">Upgrading PostgreSQL</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/modify.html">Modify Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/modify.html#making-changes">Making changes</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/modify.html#upgrading-to-future-releases">Upgrading to future releases</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/modify.html#making-changes-with-docker-zulip">Making changes with docker-zulip</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/modify.html#applying-changes-from-main">Applying changes from <code class="docutils literal notranslate"><span class="pre">main</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/modify.html#applying-a-small-change">Applying a small change</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/modify.html#upgrading-to-main">Upgrading to <code class="docutils literal notranslate"><span class="pre">main</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/modify.html#contributing-patches">Contributing patches</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/security-model.html">Security model</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#secure-your-zulip-server-like-your-email-server">Secure your Zulip server like your email server</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#encryption-and-authentication">Encryption and authentication</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/security-model.html#passwords">Passwords</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#messages-and-history">Messages and history</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#users-and-bots">Users and bots</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#user-uploaded-content-and-user-generated-requests">User-uploaded content and user-generated requests</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#rate-limiting">Rate limiting</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/security-model.html#final-notes-and-security-response">Final notes and security response</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/authentication-methods.html">Authentication methods</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#email-and-password">Email and password</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#plug-and-play-sso-google-github-gitlab">Plug-and-play SSO (Google, GitHub, GitLab)</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#ldap-including-active-directory">LDAP (including Active Directory)</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#synchronizing-data">Synchronizing data</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#multiple-ldap-searches">Multiple LDAP searches</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#restricting-access-to-an-ldap-group">Restricting access to an LDAP group</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#restricting-ldap-user-access-to-specific-organizations">Restricting LDAP user access to specific organizations</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#troubleshooting">Troubleshooting</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#saml">SAML</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#idp-initiated-sso">IdP-initiated SSO</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#restricting-access-to-specific-organizations">Restricting access to specific organizations</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#synchronizing-user-role-or-custom-profile-fields-during-login">Synchronizing user role or custom profile fields during login</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#scim">SCIM</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#using-keycloak-as-a-saml-idp">Using Keycloak as a SAML IdP</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#using-authentik-as-a-saml-idp">Using Authentik as a SAML IdP</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#saml-single-logout">SAML Single Logout</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#apache-based-sso-with-remote-user">Apache-based SSO with <code class="docutils literal notranslate"><span class="pre">REMOTE_USER</span></code></a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#setup-instructions-for-apache-based-sso">Setup instructions for Apache-based SSO</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#troubleshooting-apache-based-sso">Troubleshooting Apache-based SSO</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/authentication-methods.html#life-of-an-apache-based-sso-login-attempt">Life of an Apache-based SSO login attempt</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#sign-in-with-apple">Sign in with Apple</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#openid-connect">OpenID Connect</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#jwt">JWT</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#configuring-a-custom-python-wrapper-around-the-authenticate-mechanism">Configuring a custom Python wrapper around the <code class="docutils literal notranslate"><span class="pre">authenticate</span></code> mechanism</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#adding-more-authentication-backends">Adding more authentication backends</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/authentication-methods.html#development-only">Development only</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/export-and-import.html">Backups, export and import</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/export-and-import.html#backups">Backups</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#restoring-backups">Restoring backups</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#what-is-included">What is included</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#restore-from-manual-backups">Restore from manual backups</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/export-and-import.html#data-export">Data export</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#consider-upgrading">Consider upgrading</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#preventing-changes-during-the-export">Preventing changes during the export</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#export-your-zulip-data">Export your Zulip data</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/export-and-import.html#import-into-a-new-zulip-server">Import into a new Zulip server</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#import-options">Import options</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#logging-in">Logging in</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#deleting-and-re-importing">Deleting and re-importing</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/export-and-import.html#compliance-exports">Compliance exports</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/export-and-import.html#database-only-backup-tools">Database-only backup tools</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#streaming-backups-to-s3">Streaming backups to S3</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/export-and-import.html#streaming-backups-to-local-disk">Streaming backups to local disk</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/postgresql.html">PostgreSQL database details</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/postgresql.html#separate-postgresql-database">Separate PostgreSQL database</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/postgresql.html#cloud-provider-managed-postgresql-e-g-amazon-rds">Cloud-provider-managed PostgreSQL (e.g., Amazon RDS)</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/postgresql.html#remote-postgresql-database">Remote PostgreSQL database</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/postgresql.html#postgresql-warm-standby">PostgreSQL warm standby</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/postgresql.html#postgresql-vacuuming-alerts">PostgreSQL vacuuming alerts</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/upload-backends.html">File upload backends</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#s3-backend-configuration">S3 backend configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#s3-local-caching">S3 local caching</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#nginx-dns-nameserver-configuration">nginx DNS nameserver configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#s3-bucket-policy">S3 bucket policy</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#migrating-from-local-uploads-to-amazon-s3-backend">Migrating from local uploads to Amazon S3 backend</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#s3-data-storage-class">S3 data storage class</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/upload-backends.html#data-export-bucket">Data export bucket</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/ssl-certificates.html">Installing SSL certificates</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/ssl-certificates.html#manual-install">Manual install</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#testing">Testing</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/ssl-certificates.html#certbot-recommended">Certbot (recommended)</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#at-initial-zulip-install">At initial Zulip install</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#after-zulip-is-already-installed">After Zulip is already installed</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#how-it-works">How it works</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#renewal">Renewal</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/ssl-certificates.html#self-signed-certificate">Self-signed certificate</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/ssl-certificates.html#id1">Troubleshooting</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#the-android-app-can-t-connect-to-the-server">The Android app can’t connect to the server</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#the-ios-app-can-t-connect-to-the-server">The iOS app can’t connect to the server</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/ssl-certificates.html#the-android-app-connects-to-the-server-on-some-devices-but-not-others">The Android app connects to the server on some devices but not others</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/email.html">Outgoing email</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/email.html#how-to-configure">How to configure</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/email.html#email-services">Email services</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/email.html#free-outgoing-email-services">Free outgoing email services</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/email.html#using-system-email">Using system email</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/email.html#using-gmail-for-outgoing-email">Using Gmail for outgoing email</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/email.html#logging-outgoing-email-to-a-file-for-prototyping">Logging outgoing email to a file for prototyping</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/email.html#troubleshooting">Troubleshooting</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/email.html#advanced-troubleshooting">Advanced troubleshooting</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/deployment.html">Deployment options</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#installing-zulip-from-git">Installing Zulip from Git</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#zulip-in-docker">Zulip in Docker</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#zulip-installer-details">Zulip installer details</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/deployment.html#advanced-installer-options">Advanced installer options</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#installing-on-an-existing-server">Installing on an existing server</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#deployment-hooks">Deployment hooks</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/deployment.html#zulip-message-deploy-hook">Zulip message deploy hook</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/deployment.html#sentry-deploy-hook">Sentry deploy hook</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#running-zulip-s-service-dependencies-on-different-machines">Running Zulip’s service dependencies on different machines</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#using-an-alternate-port">Using an alternate port</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/deployment.html#customizing-the-outgoing-http-proxy">Customizing the outgoing HTTP proxy</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/deployment.html#s3-file-storage-requests-and-outgoing-proxies">S3 file storage requests and outgoing proxies</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/reverse-proxies.html">Reverse proxies</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/reverse-proxies.html#installer-options">Installer options</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/reverse-proxies.html#configuring-zulip-to-allow-http">Configuring Zulip to allow HTTP</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/reverse-proxies.html#configuring-zulip-to-trust-proxies">Configuring Zulip to trust proxies</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/reverse-proxies.html#nginx-configuration">nginx configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/reverse-proxies.html#apache2-configuration">Apache2 configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/reverse-proxies.html#haproxy-configuration">HAProxy configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/reverse-proxies.html#other-proxies">Other proxies</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/multiple-organizations.html">Hosting multiple organizations</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/multiple-organizations.html#subdomains">Subdomains</a><ul> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#ssl-certificates">SSL certificates</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#other-hostnames">Other hostnames</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#the-root-domain">The root domain</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#changing-subdomains">Changing subdomains</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#authentication">Authentication</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#the-system-bot-realm">The system bot realm</a></li> <li class="toctree-l4"><a class="reference internal" href="../production/multiple-organizations.html#migrating-troubleshooting">Migrating / troubleshooting</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../production/multiple-organizations.html#open-realm-creation">Open realm creation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/email-gateway.html">Incoming email integration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/email-gateway.html#local-delivery-setup">Local delivery setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/email-gateway.html#polling-setup">Polling setup</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/video-calls.html">Video call providers</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/video-calls.html#jitsi">Jitsi</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/video-calls.html#zoom">Zoom</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/video-calls.html#bigbluebutton">BigBlueButton</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/giphy-gif-integration.html">GIPHY GIF integration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/giphy-gif-integration.html#apply-for-api-key">Apply for API key</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../production/scim.html">SCIM provisioning</a><ul> <li class="toctree-l3"><a class="reference internal" href="../production/scim.html#server-configuration">Server configuration</a></li> <li class="toctree-l3"><a class="reference internal" href="../production/scim.html#additional-options">Additional options</a></li> </ul> </li> </ul> </li> </ul> <ul class="current"> <li class="toctree-l1 current"><a class="reference internal" href="index.html">Contributing to Zulip</a><ul class="current"> <li class="toctree-l2 current"><a class="current reference internal" href="#">Contributing guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="#zulip-development-community">Zulip development community</a></li> <li class="toctree-l3"><a class="reference internal" href="#ways-to-contribute">Ways to contribute</a></li> <li class="toctree-l3"><a class="reference internal" href="#your-first-codebase-contribution">Your first codebase contribution</a><ul> <li class="toctree-l4"><a class="reference internal" href="#where-to-look-for-an-issue">Where to look for an issue</a></li> <li class="toctree-l4"><a class="reference internal" href="#picking-an-issue-to-work-on">Picking an issue to work on</a></li> <li class="toctree-l4"><a class="reference internal" href="#claiming-an-issue">Claiming an issue</a></li> <li class="toctree-l4"><a class="reference internal" href="#working-on-an-issue">Working on an issue</a></li> <li class="toctree-l4"><a class="reference internal" href="#submitting-a-pull-request">Submitting a pull request</a></li> <li class="toctree-l4"><a class="reference internal" href="#beyond-the-first-issue">Beyond the first issue</a></li> <li class="toctree-l4"><a class="reference internal" href="#common-questions">Common questions</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="#what-makes-a-great-zulip-contributor">What makes a great Zulip contributor?</a></li> <li class="toctree-l3"><a class="reference internal" href="#user-feedback">User feedback</a></li> <li class="toctree-l3"><a class="reference internal" href="#outreach-programs">Outreach programs</a></li> <li class="toctree-l3"><a class="reference internal" href="#stay-connected">Stay connected</a></li> <li class="toctree-l3"><a class="reference internal" href="#help-others-find-zulip">Help others find Zulip</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../code-of-conduct.html">Zulip Code of Conduct</a><ul> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#expected-behavior">Expected behavior</a></li> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#unacceptable-behavior">Unacceptable behavior</a></li> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#reporting-and-enforcement">Reporting and enforcement</a></li> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#scope">Scope</a></li> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#license-and-attribution">License and attribution</a></li> <li class="toctree-l3"><a class="reference internal" href="../code-of-conduct.html#moderating-the-zulip-community">Moderating the Zulip community</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="how-we-communicate.html">How we communicate</a><ul> <li class="toctree-l3"><a class="reference internal" href="how-we-communicate.html#providing-suggestions-and-feedback">Providing suggestions and feedback</a></li> <li class="toctree-l3"><a class="reference internal" href="how-we-communicate.html#handling-disagreements">Handling disagreements</a></li> <li class="toctree-l3"><a class="reference internal" href="how-we-communicate.html#expressing-your-appreciation">Expressing your appreciation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="asking-great-questions.html">Asking great questions</a><ul> <li class="toctree-l3"><a class="reference internal" href="asking-great-questions.html#where-to-ask-your-question">Where to ask your question</a></li> <li class="toctree-l3"><a class="reference internal" href="asking-great-questions.html#how-to-ask-a-great-question">How to ask a great question</a></li> <li class="toctree-l3"><a class="reference internal" href="asking-great-questions.html#follow-the-community-guidelines">Follow the community guidelines</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="design-discussions.html">Design discussions</a><ul> <li class="toctree-l3"><a class="reference internal" href="design-discussions.html#guidelines-for-all-participants">Guidelines for all participants</a></li> <li class="toctree-l3"><a class="reference internal" href="design-discussions.html#participant-roles">Participant roles</a></li> <li class="toctree-l3"><a class="reference internal" href="design-discussions.html#guidelines-for-code-contributors">Guidelines for code contributors</a><ul> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#when-to-post">When to post</a></li> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#guidelines-for-requesting-design-feedback">Guidelines for requesting design feedback</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="design-discussions.html#guidelines-for-community-moderators">Guidelines for community moderators</a><ul> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#improving-the-quality-of-discussions">Improving the quality of discussions</a></li> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#moving-threads-to-the-most-appropriate-channel">Moving threads to the most appropriate channel</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="design-discussions.html#guidelines-for-decision-makers">Guidelines for decision makers</a><ul> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#managing-the-discussion">Managing the discussion</a></li> <li class="toctree-l4"><a class="reference internal" href="design-discussions.html#from-discussion-to-decision">From discussion to decision</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="commit-discipline.html">Commit discipline</a><ul> <li class="toctree-l3"><a class="reference internal" href="commit-discipline.html#each-commit-must-be-coherent">Each commit must be coherent</a></li> <li class="toctree-l3"><a class="reference internal" href="commit-discipline.html#commits-should-generally-be-minimal">Commits should generally be minimal</a><ul> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#when-not-to-be-overly-minimal">When not to be overly minimal</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="commit-discipline.html#write-a-clean-commit-history">Write a clean commit history</a></li> <li class="toctree-l3"><a class="reference internal" href="commit-discipline.html#commit-messages">Commit messages</a><ul> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#commit-summary-part-1">Commit summary, part 1</a></li> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#commit-summary-part-2">Commit summary, part 2</a></li> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#examples-of-good-commit-summaries">Examples of good commit summaries</a></li> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#commit-description">Commit description</a></li> <li class="toctree-l4"><a class="reference internal" href="commit-discipline.html#examples-of-good-commit-messages">Examples of good commit messages</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="code-style.html">Code style and conventions</a><ul> <li class="toctree-l3"><a class="reference internal" href="code-style.html#be-consistent-with-existing-code">Be consistent with existing code</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-style.html#use-the-linters">Use the linters</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#use-tests-to-verify-your-logic">Use tests to verify your logic</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#follow-zulip-conventions-and-practices">Follow Zulip conventions and practices</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-style.html#observe-a-reasonable-line-length">Observe a reasonable line length</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#tag-user-facing-strings-for-translation">Tag user-facing strings for translation</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#correctly-prepare-paths-destined-for-state-or-log-files">Correctly prepare paths destined for state or log files</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#never-include-secrets-inline-with-code">Never include secrets inline with code</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#familiarize-yourself-with-rules-about-third-party-code">Familiarize yourself with rules about third-party code</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#python-specific-conventions-and-practices">Python-specific conventions and practices</a></li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#javascript-and-typescript-conventions-and-practices">JavaScript and TypeScript conventions and practices</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-style.html#build-dom-elements-in-handlebars">Build DOM elements in Handlebars</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#attach-behaviors-to-event-listeners">Attach behaviors to event listeners</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#declare-variables-using-const-and-let">Declare variables using <code class="docutils literal notranslate"><span class="pre">const</span></code> and <code class="docutils literal notranslate"><span class="pre">let</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#manipulate-objects-and-arrays-with-modern-methods">Manipulate objects and arrays with modern methods</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#html-and-css">HTML and CSS</a></li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#dangerous-constructs-in-django">Dangerous constructs in Django</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-style.html#avoid-excessive-database-queries">Avoid excessive database queries</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#never-do-direct-database-queries-userprofile-objects-get-client-objects-get-etc">Never do direct database queries (<code class="docutils literal notranslate"><span class="pre">UserProfile.objects.get()</span></code>, <code class="docutils literal notranslate"><span class="pre">Client.objects.get()</span></code>, etc.)</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#don-t-use-django-model-objects-as-keys-in-sets-dicts">Don’t use Django model objects as keys in sets/dicts</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#don-t-call-user-profile-save-without-update-fields">Don’t call user_profile.save() without <code class="docutils literal notranslate"><span class="pre">update_fields</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#don-t-update-important-model-objects-with-raw-saves">Don’t update important model objects with raw saves</a></li> <li class="toctree-l4"><a class="reference internal" href="code-style.html#don-t-use-naive-datetime-objects">Don’t use naive datetime objects</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-style.html#dangerous-constructs-in-javascript-and-typescript">Dangerous constructs in JavaScript and TypeScript</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-style.html#do-not-use-for-in-statements-to-traverse-arrays">Do not use <code class="docutils literal notranslate"><span class="pre">for...in</span></code> statements to traverse arrays</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="code-reviewing.html">Reviewing Zulip code</a><ul> <li class="toctree-l3"><a class="reference internal" href="code-reviewing.html#principles-of-code-review">Principles of code review</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#reviewing-your-own-code">Reviewing your own code</a></li> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#reviewing-other-contributors-code">Reviewing other contributors’ code</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-reviewing.html#how-to-review-code">How to review code</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#code-review-checklist">Code review checklist</a></li> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#automated-testing">Automated testing</a></li> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#manual-testing">Manual testing</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-reviewing.html#review-process-and-communication">Review process and communication</a><ul> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#asking-for-a-code-review">Asking for a code review</a></li> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#reviewing-someone-else-s-code">Reviewing someone else’s code</a></li> <li class="toctree-l4"><a class="reference internal" href="code-reviewing.html#responding-to-review-feedback">Responding to review feedback</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="code-reviewing.html#additional-resources">Additional resources</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="reviewable-prs.html">Submitting a pull request</a><ul> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#write-clear-code">Write clear code</a></li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#organize-your-proposed-changes">Organize your proposed changes</a></li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#explain-your-changes">Explain your changes</a><ul> <li class="toctree-l4"><a class="reference internal" href="reviewable-prs.html#discussions-in-the-development-community">Discussions in the development community</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#review-your-own-work">Review your own work</a></li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#submit-your-pull-request-for-review">Submit your pull request for review</a></li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#draft-pull-requests">Draft pull requests</a></li> <li class="toctree-l3"><a class="reference internal" href="reviewable-prs.html#demonstrating-visual-changes">Demonstrating visual changes</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="review-process.html">Pull request review process</a><ul> <li class="toctree-l3"><a class="reference internal" href="review-process.html#labels-for-managing-the-stages-of-pull-request-review">Labels for managing the stages of pull request review</a></li> <li class="toctree-l3"><a class="reference internal" href="review-process.html#stages-of-a-pull-request-review">Stages of a pull request review</a></li> <li class="toctree-l3"><a class="reference internal" href="review-process.html#how-to-help-move-the-review-process-forward">How to help move the review process forward</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="continuing-unfinished-work.html">Continuing unfinished work</a><ul> <li class="toctree-l3"><a class="reference internal" href="continuing-unfinished-work.html#find-work-to-be-completed">Find work to be completed</a></li> <li class="toctree-l3"><a class="reference internal" href="continuing-unfinished-work.html#review-existing-work-and-feedback">Review existing work and feedback</a></li> <li class="toctree-l3"><a class="reference internal" href="continuing-unfinished-work.html#decide-how-to-use-prior-work">Decide how to use prior work</a></li> <li class="toctree-l3"><a class="reference internal" href="continuing-unfinished-work.html#credit-prior-work-in-your-commit-history">Credit prior work in your commit history</a></li> <li class="toctree-l3"><a class="reference internal" href="continuing-unfinished-work.html#present-your-pull-request">Present your pull request</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="zulipbot-usage.html">Using zulipbot</a><ul> <li class="toctree-l3"><a class="reference internal" href="zulipbot-usage.html#usage">Usage</a><ul> <li class="toctree-l4"><a class="reference internal" href="zulipbot-usage.html#contributing">Contributing</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="reporting-bugs.html">Reporting bugs</a><ul> <li class="toctree-l3"><a class="reference internal" href="reporting-bugs.html#what-to-include-in-a-bug-report">What to include in a bug report</a></li> <li class="toctree-l3"><a class="reference internal" href="reporting-bugs.html#filing-a-github-issue">Filing a GitHub issue</a></li> <li class="toctree-l3"><a class="reference internal" href="reporting-bugs.html#starting-a-conversation-about-a-possible-bug">Starting a conversation about a possible bug</a></li> <li class="toctree-l3"><a class="reference internal" href="reporting-bugs.html#managing-bug-reports">Managing bug reports</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="suggesting-features.html">Suggesting features and improvements</a><ul> <li class="toctree-l3"><a class="reference internal" href="suggesting-features.html#what-to-include-in-your-proposal">What to include in your proposal</a></li> <li class="toctree-l3"><a class="reference internal" href="suggesting-features.html#starting-a-conversation-about-a-suggested-feature-or-improvement">Starting a conversation about a suggested feature or improvement</a></li> <li class="toctree-l3"><a class="reference internal" href="suggesting-features.html#filing-a-github-issue">Filing a GitHub issue</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="counting-contributions.html">Counting contributions</a><ul> <li class="toctree-l3"><a class="reference internal" href="counting-contributions.html#how-the-contribution-stats-are-calculated">How the contribution stats are calculated</a></li> <li class="toctree-l3"><a class="reference internal" href="counting-contributions.html#old-email-addresses">Old email addresses</a></li> <li class="toctree-l3"><a class="reference internal" href="counting-contributions.html#relevant-source-code">Relevant source code</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="licensing.html">Licensing</a><ul> <li class="toctree-l3"><a class="reference internal" href="licensing.html#contributing-your-own-work">Contributing your own work</a></li> <li class="toctree-l3"><a class="reference internal" href="licensing.html#contributing-someone-else-s-work">Contributing someone else’s work</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../development/index.html">Development environment</a><ul> <li class="toctree-l2"><a class="reference internal" href="../development/overview.html">Development environment installation</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#requirements">Requirements</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#recommended-setup">Recommended setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#vagrant-setup">Vagrant setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#advanced-setup">Advanced setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#slow-internet-connections">Slow internet connections</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#installing-remotely">Installing remotely</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/overview.html#next-steps">Next steps</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/setup-recommended.html">Recommended setup</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#requirements">Requirements</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#step-0-set-up-git-github">Step 0: Set up Git & GitHub</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#step-1-install-prerequisites">Step 1: Install prerequisites</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#step-2-get-zulip-code">Step 2: Get Zulip code</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#step-3-start-the-development-environment">Step 3: Start the development environment</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#step-4-developing">Step 4: Developing</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#where-to-edit-files">Where to edit files</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vscode-setup-optional">VSCode setup (optional)</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#understanding-run-dev-debugging-output">Understanding run-dev debugging output</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#committing-and-pushing-changes-with-git">Committing and pushing changes with Git</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#maintaining-the-development-environment">Maintaining the development environment</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#rebuilding-the-development-environment">Rebuilding the development environment</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#shutting-down-the-development-environment-for-use-later">Shutting down the development environment for use later</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#resuming-the-development-environment">Resuming the development environment</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#next-steps">Next steps</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#troubleshooting-and-common-errors">Troubleshooting and common errors</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vagrant-guest-doesn-t-show-zulip-py3-venv-at-start-of-prompt">Vagrant guest doesn’t show (zulip-py3-venv) at start of prompt</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vagrant-was-unable-to-mount-virtualbox-shared-folders">Vagrant was unable to mount VirtualBox shared folders</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#ssl-read-error">ssl read error</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#unmet-dependencies-error">Unmet dependencies error</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#ssh-connection-closed-by-remote-host">ssh connection closed by remote host</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#os-symlink-error">os.symlink error</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#hyper-v-error-messages">Hyper-V error messages</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#connection-timeout-on-vagrant-up">Connection timeout on <code class="docutils literal notranslate"><span class="pre">vagrant</span> <span class="pre">up</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vagrant-was-unable-to-communicate-with-the-guest-machine">Vagrant was unable to communicate with the guest machine</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vagrant-up-fails-with-subprocess-calledprocesserror">Vagrant up fails with subprocess.CalledProcessError</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#vboxmanage-errors-related-to-vt-x-or-whvsetuppartition">VBoxManage errors related to VT-x or WHvSetupPartition</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/setup-recommended.html#oserror-errno-26-text-file-busy">OSError: [Errno 26] Text file busy</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#specifying-an-ubuntu-mirror">Specifying an Ubuntu mirror</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#specifying-a-proxy">Specifying a proxy</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#using-a-different-port-for-vagrant">Using a different port for Vagrant</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-recommended.html#customizing-cpu-and-ram-allocation">Customizing CPU and RAM allocation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/setup-advanced.html">Advanced setup</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/setup-advanced.html#installing-directly-on-ubuntu-debian-centos-or-fedora">Installing directly on Ubuntu, Debian, CentOS, or Fedora</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-advanced.html#installing-using-vagrant-with-virtualbox-on-windows-10">Installing using Vagrant with VirtualBox on Windows 10</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/setup-advanced.html#running-git-bash-as-an-administrator">Running Git BASH as an administrator</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-advanced.html#using-the-vagrant-hyper-v-provider-on-windows-beta">Using the Vagrant Hyper-V provider on Windows (beta)</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/setup-advanced.html#problems-you-may-encounter">Problems you may encounter</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/setup-advanced.html#newer-versions-of-supported-platforms">Newer versions of supported platforms</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/using.html">Using the development environment</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/using.html#common">Common</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/using.html#server">Server</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/using.html#web">Web</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/using.html#mobile">Mobile</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/remote.html">Developing remotely</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#connecting-to-the-remote-environment">Connecting to the remote environment</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#setting-up-user-accounts">Setting up user accounts</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#setting-up-the-development-environment">Setting up the development environment</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#running-the-development-server">Running the development server</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#making-changes-to-code-on-your-remote-development-server">Making changes to code on your remote development server</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/remote.html#editing-locally">Editing locally</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/remote.html#editing-remotely">Editing remotely</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/remote.html#next-steps">Next steps</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/remote.html#using-an-nginx-reverse-proxy">Using an nginx reverse proxy</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/authentication.html">Authentication in the development environment</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#email-and-password">Email and password</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#google">Google</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#github">GitHub</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#gitlab">GitLab</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#apple">Apple</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#saml">SAML</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#when-ssl-is-required">When SSL is required</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#testing-ldap-in-development">Testing LDAP in development</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/authentication.html#testing-avatar-and-custom-profile-field-synchronization">Testing avatar and custom profile field synchronization</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/authentication.html#automated-testing">Automated testing</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#two-factor-authentication">Two factor authentication</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/authentication.html#password-form-implementation">Password form implementation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/test-install.html">Testing the installer</a><ul> <li class="toctree-l3"><a class="reference internal" href="../development/test-install.html#configuring">Configuring</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/test-install.html#running-a-test-install">Running a test install</a><ul> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#build-and-unpack-a-release-tarball">Build and unpack a release tarball</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#test-an-install">Test an install</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#see-running-containers-after-installation">See running containers after installation</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#connect-to-a-running-container">Connect to a running container</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#stopping-and-destroying-containers">Stopping and destroying containers</a></li> <li class="toctree-l4"><a class="reference internal" href="../development/test-install.html#iterating-on-the-installer">Iterating on the installer</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../tutorials/index.html">Developer tutorials</a><ul> <li class="toctree-l2"><a class="reference internal" href="../tutorials/new-feature-tutorial.html">Writing a new application feature</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#general-process">General process</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#files-impacted">Files impacted</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#adding-a-field-to-the-database">Adding a field to the database</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#backend-changes">Backend changes</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#frontend-changes">Frontend changes</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#documentation-changes">Documentation changes</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#example-feature">Example feature</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#update-the-model">Update the model</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#create-the-migration">Create the migration</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#test-your-migration-changes">Test your migration changes</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#handle-database-interactions">Handle database interactions</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#update-application-state">Update application state</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#add-a-new-view">Add a new view</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#backend-tests">Backend tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#update-the-frontend">Update the frontend</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#frontend-tests">Frontend tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/new-feature-tutorial.html#update-documentation">Update documentation</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../tutorials/writing-views.html">Writing views in Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#what-this-covers">What this covers</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#what-is-a-view">What is a view?</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#modifying-urls-py">Modifying urls.py</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#writing-human-readable-views">Writing human-readable views</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#decorators-used-for-webpage-views">Decorators used for webpage views</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#writing-a-template">Writing a template</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#writing-api-rest-endpoints">Writing API REST endpoints</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#request-variables">Request variables</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#deciding-which-http-verb-to-use">Deciding which HTTP verb to use</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#idempotency">Idempotency</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#making-changes-to-the-database">Making changes to the database</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#calling-from-the-web-application">Calling from the web application</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/writing-views.html#calling-from-an-api-client">Calling from an API client</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#legacy-endpoints-used-by-the-web-client">Legacy endpoints used by the web client</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/writing-views.html#incoming-webhook-integrations">Incoming webhook integrations</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../tutorials/life-of-a-request.html">Life of a request</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#a-request-is-sent-to-the-server-and-handled-by-nginx">A request is sent to the server, and handled by nginx</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#static-files-are-served-directly-by-nginx">Static files are served directly by nginx</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#nginx-routes-other-requests-between-django-and-tornado">nginx routes other requests <span class="xref myst">between Django and Tornado</span></a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#django-routes-the-request-to-a-view-in-urls-py-files">Django routes the request to a view in urls.py files</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#views-serving-html-are-internationalized-by-server-path">Views serving HTML are internationalized by server path</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#api-endpoints-use-rest">API endpoints use REST</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/life-of-a-request.html#put-is-only-for-creating-new-things">PUT is only for creating new things</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/life-of-a-request.html#options">OPTIONS</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/life-of-a-request.html#incoming-webhook-integrations-may-not-be-restful">Incoming webhook integrations may not be RESTful</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#django-calls-rest-dispatch-for-rest-endpoints-and-authenticates">Django calls rest_dispatch for REST endpoints, and authenticates</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#the-view-will-authorize-the-user-extract-request-variables-and-validate-them">The view will authorize the user, extract request variables, and validate them</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/life-of-a-request.html#results-are-given-as-json">Results are given as JSON</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../tutorials/reading-list.html">Reading list</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#general-programming-it">General programming/IT</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#python">Python</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#java-android">Java/Android</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#javascript-ecmascript">JavaScript/ECMAScript</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#typescript">TypeScript</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#git-version-control-systems-vcs">Git/version control systems (VCS)</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#computer-science-algorithms">Computer science/algorithms</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#community-experience">Community experience</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#competitions-camps">Competitions/camps</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/reading-list.html#massive-open-online-courses-mooc-platforms">Massive open online courses (MOOC) platforms</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html">Screenshot and GIF software</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#screenshot-tools-by-platform">Screenshot tools by platform</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#browser">Browser</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#macos">macOS</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#windows">Windows</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#linux">Linux</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#gif-tools-by-platform">GIF tools by platform</a><ul> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#id1">Browser</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#id2">macOS</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#id3">Windows</a></li> <li class="toctree-l4"><a class="reference internal" href="../tutorials/screenshot-and-gif-software.html#id4">Linux</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../tutorials/shell-tips.html">Shell tips</a><ul> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#the-prompt">The prompt (<code class="docutils literal notranslate"><span class="pre">$</span></code>)</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#tilde-character">Tilde character (<code class="docutils literal notranslate"><span class="pre">~</span></code>)</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#change-directory-cd">Change directory (<code class="docutils literal notranslate"><span class="pre">cd</span></code>)</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#running-commands-as-root-sudo">Running commands as root (<code class="docutils literal notranslate"><span class="pre">sudo</span></code>)</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#escaping-characters">Escaping characters</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#sequencing-commands">Sequencing commands</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#splitting-commands-into-multiple-lines">Splitting commands into multiple lines</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#arguments">Arguments</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#shebang">Shebang</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#understanding-commands">Understanding commands</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#cheatsheet">Cheatsheet</a></li> <li class="toctree-l3"><a class="reference internal" href="../tutorials/shell-tips.html#git">Git</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../git/index.html">Git guide</a><ul> <li class="toctree-l2"><a class="reference internal" href="../git/overview.html">Quick start</a></li> <li class="toctree-l2"><a class="reference internal" href="../git/setup.html">Set up Git</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/setup.html#install-and-configure-git-join-github">Install and configure Git, join GitHub</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/setup.html#get-a-graphical-client">Get a graphical client</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/zulip-tools.html">Zulip-specific tools</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#set-up-git-repo-script">Set up Git repo script</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#configure-continuous-integration-for-your-zulip-fork">Configure continuous integration for your Zulip fork</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#reset-to-pull-request">Reset to pull request</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#fetch-a-pull-request-and-rebase">Fetch a pull request and rebase</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#fetch-a-pull-request-without-rebasing">Fetch a pull request without rebasing</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#push-to-a-pull-request">Push to a pull request</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#delete-unimportant-branches">Delete unimportant branches</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/zulip-tools.html#merge-conflict-on-pnpm-lock-yaml-file">Merge conflict on <code class="docutils literal notranslate"><span class="pre">pnpm-lock.yaml</span></code> file</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/the-git-difference.html">How Git is different</a></li> <li class="toctree-l2"><a class="reference internal" href="../git/terminology.html">Important Git terms</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#branch">branch</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#cache">cache</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#checkout">checkout</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#commit">commit</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#fast-forward">fast-forward</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#fetch">fetch</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#hash">hash</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#head">head</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#id1">HEAD</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#index">index</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#pull">pull</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#push">push</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/terminology.html#rebase">rebase</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/cloning.html">Get Zulip code</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/cloning.html#step-1a-create-your-fork">Step 1a: Create your fork</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/cloning.html#step-1b-clone-to-your-machine">Step 1b: Clone to your machine</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/cloning.html#step-1c-connect-your-fork-to-zulip-upstream">Step 1c: Connect your fork to Zulip upstream</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/cloning.html#step-2-set-up-the-zulip-development-environment">Step 2: Set up the Zulip development environment</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/cloning.html#step-3-configure-continuous-integration-for-your-fork">Step 3: Configure continuous integration for your fork</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/working-copies.html">Working copies</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/working-copies.html#workflows">Workflows</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/working-copies.html#relevant-git-commands">Relevant Git commands</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/using.html">Using Git as you work</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#know-what-branch-you-re-working-on">Know what branch you’re working on</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#keep-your-fork-up-to-date">Keep your fork up to date</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#work-on-a-feature-branch">Work on a feature branch</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#run-linters-and-tests-locally">Run linters and tests locally</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#stage-changes">Stage changes</a><ul> <li class="toctree-l4"><a class="reference internal" href="../git/using.html#get-status-of-working-directory">Get status of working directory</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/using.html#stage-additions-with-git-add">Stage additions with <code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">add</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../git/using.html#stage-deletions-with-git-rm">Stage deletions with <code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">rm</span></code></a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#commit-changes">Commit changes</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#push-your-commits-to-github">Push your commits to GitHub</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#examine-and-tidy-your-commit-history">Examine and tidy your commit history</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/using.html#force-push-changes-to-github-after-you-ve-altered-your-history">Force-push changes to GitHub after you’ve altered your history</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/pull-requests.html">Pull requests</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/pull-requests.html#draft-pull-requests">Draft pull requests</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/pull-requests.html#id1">Create a pull request</a><ul> <li class="toctree-l4"><a class="reference internal" href="../git/pull-requests.html#step-0-make-sure-you-re-on-a-feature-branch-not-main">Step 0: Make sure you’re on a feature branch (not <code class="docutils literal notranslate"><span class="pre">main</span></code>)</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/pull-requests.html#step-1-update-your-branch-with-git-rebase">Step 1: Update your branch with git rebase</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/pull-requests.html#step-2-push-your-updated-branch-to-your-remote-fork">Step 2: Push your updated branch to your remote fork</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/pull-requests.html#step-3-open-the-pull-request">Step 3: Open the pull request</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../git/pull-requests.html#update-a-pull-request">Update a pull request</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/collaborate.html">Collaborate</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/collaborate.html#fetch-another-contributor-s-branch">Fetch another contributor’s branch</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/collaborate.html#check-out-a-pull-request-locally">Check out a pull request locally</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/fixing-commits.html">Fixing commits</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/fixing-commits.html#fixing-the-last-commit">Fixing the last commit</a><ul> <li class="toctree-l4"><a class="reference internal" href="../git/fixing-commits.html#changing-the-last-commit-message">Changing the last commit message</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/fixing-commits.html#changing-the-last-commit">Changing the last commit</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../git/fixing-commits.html#fixing-older-commits">Fixing older commits</a><ul> <li class="toctree-l4"><a class="reference internal" href="../git/fixing-commits.html#changing-commit-messages">Changing commit messages</a></li> <li class="toctree-l4"><a class="reference internal" href="../git/fixing-commits.html#deleting-old-commits">Deleting old commits</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../git/fixing-commits.html#squashing-commits">Squashing commits</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/fixing-commits.html#reordering-commits">Reordering commits</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/fixing-commits.html#pushing-commits-after-tidying-them">Pushing commits after tidying them</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/reviewing.html">Reviewing changes</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/reviewing.html#changes-on-local-working-tree">Changes on (local) working tree</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/reviewing.html#changes-within-branches">Changes within branches</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/reviewing.html#changes-between-branches">Changes between branches</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/troubleshooting.html">Get and stay out of trouble</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/troubleshooting.html#undo-a-merge-commit">Undo a merge commit</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/troubleshooting.html#restore-a-lost-commit">Restore a lost commit</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/troubleshooting.html#recover-from-a-git-rebase-failure">Recover from a <code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">rebase</span></code> failure</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/troubleshooting.html#working-from-multiple-computers">Working from multiple computers</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../git/cheat-sheet.html">Git cheat sheet</a><ul> <li class="toctree-l3"><a class="reference internal" href="../git/cheat-sheet.html#common-commands">Common commands</a></li> <li class="toctree-l3"><a class="reference internal" href="../git/cheat-sheet.html#detailed-cheat-sheet">Detailed cheat sheet</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../testing/index.html">Code testing</a><ul> <li class="toctree-l2"><a class="reference internal" href="../testing/testing.html">Testing overview</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/testing.html#running-tests">Running tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing.html#major-test-suites">Major test suites</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing.html#other-test-suites">Other test suites</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing.html#internet-access-inside-test-suites">Internet access inside test suites</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/testing.html#documentation-tests">Documentation tests</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/linters.html">Linters</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#overview">Overview</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#running-the-linters">Running the linters</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#general-considerations">General considerations</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#lint-checks">Lint checks</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#lint">lint</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/linters.html#special-options">Special options</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/linters.html#id1">Lint checks</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../testing/linters.html#philosophy">Philosophy</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/linters.html#speed">Speed</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/linters.html#accuracy">Accuracy</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/linters.html#completeness">Completeness</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/testing-with-django.html">Backend Django tests</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-django.html#overview">Overview</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-django.html#running-tests">Running tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-django.html#writing-tests">Writing tests</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#setting-up-data-for-tests">Setting up data for tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#testing-code-that-accesses-the-filesystem">Testing code that accesses the filesystem</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#testing-with-mocks">Testing with mocks</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-django.html#zulip-testing-philosophy">Zulip testing philosophy</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#endpoint-tests">Endpoint tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#library-tests">Library tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#fixture-driven-tests">Fixture-driven tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#mocks-and-stubs">Mocks and stubs</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#template-tests">Template tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#sql-performance-tests">SQL performance tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#event-based-tests">Event-based tests</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/testing-with-django.html#negative-tests">Negative tests</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-django.html#testing-considerations">Testing considerations</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/testing-with-node.html">JavaScript/TypeScript unit tests</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#how-the-node-tests-work">How the node tests work</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#handling-dependencies-in-unit-tests">Handling dependencies in unit tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#creating-new-test-modules">Creating new test modules</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#verifying-html-templates-with-mock-template">Verifying HTML templates with <code class="docutils literal notranslate"><span class="pre">mock_template</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#coverage-reports">Coverage reports</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#editor-debugger-integration">Editor debugger integration</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#webstorm-integration-setup">Webstorm integration setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-node.html#running-tests-with-the-debugger">Running tests with the debugger</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/testing-with-puppeteer.html">Web frontend black-box Puppeteer tests</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-puppeteer.html#running-tests">Running tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-puppeteer.html#how-puppeteer-tests-work">How Puppeteer tests work</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-puppeteer.html#debugging-puppeteer-tests">Debugging Puppeteer tests</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/testing-with-puppeteer.html#writing-puppeteer-tests">Writing Puppeteer tests</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/mypy.html">Python static type checker (mypy)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#installing-mypy">Installing mypy</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#running-mypy-on-zulip-s-code-locally">Running mypy on Zulip’s code locally</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#mypy-is-there-to-find-bugs-in-zulip-before-they-impact-users">Mypy is there to find bugs in Zulip before they impact users</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#mypy-stubs-for-third-party-modules">Mypy stubs for third-party modules</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#working-with-types-from-django-stubs">Working with types from django-stubs</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#using-overload-to-accurately-describe-variations">Using @overload to accurately describe variations</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#best-practices">Best practices</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#when-is-a-type-annotation-justified">When is a type annotation justified?</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#avoid-the-any-type">Avoid the <code class="docutils literal notranslate"><span class="pre">Any</span></code> type</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#avoid-cast">Avoid <code class="docutils literal notranslate"><span class="pre">cast()</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#avoid-type-ignore-comments">Avoid <code class="docutils literal notranslate"><span class="pre">#</span> <span class="pre">type:</span> <span class="pre">ignore</span></code> comments</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#avoid-other-unchecked-constructs">Avoid other unchecked constructs</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#use-optional-and-none-correctly">Use <code class="docutils literal notranslate"><span class="pre">Optional</span></code> and <code class="docutils literal notranslate"><span class="pre">None</span></code> correctly</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#read-only-types">Read-only types</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/mypy.html#typing-decorators">Typing decorators</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../testing/mypy.html#troubleshooting-advice">Troubleshooting advice</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/typescript.html">TypeScript static types</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/typescript.html#type-checking">Type checking</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/typescript.html#linting-and-style">Linting and style</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/typescript.html#migration-strategy">Migration strategy</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/continuous-integration.html">Continuous integration (CI)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/continuous-integration.html#goals">Goals</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/continuous-integration.html#github-actions">GitHub Actions</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/continuous-integration.html#useful-debugging-tips-and-tools">Useful debugging tips and tools</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/continuous-integration.html#suites">Suites</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/continuous-integration.html#configuration">Configuration</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/continuous-integration.html#images">Images</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/continuous-integration.html#performance-optimizations">Performance optimizations</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/manual-testing.html">Manual testing</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/manual-testing.html#basic-stuff">Basic stuff</a><ul> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#message-view">Message view</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#messagebox">Messagebox</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#message-editing">Message editing</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#narrowing">Narrowing</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#composing-messages">Composing messages</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#popover-menus">Popover menus</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#sidebar-filtering">Sidebar filtering</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#channel-permissions">Channel permissions</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#search">Search</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#channel-settings">Channel settings</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#user-settings">User settings</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#keyboard-shortcuts">Keyboard shortcuts</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#miscellaneous-menu-options">Miscellaneous menu options</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#inviting-users-tutorial">Inviting users/tutorial</a></li> <li class="toctree-l4"><a class="reference internal" href="../testing/manual-testing.html#to-be-continued">To be continued…</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../testing/philosophy.html">Testing philosophy</a><ul> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#effective-testing-allows-us-to-move-quickly">Effective testing allows us to move quickly</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#test-suite-performance-and-reliability-are-critical">Test suite performance and reliability are critical</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#integration-testing-or-unit-testing">Integration testing or unit testing?</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#avoid-duplicating-code-with-security-impact">Avoid duplicating code with security impact</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#share-test-setup-code">Share test setup code</a></li> <li class="toctree-l3"><a class="reference internal" href="../testing/philosophy.html#what-isn-t-tested-probably-doesn-t-work">What isn’t tested probably doesn’t work</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../subsystems/index.html">Subsystems documentation</a><ul> <li class="toctree-l2"><a class="reference internal" href="../subsystems/dependencies.html">Provisioning and third-party dependencies</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#provisioning">Provisioning</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/dependencies.html#provision-version">PROVISION_VERSION</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#philosophy-on-adding-third-party-dependencies">Philosophy on adding third-party dependencies</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#system-packages">System packages</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#python-packages">Python packages</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/dependencies.html#upgrading-packages">Upgrading packages</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#javascript-and-other-frontend-packages">JavaScript and other frontend packages</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#node-js-and-pnpm">Node.js and pnpm</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#shellcheck-and-shfmt">ShellCheck and shfmt</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#puppet-packages">Puppet packages</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#other-third-party-and-generated-files">Other third-party and generated files</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/dependencies.html#emoji">Emoji</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/dependencies.html#translations-data">Translations data</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/dependencies.html#pygments-data">Pygments data</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/dependencies.html#modifying-provisioning">Modifying provisioning</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/settings.html">Settings system</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/settings.html#server-settings">Server settings</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/settings.html#testing-non-default-settings">Testing non-default settings</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/settings.html#realm-settings">Realm settings</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/html-css.html">HTML and CSS</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#zulip-css-organization">Zulip CSS organization</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#editing-zulip-css">Editing Zulip CSS</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#css-style-guidelines">CSS style guidelines</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#avoid-duplicated-code">Avoid duplicated code</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#be-consistent-with-existing-similar-ui">Be consistent with existing similar UI</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#use-clear-unique-names-for-classes-and-object-ids">Use clear, unique names for classes and object IDs</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#validating-css">Validating CSS</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#html-templates">HTML templates</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#behavior">Behavior</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#backend-templates">Backend templates</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#frontend-templates">Frontend templates</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#toolchain">Toolchain</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#translation">Translation</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#tooltips">Tooltips</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/html-css.html#static-asset-pipeline">Static asset pipeline</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#primary-build-process">Primary build process</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#adding-static-files">Adding static files</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#how-it-works-in-production">How it works in production</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/html-css.html#es6-typescript-modules">ES6/TypeScript modules</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/accessibility.html">Accessibility</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/accessibility.html#guidelines">Guidelines</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/accessibility.html#tools">Tools</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/accessibility.html#github-issues">GitHub issues</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/accessibility.html#additional-resources">Additional resources</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/events-system.html">Real-time push and events</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/events-system.html#generation-system">Generation system</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/events-system.html#delivery-system">Delivery system</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/events-system.html#the-initial-data-fetch">The initial data fetch</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/events-system.html#testing">Testing</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/events-system.html#messages">Messages</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/events-system.html#schema-changes">Schema changes</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/sending-messages.html">Sending messages</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#message-lists">Message lists</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#compose-area">Compose area</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#backend-implementation">Backend implementation</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#local-echo">Local echo</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/sending-messages.html#local-echo-in-message-editing">Local echo in message editing</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#putting-it-all-together">Putting it all together</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#message-editing">Message editing</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/sending-messages.html#inline-url-previews">Inline URL previews</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/sending-messages.html#soft-deactivation">Soft deactivation</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/notifications.html">Notifications in Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/notifications.html#important-corner-cases">Important corner cases</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/notifications.html#the-mobile-email-notifications-flow">The mobile/email notifications flow</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/queuing.html">Queue processors</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/queuing.html#adding-a-new-queue-processor">Adding a new queue processor</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/queuing.html#publishing-events-into-a-queue">Publishing events into a queue</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/queuing.html#clearing-a-rabbitmq-queue">Clearing a RabbitMQ queue</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/pointer.html">Unread counts and the pointer</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/pointer.html#pointer-logic">Pointer logic</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/pointer.html#recipient-bar-message-you-clicked">Recipient bar: message you clicked</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/pointer.html#search-sidebar-click-or-new-tab-unread-recent-matching-narrow">Search, sidebar click, or new tab: unread/recent matching narrow</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/pointer.html#unnarrow-previous-sequence">Unnarrow: previous sequence</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/pointer.html#forced-reload-state-preservation">Forced reload: state preservation</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/pointer.html#unread-count-logic">Unread count logic</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/pointer.html#testing-and-development">Testing and development</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/markdown.html">Markdown implementation</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/markdown.html#testing">Testing</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/markdown.html#changing-zulip-s-markdown-processor">Changing Zulip’s Markdown processor</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/markdown.html#per-realm-features">Per-realm features</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/markdown.html#zulip-s-markdown-philosophy">Zulip’s Markdown philosophy</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/markdown.html#zulip-s-changes-to-markdown">Zulip’s changes to Markdown</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/markdown.html#basic-syntax">Basic syntax</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/markdown.html#lists">Lists</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/markdown.html#links">Links</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/markdown.html#code">Code</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/markdown.html#other">Other</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/caching.html">Caching in Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/caching.html#backend-caching-with-memcached">Backend caching with memcached</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#the-core-implementation">The core implementation</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#cautions">Cautions</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#cache-invalidation-after-writes">Cache invalidation after writes</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#production-deployments-and-database-migrations">Production deployments and database migrations</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#automated-testing-and-memcached">Automated testing and memcached</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#manual-testing-and-memcached">Manual testing and memcached</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/caching.html#performance">Performance</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/caching.html#in-process-caching-in-django">In-process caching in Django</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/caching.html#browser-caching-of-state">Browser caching of state</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/performance.html">Performance and scalability</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/performance.html#load-profiles">Load profiles</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/performance.html#major-zulip-endpoints">Major Zulip endpoints</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#tornado">Tornado</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#presence">Presence</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#fetching-page-params">Fetching page_params</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#fetching-message-history">Fetching message history</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#user-uploads">User uploads</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#sending-and-editing-messages">Sending and editing messages</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/performance.html#other-endpoints">Other endpoints</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/performance.html#queue-processors-and-cron-jobs">Queue processors and cron jobs</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/performance.html#service-scalability">Service scalability</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/realms.html">Realms in Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/realms.html#creating-realms">Creating realms</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/realms.html#using-unique-link-generator">Using unique link generator</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/realms.html#subdomains">Subdomains</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/realms.html#working-with-subdomains-in-development-environment">Working with subdomains in development environment</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/management-commands.html">Management commands</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/management-commands.html#writing-management-commands">Writing management commands</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/schema-migrations.html">Schema migrations</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/schema-migrations.html#automated-testing-for-migrations">Automated testing for migrations</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/schema-migrations.html#schema-and-initial-data-changes">Schema and initial data changes</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/hashchange-system.html">URL hashes and deep linking</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/hashchange-system.html#hashchange">Hashchange</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/hashchange-system.html#server-initiated-reloads">Server-initiated reloads</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/hashchange-system.html#all-reloads">All reloads</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/emoji.html">Emoji</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/emoji.html#emoji-codes">Emoji codes</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/emoji.html#custom-emoji">Custom emoji</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/emoji.html#tooling">Tooling</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/emoji.html#picking-emoji-names">Picking emoji names</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/onboarding-steps.html">Onboarding Steps</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/onboarding-steps.html#configuring-a-new-onboarding-step">Configuring a New Onboarding Step</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/onboarding-steps.html#step-1-add-the-onboarding-step-name">Step 1: Add the Onboarding Step Name</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/onboarding-steps.html#step-2-display-the-onboarding-step">Step 2: Display the Onboarding Step</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/onboarding-steps.html#step-3-mark-the-onboarding-step-as-read">Step 3: Mark the Onboarding Step as Read</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/full-text-search.html">Full-text search</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/full-text-search.html#the-default-full-text-search-implementation">The default full-text search implementation</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/full-text-search.html#multi-language-full-text-search">Multi-language full-text search</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/full-text-search.html#enabling-pgroonga">Enabling PGroonga</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/full-text-search.html#disabling-pgroonga">Disabling PGroonga</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/email.html">Email</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/email.html#development-and-testing">Development and testing</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/email.html#testing-in-a-real-email-client">Testing in a real email client</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/email.html#notes">Notes</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/email.html#email-templates">Email templates</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/analytics.html">Analytics</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#analytics-backend-overview">Analytics backend overview</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#the-count-database-tables">The <code class="docutils literal notranslate"><span class="pre">*Count</span></code> database tables</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#countstats">CountStats</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#the-fillstate-table">The FillState table</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#performance-strategy">Performance strategy</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#backend-testing">Backend testing</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#loggingcountstats">LoggingCountStats</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/analytics.html#analytics-ui-development-and-testing">Analytics UI development and testing</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/analytics.html#setup-and-testing">Setup and testing</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/analytics.html#adding-or-editing-stats-graphs">Adding or editing /stats graphs</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/analytics.html#activity-page">/activity page</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/client.html">Clients in Zulip</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/client.html#analytics">Analytics</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/client.html#integrations">Integrations</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/logging.html">Logging and error reporting</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/logging.html#backend-error-reporting">Backend error reporting</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/logging.html#sentry-error-logging">Sentry error logging</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/logging.html#backend-logging">Backend logging</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/logging.html#blueslip-frontend-error-reporting">Blueslip frontend error reporting</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/logging.html#sentry-javascript-error-logging">Sentry JavaScript error logging</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/logging.html#frontend-performance-reporting">Frontend performance reporting</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/typing-indicators.html">Typing indicators</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#privacy-settings">Privacy settings</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#writing-user">Writing user</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#server">Server</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#receiving-user">Receiving user</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#ecosystem">Ecosystem</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/typing-indicators.html#roadmap">Roadmap</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/django-upgrades.html">Upgrading Django</a></li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/release-checklist.html">Zulip server release checklist</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/release-checklist.html#a-week-before-the-release">A week before the release</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/release-checklist.html#final-release-preparation">Final release preparation</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/release-checklist.html#executing-the-release">Executing the release</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/release-checklist.html#post-release">Post-release</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/api-release-checklist.html">Zulip PyPI packages release checklist</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/api-release-checklist.html#other-pypi-packages-maintained-by-zulip">Other PyPI packages maintained by Zulip</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/input-pills.html">UI: input pills</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/input-pills.html#setup">Setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/input-pills.html#basic-usage">Basic usage</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/input-pills.html#typeahead">Typeahead</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/input-pills.html#onpillcreate-and-onpillremove-methods"><code class="docutils literal notranslate"><span class="pre">onPillCreate</span></code> and <code class="docutils literal notranslate"><span class="pre">onPillRemove</span></code> methods</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/presence.html">Presence</a></li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/unread_messages.html">Unread message synchronization</a></li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/billing.html">Billing (Development)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/billing.html#common-setup">Common setup</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/billing.html#manual-testing">Manual testing</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/billing.html#setup">Setup</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/billing.html#test-card-numbers">Test card numbers</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/billing.html#flows-to-test">Flows to test</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/billing.html#upgrading-stripe-api-versions">Upgrading Stripe API versions</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/billing.html#writing-tests">Writing tests</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/widgets.html">Widgets</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/widgets.html#what-is-a-widget">What is a widget?</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/widgets.html#me-messages"><code class="docutils literal notranslate"><span class="pre">/me</span></code> messages</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/widgets.html#polls-todo-lists-and-games">Polls, todo lists, and games</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/widgets.html#data-flow">Data flow</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/widgets.html#backward-compatibility">Backward compatibility</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/widgets.html#adding-widgets">Adding widgets</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/widgets.html#zform-trivia-quiz-bot">zform (trivia quiz bot)</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/widgets.html#id1">Data flow</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/slash-commands.html">Slash commands</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/slash-commands.html#data-flow">Data flow</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/slash-commands.html#typeahead">Typeahead</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../subsystems/thumbnailing.html">Thumbnailing</a><ul> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#libvips">libvips</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#avatars">Avatars</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#emoji">Emoji</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#realm-logos">Realm logos</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#realm-icons">Realm icons</a></li> <li class="toctree-l3"><a class="reference internal" href="../subsystems/thumbnailing.html#file-uploads">File uploads</a><ul> <li class="toctree-l4"><a class="reference internal" href="../subsystems/thumbnailing.html#images">Images</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/thumbnailing.html#migrations">Migrations</a></li> <li class="toctree-l4"><a class="reference internal" href="../subsystems/thumbnailing.html#videos-and-pdfs">Videos and PDFs</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../documentation/index.html">Writing documentation</a><ul> <li class="toctree-l2"><a class="reference internal" href="../documentation/overview.html">Documentation systems</a><ul> <li class="toctree-l3"><a class="reference internal" href="../documentation/overview.html#developer-and-sysadmin-documentation">Developer and sysadmin documentation</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/overview.html#core-website-documentation">Core website documentation</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/overview.html#user-facing-documentation">User-facing documentation</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/overview.html#help-center-documentation">Help center documentation</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/overview.html#integrations-documentation">Integrations documentation</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/overview.html#api-documentation">API documentation</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../documentation/overview.html#automated-testing">Automated testing</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../documentation/helpcenter.html">Writing help center articles</a><ul> <li class="toctree-l3"><a class="reference internal" href="../documentation/helpcenter.html#guide-to-writing-help-center-articles">Guide to writing help center articles</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#getting-started">Getting started</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#updating-an-existing-article">Updating an existing article</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#adding-a-new-article">Adding a new article</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#redirecting-an-existing-article">Redirecting an existing article</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../documentation/helpcenter.html#writing-style">Writing style</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#user-interface">User interface</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#voice">Voice</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#keyboard-shortcuts">Keyboard shortcuts</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../documentation/helpcenter.html#markdown-features">Markdown features</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#images">Images</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#icons">Icons</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#macros">Macros</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#tips-and-warnings">Tips and warnings</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/helpcenter.html#tab-switcher">Tab switcher</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../documentation/integrations.html">Documenting an integration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../documentation/integrations.html#markdown-macros">Markdown macros</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/integrations.html#writing-guidelines">Writing guidelines</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/integrations.html#general-writing-guidelines">General writing guidelines</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/integrations.html#guidelines-for-specific-steps">Guidelines for specific steps</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/integrations.html#screenshots">Screenshots</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../documentation/api.html">Documenting REST API endpoints</a><ul> <li class="toctree-l3"><a class="reference internal" href="../documentation/api.html#how-it-works">How it works</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#title-and-description">Title and description</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#usage-examples">Usage examples</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#parameters">Parameters</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#response-with-examples">Response with examples</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../documentation/api.html#step-by-step-guide">Step by step guide</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/api.html#why-a-custom-system">Why a custom system?</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/api.html#debugging-schema-validation-errors">Debugging schema validation errors</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#deconstructing-the-error-output">Deconstructing the error output</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/api.html#adding-a-realm-setting">Adding a realm setting</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../documentation/openapi.html">OpenAPI configuration</a><ul> <li class="toctree-l3"><a class="reference internal" href="../documentation/openapi.html#working-with-the-zulip-yaml-file">Working with the <code class="docutils literal notranslate"><span class="pre">zulip.yaml</span></code> file</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/openapi.html#configuration">Configuration</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/openapi.html#endpoint-definitions">Endpoint definitions</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/openapi.html#schemas">Schemas</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../documentation/openapi.html#zulip-swagger-yaml-style">Zulip Swagger YAML style:</a></li> <li class="toctree-l3"><a class="reference internal" href="../documentation/openapi.html#tips-for-working-with-yaml">Tips for working with YAML:</a><ul> <li class="toctree-l4"><a class="reference internal" href="../documentation/openapi.html#formatting-help">Formatting help:</a></li> <li class="toctree-l4"><a class="reference internal" href="../documentation/openapi.html#examples">Examples:</a></li> </ul> </li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../translating/index.html">Translating Zulip</a><ul> <li class="toctree-l2"><a class="reference internal" href="../translating/translating.html">Translation guidelines</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/translating.html#translators-workflow">Translators’ workflow</a><ul> <li class="toctree-l4"><a class="reference internal" href="../translating/translating.html#testing-translations">Testing translations</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/translating.html#machine-translation">Machine translation</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/translating.html#translation-style-guides">Translation style guides</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/translating.html#capitalization">Capitalization</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/internationalization.html">Internationalization for developers</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#key-details-about-human-language">Key details about human language</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#translation-process">Translation process</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#translation-resource-files">Translation resource files</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#html-templates">HTML Templates</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#backend-translations">Backend translations</a><ul> <li class="toctree-l4"><a class="reference internal" href="../translating/internationalization.html#jinja2-templates">Jinja2 templates</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/internationalization.html#python">Python</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#frontend-translations">Frontend translations</a><ul> <li class="toctree-l4"><a class="reference internal" href="../translating/internationalization.html#handlebars-templates">Handlebars templates</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#transifex-config">Transifex config</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/internationalization.html#transifex-cli-setup">Transifex CLI setup</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/chinese.html">Chinese translation style guide(中文翻译指南)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/chinese.html#note">Note(题记)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/chinese.html#terms">Terms(术语)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/chinese.html#phrases">Phrases(习惯用语)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/chinese.html#others">Others(其它)</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/finnish.html">Finnish translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/finnish.html#guidelines">Guidelines</a><ul> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#word-order">Word order</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#grammatical-case-sijamuodot">Grammatical case (Sijamuodot)</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#loan-word-lainasanat">Loan word (Lainasanat)</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#please-in-error-messages"><strong><em>Please</em></strong>, in error messages</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#zulip-word-inflection">Zulip word inflection</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#your-expression">Your -expression</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/finnish.html#comma">Comma</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../translating/finnish.html#terms">Terms</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/finnish.html#other">Other</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/french.html">French translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/french.html#community">Community</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/french.html#rules">Rules</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/french.html#terms">Terms</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/german.html">German translation style guide (Richtlinien für die deutsche Übersetzung)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/german.html#rules">Rules</a><ul> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#formal-or-informal">Formal or informal?</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#gender-inclusive-language">Gender-inclusive language</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#form-of-address">Form of address</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#form-of-instruction">Form of instruction</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#rules-for-labels">Rules for labels</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#concatenation-of-words">Concatenation of words</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#anglicisms">Anglicisms</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#special-characters">Special characters</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#false-friends">False friends</a></li> <li class="toctree-l4"><a class="reference internal" href="../translating/german.html#other">Other</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../translating/german.html#terms-begriffe">Terms (Begriffe)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/german.html#phrases-ausdrucke">Phrases (Ausdrücke)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/german.html#other-verschiedenes">Other (Verschiedenes)</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/hindi.html">Hindi translation style guide (हिन्दी अनुवाद शैली मार्गदर्शक)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/hindi.html#terms">Terms (शर्तें)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/hindi.html#phrases">Phrases (वाक्यांश)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/hindi.html#others">Others (अन्य)</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/japanese.html">Japanese translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/japanese.html#rules">Rules</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/japanese.html#terms">Terms</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/polish.html">Polish translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/polish.html#special-terms-used-in-zulip">Special terms used in Zulip</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/russian.html">Russian translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/russian.html#id1">Перевод некоторых терминов</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/spanish.html">Spanish translation style guide</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/spanish.html#terminos">Términos</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/spanish.html#frases">Frases</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/spanish.html#otros">Otros</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../translating/urdu.html">Urdu translation style guide(انداذِ ترجمہ کا رہنما)</a><ul> <li class="toctree-l3"><a class="reference internal" href="../translating/urdu.html#terms">Terms(اصطلاحات)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/urdu.html#phrases">Phrases (فِقْرے)</a></li> <li class="toctree-l3"><a class="reference internal" href="../translating/urdu.html#others">Others(مختلف دیگر)</a></li> </ul> </li> </ul> </li> </ul> <ul> <li class="toctree-l1"><a class="reference internal" href="../outreach/index.html">Outreach programs</a><ul> <li class="toctree-l2"><a class="reference internal" href="../outreach/overview.html">Outreach programs overview</a><ul> <li class="toctree-l3"><a class="reference internal" href="../outreach/overview.html#about-zulip">About Zulip</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/overview.html#outreach-program-experience">Outreach program experience</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../outreach/apply.html">How to apply</a><ul> <li class="toctree-l3"><a class="reference internal" href="../outreach/apply.html#application-criteria">Application criteria</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/apply.html#getting-started">Getting started</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/apply.html#putting-together-your-application">Putting together your application</a><ul> <li class="toctree-l4"><a class="reference internal" href="../outreach/apply.html#what-to-include">What to include</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/apply.html#project-proposals">Project proposals</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/apply.html#circulating-your-application-for-feedback">Circulating your application for feedback</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../outreach/experience.html">How to have an amazing experience</a><ul> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#your-goals">Your goals</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#you-and-your-mentor">You and your mentor</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#communication-and-check-ins">Communication and check-ins</a><ul> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#getting-feedback-and-advice">Getting feedback and advice</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#how-to-post-your-check-ins">How to post your check-ins</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#peer-reviews">Peer reviews</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#how-do-i-figure-out-what-to-work-on">How do I figure out what to work on?</a><ul> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#prioritization">Prioritization</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#what-about-my-proposal">What about my proposal?</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#tips-for-finding-issues-to-pick-up">Tips for finding issues to pick up</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/experience.html#staying-productive">Staying productive</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#how-else-can-i-contribute">How else can I contribute?</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/experience.html#timeline-extensions-for-gsoc">Timeline extensions for GSoC</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../outreach/gsoc.html">GSoC project ideas</a><ul> <li class="toctree-l3"><a class="reference internal" href="../outreach/gsoc.html#project-size">Project size</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/gsoc.html#focus-areas">Focus areas</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/gsoc.html#project-ideas-by-area">Project ideas by area</a><ul> <li class="toctree-l4"><a class="reference internal" href="../outreach/gsoc.html#full-stack-and-web-frontend-focused-projects">Full stack and web frontend focused projects</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/gsoc.html#terminal-app">Terminal app</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/gsoc.html#desktop-app">Desktop app</a></li> <li class="toctree-l4"><a class="reference internal" href="../outreach/gsoc.html#mobile-app">Mobile app</a></li> </ul> </li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../outreach/mentoring.html">Mentoring</a><ul> <li class="toctree-l3"><a class="reference internal" href="../outreach/mentoring.html#who-can-mentor">Who can mentor</a></li> <li class="toctree-l3"><a class="reference internal" href="../outreach/mentoring.html#supporting-your-mentee">Supporting your mentee</a><ul> <li class="toctree-l4"><a class="reference internal" href="../outreach/mentoring.html#establishing-communication-patterns">Establishing communication patterns</a></li> </ul> </li> <li class="toctree-l3"><a class="reference internal" href="../outreach/mentoring.html#managing-challenges">Managing challenges</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference external" href="https://zulip.readthedocs.io/en/latest/">Index</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="../index.html">Zulip</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li> <li class="breadcrumb-item"><a href="index.html">Contributing to Zulip</a></li> <li class="breadcrumb-item active">Contributing guide</li> <li class="wy-breadcrumbs-aside"> <a href="../_sources/contributing/contributing.md.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <section id="contributing-guide"> <h1>Contributing guide<a class="headerlink" href="#contributing-guide" title="Link to this heading"></a></h1> <p>Welcome to the Zulip community!</p> <section id="zulip-development-community"> <h2>Zulip development community<a class="headerlink" href="#zulip-development-community" title="Link to this heading"></a></h2> <p>The primary communication forum for the Zulip community is the Zulip server hosted at <a class="reference external" href="https://chat.zulip.org/">chat.zulip.org</a>:</p> <ul class="simple"> <li><p><strong>Users</strong> and <strong>administrators</strong> of Zulip organizations stop by to ask questions, offer feedback, and participate in product design discussions.</p></li> <li><p><strong>Contributors to the project</strong>, including the <strong>core Zulip development team</strong>, discuss ongoing and future projects, brainstorm ideas, and generally help each other out.</p></li> </ul> <p>Everyone is welcome to <a class="reference external" href="https://chat.zulip.org/">sign up</a> and participate — we love hearing from our users! Public streams in the community receive thousands of messages a week. We recommend signing up using the special invite links for <a class="reference external" href="https://chat.zulip.org/join/t5crtoe62bpcxyisiyglmtvb/">users</a>, <a class="reference external" href="https://chat.zulip.org/join/wnhv3jzm6afa4raenedanfno/">self-hosters</a> and <a class="reference external" href="https://chat.zulip.org/join/npzwak7vpmaknrhxthna3c7p/">contributors</a> to get a curated list of initial stream subscriptions.</p> <p>To learn how to get started participating in the community, including <a class="reference external" href="https://zulip.com/development-community/#community-norms">community norms</a> and <a class="reference external" href="https://zulip.com/development-community/#where-do-i-send-my-message">where to post</a>, check out our <a class="reference external" href="https://zulip.com/development-community/">Zulip development community guide</a>. The Zulip community is governed by a <a class="reference external" href="https://zulip.readthedocs.io/en/latest/code-of-conduct.html">code of conduct</a>.</p> </section> <section id="ways-to-contribute"> <h2>Ways to contribute<a class="headerlink" href="#ways-to-contribute" title="Link to this heading"></a></h2> <p>To make a code or documentation contribution, read our <a class="reference internal" href="#your-first-codebase-contribution">step-by-step guide</a> to getting started with the Zulip codebase. A small sample of the type of work that needs doing:</p> <ul class="simple"> <li><p>Bug squashing and feature development on our Python/Django <a class="reference external" href="https://github.com/zulip/zulip">backend</a>, web <a class="reference external" href="https://github.com/zulip/zulip">frontend</a>, Flutter <a class="reference external" href="https://github.com/zulip/zulip-flutter">mobile app</a> in beta, or Electron <a class="reference external" href="https://github.com/zulip/zulip-desktop">desktop app</a>.</p></li> <li><p>Building out our <a class="reference external" href="https://github.com/zulip/python-zulip-api">Python API and bots</a> framework.</p></li> <li><p><a class="reference external" href="https://zulip.com/api/integrations-overview">Writing an integration</a>.</p></li> <li><p>Improving our <a class="reference external" href="https://zulip.com/help/">user</a> or <a class="reference external" href="https://zulip.readthedocs.io/en/latest/">developer</a> documentation.</p></li> <li><p><a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html">Reviewing code</a> and manually testing pull requests.</p></li> </ul> <p><strong>Non-code contributions</strong>: Some of the most valuable ways to contribute don’t require touching the codebase at all. For example, you can:</p> <ul class="simple"> <li><p>Report issues, including both <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html">feature requests</a> and <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html">bug reports</a>.</p></li> <li><p><a class="reference internal" href="#user-feedback">Give feedback</a> if you are evaluating or using Zulip.</p></li> <li><p><a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/design-discussions.html">Participate thoughtfully</a> in design discussions.</p></li> <li><p><a class="reference external" href="https://github.com/sponsors/zulip">Sponsor Zulip</a> through the GitHub sponsors program.</p></li> <li><p><a class="reference external" href="https://zulip.readthedocs.io/en/latest/translating/translating.html">Translate</a> Zulip into your language.</p></li> <li><p><a class="reference internal" href="#stay-connected">Stay connected</a> with Zulip, and <a class="reference internal" href="#help-others-find-zulip">help others find us</a>.</p></li> </ul> </section> <section id="your-first-codebase-contribution"> <h2>Your first codebase contribution<a class="headerlink" href="#your-first-codebase-contribution" title="Link to this heading"></a></h2> <p>This section has a step by step guide to starting as a Zulip codebase contributor. It’s long, but don’t worry about doing all the steps perfectly; no one gets it right the first time, and there are a lot of people available to help.</p> <ul class="simple"> <li><p>First, make an account on the <a class="reference external" href="https://zulip.com/development-community/">Zulip community server</a>, paying special attention to the <a class="reference external" href="https://zulip.com/development-community/#community-norms">community norms</a>. If you’d like, introduce yourself in <a class="reference external" href="https://chat.zulip.org/#narrow/channel/95-new-members">#new members</a>, using your name as the topic. Bonus: tell us about your first impressions of Zulip, and anything that felt confusing/broken or interesting/helpful as you started using the product.</p></li> <li><p>Read <a class="reference internal" href="#what-makes-a-great-zulip-contributor">What makes a great Zulip contributor</a>.</p></li> <li><p>Set up the development environment for the Zulip codebase you want to work on, and start getting familiar with the code.</p> <ul> <li><p>For the server and web app:</p> <ul> <li><p><a class="reference external" href="https://zulip.readthedocs.io/en/latest/development/overview.html">Install the development environment</a>, getting help in <a class="reference external" href="https://chat.zulip.org/#narrow/channel/21-provision-help">#provision help</a> if you run into any troubles.</p></li> <li><p>Familiarize yourself with <a class="reference external" href="https://zulip.readthedocs.io/en/latest/development/using.html">using the development environment</a>.</p></li> <li><p>Go through the <a class="reference external" href="https://zulip.readthedocs.io/en/latest/tutorials/new-feature-tutorial.html">new application feature tutorial</a> to get familiar with how the Zulip codebase is organized and how to find code in it.</p></li> </ul> </li> <li><p>For the upcoming Flutter-based mobile app:</p> <ul> <li><p>Set up a development environment following the instructions in <a class="reference external" href="https://github.com/zulip/zulip-flutter">the project README</a>.</p></li> <li><p>Start reading recent commits to see the code we’re writing. Use either a <a class="reference external" href="https://zulip.readthedocs.io/en/latest/git/setup.html#get-a-graphical-client">graphical Git viewer</a> like <code class="docutils literal notranslate"><span class="pre">gitk</span></code>, or <code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">log</span> <span class="pre">-p</span></code> with <a class="reference external" href="https://github.com/zulip/zulip-mobile/blob/main/docs/howto/git.md#git-log-secret">the “secret” to reading its output</a>.</p></li> <li><p>Pick some of the code that appears in those Git commits and that looks interesting. Use your IDE to visit that code and to navigate to related code, reading to see how it works and how the codebase is organized.</p></li> </ul> </li> </ul> </li> <li><p>Read the <a class="reference external" href="https://zulip.readthedocs.io/en/latest/git/index.html">Zulip guide to Git</a> if you are unfamiliar with Git or Zulip’s rebase-based Git workflow, getting help in <a class="reference external" href="https://chat.zulip.org/#narrow/channel/44-git-help">#git help</a> if you run into any troubles. Even Git experts should read the <a class="reference external" href="https://zulip.readthedocs.io/en/latest/git/zulip-tools.html">Zulip-specific Git tools page</a>.</p></li> </ul> <section id="where-to-look-for-an-issue"> <h3>Where to look for an issue<a class="headerlink" href="#where-to-look-for-an-issue" title="Link to this heading"></a></h3> <p>Now you’re ready to pick your first issue! Zulip has several repositories you can check out, depending on your interests. There are hundreds of open issues in the <a class="reference external" href="https://github.com/zulip/zulip/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">main Zulip server and web app repository</a> alone.</p> <p>You can look through issues tagged with the “help wanted” label, which is used to indicate the issues that are open for contributions. You’ll be able to claim unassigned issues, which you can find using the <code class="docutils literal notranslate"><span class="pre">no:assignee</span></code> filter in GitHub. You can also pick up issues that are assigned but are no longer being worked on.</p> <p>Some repositories use the “good first issue” label to tag issues that are especially approachable for new contributors.</p> <p>Here are some handy links for issues to look through:</p> <ul class="simple"> <li><p><a class="reference external" href="https://github.com/zulip/zulip/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">Server and web app</a></p></li> <li><p>Mobile apps: no “help wanted” label, but see the <a class="reference external" href="https://github.com/orgs/zulip/projects/5/views/4">project board</a> for the upcoming Flutter-based app. Look for issues up through the “Launch” milestone, and that aren’t already assigned.</p></li> <li><p><a class="reference external" href="https://github.com/zulip/zulip-desktop/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">Desktop app</a></p></li> <li><p><a class="reference external" href="https://github.com/zulip/zulip-terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">Terminal app</a></p></li> <li><p><a class="reference external" href="https://github.com/zulip/python-zulip-api/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">Python API bindings and bots</a></p></li> </ul> </section> <section id="picking-an-issue-to-work-on"> <h3>Picking an issue to work on<a class="headerlink" href="#picking-an-issue-to-work-on" title="Link to this heading"></a></h3> <p>There’s a lot to learn while making your first pull request, so start small! Many first contributions have fewer than 10 lines of changes (not counting changes to tests).</p> <p>We recommend the following process for finding an issue to work on:</p> <ol class="arabic simple"> <li><p>Find an issue tagged with the “help wanted” label that is either unassigned, or looks to be abandoned.</p></li> <li><p>Read the description of the issue and make sure you understand it.</p></li> <li><p>If it seems promising, poke around the product (on <a class="reference external" href="https://chat.zulip.org">chat.zulip.org</a> or in the development environment) until you know how the piece being described fits into the bigger picture. If after some exploration the description seems confusing or ambiguous, post a question on the GitHub issue, as others may benefit from the clarification as well.</p></li> <li><p>When you find an issue you like, try to get started working on it. See if you can find the part of the code you’ll need to modify (<code class="docutils literal notranslate"><span class="pre">git</span> <span class="pre">grep</span></code> is your friend!) and get some idea of how you’ll approach the problem.</p></li> <li><p>If you feel lost, that’s OK! Go through these steps again with another issue. There’s plenty to work on, and the exploration you do will help you learn more about the project.</p></li> </ol> <p>An assigned issue can be considered abandoned if:</p> <ul class="simple"> <li><p>There is no recent contributor activity.</p></li> <li><p>There are no open PRs, or an open PR needs work in order to be ready for review. For example, a PR may need to be updated to address reviewer feedback or to pass tests.</p></li> </ul> <p>Note that you are <em>not</em> claiming an issue while you are iterating through steps 1-4. <em>Before you claim an issue</em>, you should be confident that you will be able to tackle it effectively.</p> <p>Additional tips for the <a class="reference external" href="https://github.com/zulip/zulip/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">main server and web app repository</a>:</p> <ul class="simple"> <li><p>We especially recommend browsing recently opened issues, as there are more likely to be easy ones for you to find.</p></li> <li><p>Take a look at issues with the <a class="reference external" href="https://github.com/zulip/zulip/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">“good first issue” label</a>, as they are especially accessible to new contributors. However, you will likely find issues without this label that are accessible as well.</p></li> <li><p>All issues are partitioned into areas like admin, compose, emoji, hotkeys, i18n, onboarding, search, etc. Look through our <a class="reference external" href="https://github.com/zulip/zulip/labels">list of labels</a>, and click on some of the <code class="docutils literal notranslate"><span class="pre">area:</span></code> labels to see all the issues related to your areas of interest.</p></li> <li><p>Avoid issues with the “difficult” label unless you understand why it is difficult and are highly confident you can resolve the issue correctly and completely.</p></li> </ul> </section> <section id="claiming-an-issue"> <h3>Claiming an issue<a class="headerlink" href="#claiming-an-issue" title="Link to this heading"></a></h3> <section id="in-the-main-server-web-app-repository-and-zulip-terminal-repository"> <h4>In the main server/web app repository and Zulip Terminal repository<a class="headerlink" href="#in-the-main-server-web-app-repository-and-zulip-terminal-repository" title="Link to this heading"></a></h4> <p>The Zulip server/web app repository (<a class="reference external" href="https://github.com/zulip/zulip/"><code class="docutils literal notranslate"><span class="pre">zulip/zulip</span></code></a>) and the Zulip Terminal repository (<a class="reference external" href="https://github.com/zulip/zulip-terminal/"><code class="docutils literal notranslate"><span class="pre">zulip/zulip-terminal</span></code></a>) are set up with a GitHub workflow bot called <a class="reference external" href="https://github.com/zulip/zulipbot">Zulipbot</a>, which manages issues and pull requests in order to create a better workflow for Zulip contributors.</p> <p>To claim an issue in these repositories, simply post a comment that says <code class="docutils literal notranslate"><span class="pre">@zulipbot</span> <span class="pre">claim</span></code> to the issue thread. If the issue is <a class="reference external" href="https://github.com/zulip/zulip/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+no%3Aassignee">tagged with a help wanted label and is not assigned to someone else</a>, Zulipbot will immediately assign the issue to you.</p> <p>Note that new contributors can only claim one issue until their first pull request is merged. This is to encourage folks to finish ongoing work before starting something new. If you would like to pick up a new issue while waiting for review on an almost-ready pull request, you can post a comment to this effect on the issue you’re interested in.</p> </section> <section id="in-other-zulip-repositories"> <h4>In other Zulip repositories<a class="headerlink" href="#in-other-zulip-repositories" title="Link to this heading"></a></h4> <p>There is no bot for other Zulip repositories (<a class="reference external" href="https://github.com/zulip/zulip-flutter/"><code class="docutils literal notranslate"><span class="pre">zulip/zulip-flutter</span></code></a>, etc.). If you are interested in claiming an issue in one of these repositories, simply post a comment on the issue thread saying that you’ve started work on the issue and would like to claim it. In your comment, describe what part of the code you’re modifying and how you plan to approach the problem, based on what you learned in steps 1–4 <a class="reference internal" href="#picking-an-issue-to-work-on">above</a>.</p> <p>There is no need to @-mention the issue creator in your comment. There is also no need to post the same information in multiple places, for example in a chat thread in addition to the GitHub issue.</p> <p>Please follow the same guidelines as described above: find an issue labeled “help wanted”, and only pick up one issue at a time to start with.</p> </section> </section> <section id="working-on-an-issue"> <h3>Working on an issue<a class="headerlink" href="#working-on-an-issue" title="Link to this heading"></a></h3> <p>You’re encouraged to ask questions on how to best implement or debug your changes – the Zulip maintainers are excited to answer questions to help you stay unblocked and working efficiently. You can ask questions in the <a class="reference external" href="https://zulip.com/development-community/">Zulip development community</a>, or on the GitHub issue or pull request.</p> <p>To get early feedback on any UI changes, we encourage you to post screenshots of your work in the <a class="reference external" href="https://chat.zulip.org/#narrow/channel/101-design">#design stream</a> in the <a class="reference external" href="https://zulip.com/development-community/">Zulip development community</a></p> <p>For more advice, see <a class="reference internal" href="#what-makes-a-great-zulip-contributor">What makes a great Zulip contributor?</a> below. It’s OK if your first issue takes you a while; that’s normal! You’ll be able to work a lot faster as you build experience.</p> </section> <section id="submitting-a-pull-request"> <h3>Submitting a pull request<a class="headerlink" href="#submitting-a-pull-request" title="Link to this heading"></a></h3> <p>See the <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/reviewable-prs.html">guide on submitting a pull request</a> for detailed instructions on how to present your proposed changes to Zulip.</p> <p>The <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/review-process.html">pull request review process guide</a> explains the stages of review your PR will go through, and offers guidance on how to help the review process move forward.</p> </section> <section id="beyond-the-first-issue"> <h3>Beyond the first issue<a class="headerlink" href="#beyond-the-first-issue" title="Link to this heading"></a></h3> <p>To find a second issue to work on, we recommend looking through issues with the same <code class="docutils literal notranslate"><span class="pre">area:</span></code> label as the last issue you resolved. You’ll be able to reuse the work you did learning how that part of the codebase works. Also, the path to becoming a core developer often involves taking ownership of one of these area labels.</p> </section> <section id="common-questions"> <h3>Common questions<a class="headerlink" href="#common-questions" title="Link to this heading"></a></h3> <ul class="simple"> <li><p><strong>What if somebody is already working on the issue I want to claim?</strong> There are lots of issue to work on! If somebody else is actively working on the issue, you can find a different one, or help with reviewing their work.</p></li> <li><p><strong>What if somebody else claims an issue while I’m figuring out whether or not to work on it?</strong> No worries! You can contribute by providing feedback on their pull request. If you’ve made good progress in understanding part of the codebase, you can also find another “help wanted” issue in the same area to work on.</p></li> <li><p><strong>What if there is already a pull request for the issue I want to work on?</strong> See our <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/continuing-unfinished-work.html">guide on continuing unfinished work</a>.</p></li> <li><p><strong>What if I ask if someone is still working on an issue, and they don’t respond?</strong> If you don’t get a reply within 2-3 days, go ahead and post a comment that you are working on the issue, and submit a pull request. If the original assignee ends up submitting a pull request first, no worries! You can help by providing feedback on their work, or submit your own PR if you think a different approach is needed (as described above).</p></li> <li><p><strong>Can I come up with my own feature idea and work on it?</strong> We welcome suggestions of features or other improvements that you feel would be valuable. If you have a new feature you’d like to add, you can start a conversation <a class="reference external" href="https://zulip.com/development-community/#where-do-i-send-my-message">in our development community</a> explaining the feature idea and the problem that you’re hoping to solve.</p></li> <li><p><strong>I’m waiting for the next round of review on my PR. Can I pick up another issue in the meantime?</strong> Someone’s first Zulip PR often requires quite a bit of iteration, so please <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/reviewable-prs.html">make sure your pull request is reviewable</a> and go through at least one round of feedback from others before picking up a second issue. After that, sure! If <a class="reference external" href="https://github.com/zulip/zulipbot">Zulipbot</a> does not allow you to claim an issue, you can post a comment describing the status of your other work on the issue you’re interested in (including links to all open PRs), and asking for the issue to be assigned to you. Note that addressing feedback on in-progress PRs should always take priority over starting a new PR.</p></li> <li><p><strong>I think my PR is done, but it hasn’t been merged yet. What’s going on?</strong></p> <ol class="arabic simple"> <li><p><strong>Double-check that you have addressed all the feedback</strong>, including any comments on <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/commit-discipline.html">Git commit discipline</a>.</p></li> <li><p>If all the feedback has been addressed, did you <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/review-process.html#how-to-help-move-the-review-process-forward">leave a comment</a> explaining that you have done so and <strong>requesting another review</strong>? If not, it may not be clear to project maintainers or reviewers that your PR is ready for another look.</p></li> <li><p>There may be a pause between initial rounds of review for your PR and final review by project maintainers. This is normal, and we encourage you to <strong>work on other issues</strong> while you wait.</p></li> <li><p>If you think the PR is ready and haven’t seen any updates for a couple of weeks, it can be helpful to <strong>leave another comment</strong>. Summarize the overall state of the review process and your work, and indicate that you are waiting for a review.</p></li> <li><p>Finally, <strong>Zulip project maintainers are people too</strong>! They may be busy with other work, and sometimes they might even take a vacation. ;) It can occasionally take a few weeks for a PR in the final stages of the review process to be merged.</p></li> </ol> </li> </ul> </section> </section> <section id="what-makes-a-great-zulip-contributor"> <h2>What makes a great Zulip contributor?<a class="headerlink" href="#what-makes-a-great-zulip-contributor" title="Link to this heading"></a></h2> <p>Zulip has a lot of experience working with new contributors. In our experience, these are the best predictors of success:</p> <ul class="simple"> <li><p><a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/asking-great-questions.html">Asking great questions</a>. It’s very hard to answer a general question like, “How do I do this issue?” When asking for help, explain your current understanding, including what you’ve done or tried so far and where you got stuck. Post tracebacks or other error messages if appropriate. For more advice, check out <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/asking-great-questions.html">our guide</a>!</p></li> <li><p>Learning and practicing <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/commit-discipline.html">Git commit discipline</a>.</p></li> <li><p>Submitting carefully tested code. See our <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/code-reviewing.html#how-to-review-code">detailed guide on how to review code</a> (yours or someone else’s).</p></li> <li><p>Posting <a class="reference external" href="https://zulip.readthedocs.io/en/latest/tutorials/screenshot-and-gif-software.html">screenshots or GIFs</a> for frontend changes.</p></li> <li><p>Working to <a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/reviewable-prs.html">make your pull requests easy to review</a>.</p></li> <li><p>Clearly describing what you have implemented and why. For example, if your implementation differs from the issue description in some way or is a partial step towards the requirements described in the issue, be sure to call out those differences.</p></li> <li><p>Being responsive to feedback on pull requests. This means incorporating or responding to all suggested changes, and leaving a note if you won’t be able to address things within a few days.</p></li> <li><p>Being helpful and friendly on the <a class="reference external" href="https://zulip.com/development-community/">Zulip community server</a>.</p></li> </ul> </section> <section id="user-feedback"> <h2>User feedback<a class="headerlink" href="#user-feedback" title="Link to this heading"></a></h2> <p>Nearly every feature we develop starts with a user request. If you are part of a group that is either using or considering using Zulip, we would love to hear about your experience with the product. If you’re not sure what to write, here are some questions we’re always very curious to know the answer to:</p> <ul class="simple"> <li><p>Evaluation: What is the process by which your organization chose or will choose a group chat product?</p></li> <li><p>Pros and cons: What are the pros and cons of Zulip for your organization, and the pros and cons of other products you are evaluating?</p></li> <li><p>Features: What are the features that are most important for your organization? In the best-case scenario, what would your chat solution do for you?</p></li> <li><p>Onboarding: If you remember it, what was your impression during your first few minutes of using Zulip? What did you notice, and how did you feel? Was there anything that stood out to you as confusing, or broken, or great?</p></li> <li><p>Organization: What does your organization do? How big is the organization? A link to your organization’s website?</p></li> </ul> <p>You can contact us in the <a class="reference external" href="https://chat.zulip.org/#narrow/channel/137-feedback">#feedback stream of the Zulip development community</a> or by emailing <a class="reference external" href="mailto:support%40zulip.com">support<span>@</span>zulip<span>.</span>com</a>.</p> </section> <section id="outreach-programs"> <h2>Outreach programs<a class="headerlink" href="#outreach-programs" title="Link to this heading"></a></h2> <p>Zulip regularly participates in <a class="reference external" href="https://developers.google.com/open-source/gsoc/">Google Summer of Code (GSoC)</a> and <a class="reference external" href="https://www.outreachy.org/">Outreachy</a>. We have been a GSoC mentoring organization since 2016, and we accept 15-20 GSoC participants each summer. In the past, we’ve also participated in <a class="reference external" href="https://developers.google.com/open-source/gci/">Google Code-In</a>, and hosted summer interns from Harvard, MIT, and Stanford.</p> <p>Check out our <a class="reference external" href="https://zulip.readthedocs.io/en/latest/outreach/overview.html">outreach programs overview</a> to learn more about participating in an outreach program with Zulip. Most of our program participants end up sticking around the project long-term, and many have become core team members, maintaining important parts of the project. We hope you apply!</p> </section> <section id="stay-connected"> <h2>Stay connected<a class="headerlink" href="#stay-connected" title="Link to this heading"></a></h2> <p>Even if you are not logging into the development community on a regular basis, you can still stay connected with the project.</p> <ul class="simple"> <li><p>Follow us <a class="reference external" href="https://twitter.com/zulip">on Twitter</a>.</p></li> <li><p>Subscribe to <a class="reference external" href="https://blog.zulip.org/">our blog</a>.</p></li> <li><p>Join or follow the project <a class="reference external" href="https://www.linkedin.com/company/zulip-project/">on LinkedIn</a>.</p></li> </ul> </section> <section id="help-others-find-zulip"> <h2>Help others find Zulip<a class="headerlink" href="#help-others-find-zulip" title="Link to this heading"></a></h2> <p>Here are some ways you can help others find Zulip:</p> <ul class="simple"> <li><p>Star us on GitHub. There are four main repositories: <a class="reference external" href="https://github.com/zulip/zulip">server/web</a>, <a class="reference external" href="https://github.com/zulip/zulip-flutter">Flutter mobile</a>, <a class="reference external" href="https://github.com/zulip/zulip-desktop">desktop</a>, and <a class="reference external" href="https://github.com/zulip/python-zulip-api">Python API</a>.</p></li> <li><p>“Like” and retweet <a class="reference external" href="https://twitter.com/zulip">our tweets</a>.</p></li> <li><p>Upvote and post feedback on Zulip on comparison websites. A couple specific ones to highlight:</p> <ul> <li><p><a class="reference external" href="https://alternativeto.net/software/zulip-chat-server/">AlternativeTo</a>. You can also <a class="reference external" href="https://alternativeto.net/software/slack/">upvote Zulip</a> on their page for Slack.</p></li> <li><p><a class="reference external" href="https://stackshare.io/zulip">Add Zulip to your stack</a> on StackShare, star it, and upvote the reasons why people like Zulip that you find most compelling.</p></li> </ul> </li> </ul> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="index.html" class="btn btn-neutral float-left" title="Contributing to Zulip" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="../code-of-conduct.html" class="btn btn-neutral float-right" title="Zulip Code of Conduct" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/> <div role="contentinfo"> <p>© Copyright 2012–2015 Dropbox, Inc., 2015–2021 Kandra Labs, Inc., and contributors.</p> </div> Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>