Logo
  • Zulip homepage
  • Overview
    • Zulip overview
      • Getting started
    • Zulip architectural overview
      • Key codebases
      • Usage assumptions and concepts
      • Components
        • Django and Tornado
        • nginx
        • Supervisor
        • memcached
        • Redis
        • RabbitMQ
        • PostgreSQL
        • Nagios
      • Glossary
    • Directory structure
      • Core Python files
      • HTML templates
      • JavaScript, TypeScript, and other frontend assets
      • Tests
      • Management commands
      • Scripts
      • API and bots
      • Production Puppet configuration
      • Additional Django apps
      • Jinja2 compatibility files
      • Translation files
      • Documentation
    • Release lifecycle
      • Server and web app versions
        • Stable releases
        • Git versions
        • What version am I running?
        • Versioned documentation
      • Client apps
        • Mobile app
        • Desktop app
        • Terminal app
      • Server and client app compatibility
        • Upgrade nag
      • Operating system support
      • API bindings
    • Roadmap
      • Server and web app roadmap
      • Mobile app roadmap
    • Version history
      • Zulip Server 12.x series (development)
      • Zulip Server 12.0
        • Upgrade notes for 12.0
      • Zulip Server 11.x series
        • Zulip Server 11.2
        • Zulip Server 11.1
        • Zulip Server 11.0
      • Zulip Server 10.x series
        • Zulip Server 10.4
        • Zulip Server 10.3
        • Zulip Server 10.2
        • Zulip Server 10.1
        • Zulip Server 10.0
      • Zulip Server 9.x series
        • Zulip Server 9.4
        • Zulip Server 9.3
        • Zulip Server 9.2
        • Zulip Server 9.1
        • Zulip Server 9.0
      • Zulip Server 8.x series
        • Zulip Server 8.5
        • Zulip Server 8.4
        • Zulip Server 8.3
        • Zulip Server 8.2
        • Zulip Server 8.1
        • Zulip Server 8.0
      • Zulip Server 7.x series
        • Zulip Server 7.5
        • Zulip Server 7.4
        • Zulip Server 7.3
        • Zulip Server 7.2
        • Zulip Server 7.1
        • Zulip Server 7.0
      • Zulip Server 6.x series
        • Zulip Server 6.2
        • Zulip Server 6.1
        • Zulip Server 6.0
      • Zulip Server 5.x series
        • Zulip Server 5.7
        • Zulip Server 5.6
        • Zulip Server 5.5
        • Zulip Server 5.4
        • Zulip Server 5.3
        • Zulip Server 5.2
        • Zulip Server 5.1
        • Zulip Server 5.0
      • Zulip Server 4.x series
        • Zulip Server 4.11
        • Zulip Server 4.10
        • Zulip Server 4.9
        • Zulip Server 4.8
        • Zulip Server 4.7
        • Zulip Server 4.6
        • Zulip Server 4.5
        • Zulip Server 4.4
        • Zulip Server 4.3
        • Zulip Server 4.2
        • Zulip Server 4.1
        • Zulip Server 4.0
      • Zulip Server 3.x series
        • Zulip Server 3.4
        • Zulip Server 3.3
        • Zulip Server 3.2
        • Zulip Server 3.1
        • Zulip Server 3.0
      • Zulip Server 2.1.x series
        • Zulip Server 2.1.8
        • Zulip Server 2.1.7
        • Zulip Server 2.1.6
        • Zulip Server 2.1.5
        • Zulip Server 2.1.4
        • Zulip Server 2.1.3
        • Zulip Server 2.1.2
        • Zulip Server 2.1.1
        • Zulip Server 2.1.0
      • Zulip Server 2.0.x series
        • Zulip Server 2.0.8
        • Zulip Server 2.0.7
        • Zulip Server 2.0.6
        • Zulip Server 2.0.5
        • Zulip Server 2.0.4
        • Zulip Server 2.0.3
        • Zulip Server 2.0.2
        • Zulip Server 2.0.1
        • Zulip Server 2.0.0
      • Zulip Server 1.9.x series
        • Zulip Server 1.9.2
        • Zulip Server 1.9.1
        • Zulip Server 1.9.0
      • Zulip Server 1.8.x series
        • Zulip Server 1.8.1
        • Zulip Server 1.8.0
      • Zulip Server 1.7.x series
        • Zulip Server 1.7.2
        • Zulip Server 1.7.1
        • Zulip Server 1.7.0
      • Zulip Server 1.6.x and older
        • Zulip Server 1.6.0
        • Zulip Server 1.5.2
        • Zulip Server 1.5.1
        • Zulip Server 1.5.0
        • Zulip Server 1.4.3
        • Zulip Server 1.4.2
        • Zulip Server 1.4.1
        • Zulip Server 1.4.0
        • Zulip Server 1.3.13
        • Zulip Server 1.3.12
        • Zulip Server 1.3.11
        • Zulip Server 1.3.10
        • Zulip Server 1.3.9
        • Zulip Server 1.3.8
        • Zulip Server 1.3.7
      • Upgrade notes
  • Zulip in production
    • Requirements and scalability
      • Server
        • General
        • Operating system
        • Hardware specifications
        • Network and security specifications
      • Credentials needed
        • SSL certificate
        • Outgoing email
      • Scalability
    • Install a Zulip server
      • Installation process overview
      • Step 0: Set up a base server
      • Step 1: Download the latest release
      • Step 2: Install Zulip
        • Installer options
      • Step 3: Create a Zulip organization, and log in
      • Getting started with Zulip
    • Troubleshooting and monitoring
      • Overview and resources
      • Using supervisorctl
        • Checking status with supervisorctl status
        • Restarting services with supervisorctl restart
        • Stopping services with supervisorctl stop
      • Troubleshooting services
        • Restrict unattended upgrades
      • Monitoring
        • Nagios configuration
      • Memory leak mitigation
      • Troubleshooting the Zulip installer
        • The zulip user’s password.
    • Management commands
      • Running management commands
        • Accessing an organization’s string_id
      • manage.py shell
      • Other useful manage.py commands
      • Custom management commands
    • Server configuration
      • Server settings overview
      • Changing server settings
      • Customizing user onboarding
        • Navigation tour video
        • Terms of Service and Privacy policy
    • System configuration
      • Truthy values
      • [machine]
        • puppet_classes
        • pgroonga
        • timesync
      • [deployment]
        • deploy_options
        • git_repo_url
      • [application_server]
        • http_only
        • nginx_listen_port
        • nginx_worker_connections
        • queue_workers_multiprocess
        • rolling_restart
        • service_file_descriptor_limit
        • s3_memory_cache_size
        • s3_disk_cache_size
        • s3_cache_inactive_time
        • thumbnail_workers
        • email_senders_workers
        • nameserver
        • uwsgi_listen_backlog_limit
        • uwsgi_processes
        • access_log_retention_days
        • katex_server
        • katex_server_port
      • [postgresql]
        • effective_io_concurrency
        • listen_addresses
        • random_page_cost
        • replication_primary
        • replication_user
        • skip_backups
        • backups_disk_concurrency
        • backups_directory
        • backups_incremental
        • backups_storage_class
        • backups_compression_method
        • missing_dictionaries
        • ssl_ca_file
        • ssl_cert_file
        • ssl_key_file
        • ssl_mode
        • version
      • [memcached]
        • memory
        • max_item_size
        • size_reporting
      • [tornado_sharding]
      • [loadbalancer]
        • ips
        • rejects_http_requests
      • [http_proxy]
        • host
        • port
        • listen_address
        • enable_for_camo
        • allow_addresses, allow_ranges, deny_addresses, deny_ranges
      • [sentry]
        • organization
        • project
    • Mobile push notification service
      • Signing up
      • Plan management
        • Plan management for a Zulip organization
        • Plan management for an entire Zulip server
      • Why a push notification service is necessary
      • Security and privacy
        • Uploading basic metadata
        • Uploading usage statistics
      • Rate limits
      • Updating your server’s registration
      • Moving your registration to a new server
        • Transferring your registration if you lost the original credentials
      • Deactivating your server’s registration
        • Pausing use of the Mobile Push Notification Service
    • Upgrade Zulip
      • Upgrading to a release
        • What to expect during an upgrade
      • Upgrading from a Git repository
        • Upgrading to an unreleased version of Zulip
      • Updating settings.py inline documentation
      • Troubleshooting and rollback
        • Rolling back to a prior version
      • Deployment hooks
      • Preserving local changes to service configuration files
        • nginx configuration changes
      • Upgrading PostgreSQL
      • Upgrading the operating system
        • Upgrading from Ubuntu 22.04 Jammy to 24.04 Noble
        • Upgrading from Ubuntu 20.04 Focal to 22.04 Jammy
        • Upgrading from Ubuntu 18.04 Bionic to 20.04 Focal
        • Upgrading from Ubuntu 16.04 Xenial to 18.04 Bionic
        • Upgrading from Debian 12 to 13
        • Upgrading from Debian 11 to 12
        • Upgrading from Debian 10 to 11
        • Upgrading from Debian 9 to 10
    • Modify Zulip
      • Making changes
        • Upgrading to future releases
        • Making changes with docker-zulip
      • Applying changes from main
        • Applying a small change
        • Upgrading to main
      • Contributing patches
    • Securing your Zulip server
      • 1. Limit shell access to a small set of trusted individuals.
      • 2. Consider requiring authentication with single sign-on (SSO).
      • 3. Teach users how to protect their account.
      • 4. Become familiar with Zulip’s access management model.
      • 5. Understand security for user-uploaded content and user-generated requests.
      • 6. Understand Zulip’s rate-limiting system.
    • Authentication methods
      • Email and password
        • Passwords
      • Social authentication
        • Sign in with Apple
      • Microsoft Entra ID
      • LDAP (including Active Directory)
        • Synchronizing data
        • Synchronizing email addresses
        • Multiple LDAP searches
        • Restricting access to an LDAP group
        • Restricting LDAP user access to specific organizations
        • Troubleshooting
      • SAML
        • IdP-initiated SSO
        • Restricting access to specific organizations
        • Synchronizing data during login
        • SCIM
        • Using Keycloak as a SAML IdP
        • Using Authentik as a SAML IdP
        • SAML Single Logout
      • Apache-based SSO with REMOTE_USER
        • Setup instructions for Apache-based SSO
        • Troubleshooting Apache-based SSO
        • Life of an Apache-based SSO login attempt
      • OpenID Connect
      • JSON Web Tokens (JWT)
      • Custom authentication backends
        • Configuring a custom Python wrapper around the authenticate mechanism
        • Adding more authentication backends
      • Development only
    • Backups, export and import
      • Backups
        • Restoring backups
        • What is included
        • Restore from manual backups
      • Data export
        • Consider upgrading
        • Preventing changes during the export
        • Export your Zulip data
      • Import into a new Zulip server
        • Import options
        • Logging in
        • Deleting and re-importing
      • Compliance exports
      • Database-only backup tools
        • Streaming backups to S3
        • Streaming backups to local disk
        • Restoring from wal-g backups
    • PostgreSQL database details
      • Separate PostgreSQL database
        • Cloud-provider-managed PostgreSQL (e.g., Amazon RDS)
        • Remote PostgreSQL database
      • PostgreSQL warm standby
      • PostgreSQL vacuuming alerts
    • File upload backends
      • S3 backend configuration
        • Google Cloud Platform
      • S3 local caching
      • nginx DNS nameserver configuration
      • S3 bucket policy
      • Migrating from local uploads to Amazon S3 backend
      • S3 data storage class
      • Data export bucket
    • Installing SSL certificates
      • Manual install
        • Testing
      • Certbot (recommended)
        • At initial Zulip install
        • After Zulip is already installed
        • How it works
        • Renewal
      • Self-signed certificate
      • Troubleshooting
        • The Android app can’t connect to the server
        • The iOS app can’t connect to the server
        • The Android app connects to the server on some devices but not others
    • Outgoing email
      • How to configure
      • Email services
        • Free outgoing email services
        • Using system email
        • Using Gmail for outgoing email
        • Logging outgoing email to a file for prototyping
      • Troubleshooting
        • Advanced troubleshooting
    • Deployment options
      • Installing Zulip from Git
      • Zulip in Docker
      • Zulip installer details
        • Advanced installer options
      • Installing on an existing server
      • Deployment hooks
        • Zulip message deploy hook
        • Sentry deploy hook
      • Running Zulip’s service dependencies on different machines
      • Deploying behind a reverse proxy
      • Using an alternate port
      • Customizing the outgoing HTTP proxy
        • IP address rules
        • Using a different outgoing proxy
        • Routing Camo requests through an outgoing proxy
        • Installing Smokescreen on a separate host
        • S3 file storage requests and outgoing proxies
    • Reverse proxies
      • Installer options
        • Configuring Zulip to allow HTTP
        • Configuring Zulip to trust proxies
      • nginx configuration
      • Apache2 configuration
      • HAProxy configuration
      • Other proxies
    • Hosting multiple organizations
      • Subdomains
        • SSL certificates
        • Other hostnames
        • The root domain
        • Changing subdomains
        • Authentication
        • The system bot realm
        • Migrating / troubleshooting
      • Open realm creation
    • Incoming email integration
      • Local delivery setup
      • Polling setup
    • Video call providers
      • Jitsi
      • Zoom
        • Server to Server OAuth app
        • General OAuth app
        • Configure your Zulip server
      • BigBlueButton
    • AI integrations
      • Built-in AI features
        • Data privacy
        • General configurations
        • Topic summarization beta
    • GIPHY GIF integration
      • Apply for API key
    • SCIM provisioning
      • Server configuration
      • Additional options
  • Contributing to Zulip
    • Contributing guide
      • Learning from the docs
      • Getting started
        • Learning how to use Git (the Zulip way)
        • Setting up your development environment and diving in
      • Finding an issue to work on
        • Where to look for an issue
        • Picking an issue to work on
        • Claiming an issue
      • Getting help
      • What makes a great Zulip contributor?
      • Submitting a pull request
      • Beyond the first issue
      • Common questions
      • Outreach programs
    • Zulip Code of Conduct
      • Expected behavior
      • Unacceptable behavior
      • Reporting and enforcement
      • Scope
      • License and attribution
      • Moderating the Zulip community
    • How we communicate
      • Providing suggestions and feedback
      • Handling disagreements
      • Expressing your appreciation
    • Asking great questions
      • Where to ask your question
      • How to ask a great question
      • Follow the community guidelines
    • Design discussions
      • Guidelines for all participants
      • Participant roles
      • Guidelines for code contributors
        • When to post
        • Guidelines for requesting design feedback
      • Guidelines for community moderators
        • Improving the quality of discussions
        • Moving threads to the most appropriate channel
      • Guidelines for decision makers
        • Managing the discussion
        • From discussion to decision
    • Commit discipline
      • Each commit must be coherent
      • Commits should generally be minimal
        • When not to be overly minimal
      • Write a clean commit history
      • Commit messages
        • Commit summary, part 1
        • Commit summary, part 2
        • Examples of good commit summaries
        • Commit description
        • Examples of good commit messages
    • Code style and conventions
      • Be consistent with existing code
        • Use the linters
        • Use tests to verify your logic
      • Follow Zulip conventions and practices
        • Observe a reasonable line length
        • Tag user-facing strings for translation
        • Correctly prepare paths destined for state or log files
        • Never include secrets inline with code
        • Familiarize yourself with rules about third-party code
      • Python-specific conventions and practices
      • JavaScript and TypeScript conventions and practices
        • Build DOM elements in Handlebars
        • Attach behaviors to event listeners
        • Declare variables using const and let
        • Manipulate objects and arrays with modern methods
      • HTML and CSS
      • Dangerous constructs in Django
        • Avoid excessive database queries
        • Never do direct database queries (UserProfile.objects.get(), Client.objects.get(), etc.)
        • Don’t use Django model objects as keys in sets/dicts
        • Don’t call user_profile.save() without update_fields
        • Don’t update important model objects with raw saves
        • Don’t use naive datetime objects
      • Dangerous constructs in JavaScript and TypeScript
        • Do not use for...in statements to traverse arrays
    • Reviewing Zulip code
      • Principles of code review
        • Reviewing your own code
        • Reviewing other contributors’ code
      • How to review code
        • Code review checklist
        • Automated testing
        • Manual testing
      • Review process and communication
        • Asking for a code review
        • Reviewing someone else’s code
        • Responding to review feedback
      • Additional resources
    • Submitting a pull request
      • Write clear code
      • Organize your proposed changes
      • Explain your changes
        • Discussions in the development community
      • Review your own work
      • Submit your pull request for review
      • Draft pull requests
      • Demonstrating visual changes
    • Pull request review process
      • Labels for managing the stages of pull request review
      • Stages of a pull request review
      • How to help move the review process forward
      • Follow-ups
    • Continuing unfinished work
      • Find work to be completed
      • Review existing work and feedback
      • Decide how to use prior work
      • Credit prior work in your commit history
      • Present your pull request
    • Using zulipbot
      • Usage
        • Contributing
    • Reporting bugs
      • What to include in a bug report
      • Filing a GitHub issue
      • Starting a conversation about a possible bug