Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/jitsi/jitsi-meet/llms.txt

Use this file to discover all available pages before exploring further.

config.js is the primary server-side configuration file loaded by every Jitsi Meet instance on page load. On a standard Debian/Ubuntu installation it lives at /etc/jitsi/meet/<your-domain>-config.js. The file exports a single config object whose properties control everything from XMPP connection details and codec preferences to which toolbar buttons appear in the UI. Changes take effect immediately on the next page load — no server restart is required.

Connection Settings

These options define how the browser connects to the Jitsi backend services (Prosody XMPP, Jicofo, and the Jitsi Videobridge).
hosts.domain
string
required
Your primary XMPP domain. This must match the domain configured in Prosody. Example: jitsi-meet.example.com.
hosts.muc
string
The XMPP MUC (Multi-User Chat) domain used for conference rooms. Defaults to conference.<domain>. Example: conference.jitsi-meet.example.com.
hosts.anonymousdomain
string
When token-based authentication is enabled, unauthenticated guests are assigned to this domain. Example: guest.jitsi-meet.example.com.
bosh
string
The BOSH (Bidirectional-streams Over Synchronous HTTP) URL for XMPP-over-HTTP connections. Example: https://jitsi-meet.example.com/http-bind.
websocket
string
The WebSocket URL for the XMPP connection. Preferred over BOSH when both are configured because it has lower overhead and better performance. Example: wss://jitsi-meet.example.com/xmpp-websocket.
Set websocket and leave bosh as a fallback. WebSocket connections are more efficient and reduce latency compared to long-polling BOSH connections.

Peer-to-Peer Settings

When only two participants are in a room, Jitsi Meet can establish a direct WebRTC connection between them, bypassing the Jitsi Videobridge entirely. This reduces server load and often improves call quality.
p2p.enabled
boolean
default:"true"
Enables or disables peer-to-peer mode. When true, a direct connection is attempted whenever exactly two participants are present. A third participant joining will automatically move everyone back to the JVB.
p2p.stunServers
array
Array of STUN server objects used during P2P ICE negotiation. Each entry must have a urls field. Example: [{ urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' }].
p2p.iceTransportPolicy
string
default:"all"
Controls which ICE candidate types are used for the P2P connection. Valid values from the WebRTC spec are "all" and "relay". Set to "relay" to force TURN usage (useful in restrictive firewalls).
p2p: {
    enabled: true,
    iceTransportPolicy: 'all',
    stunServers: [
        { urls: 'stun:meet-jit-si-turnrelay.jitsi.net:443' },
    ],
},

Prejoin Page

The prejoin page gives participants a chance to configure their camera and microphone before entering a meeting.
prejoinConfig.enabled
boolean
default:"true"
When true, an intermediate configuration screen is shown before a participant joins the call, allowing them to select audio/video devices and set their display name.
prejoinConfig.hideDisplayName
boolean
default:"false"
Hides the display name input field on the prejoin screen. If requireDisplayName is also true, a name must still be supplied via JWT or the IFrame API userInfo option.
prejoinConfig.hideExtraJoinButtons
array
List of extra join option buttons to hide from the dropdown. Possible values: 'no-audio', 'by-phone'.
prejoinConfig.preCallTestEnabled
boolean
default:"false"
Enables a pre-call network test on the prejoin page. Requires preCallTestICEUrl to also be set.

Toolbar Buttons

The toolbarButtons array controls exactly which buttons appear in the meeting toolbar. When the option is undefined (the default), all available buttons are shown.
toolbarButtons
array
An explicit allow-list of toolbar button identifiers. Only the listed buttons will be rendered. Omitting this option (leaving it undefined) displays every available button.All available button identifiers: camera, chat, closedcaptions, desktop, download, embedmeeting, etherpad, feedback, fullscreen, hangup, help, highlight, invite, linktosalesforce, livestreaming, microphone, noisesuppression, participants-pane, profile, raisehand, recording, security, select-background, settings, shareaudio, sharedvideo, shortcuts, stats, tileview, toggle-camera, videoquality, whiteboard
The 'desktop' key controls the “Share your screen” button. Use mainToolbarButtons to customise the layout of buttons in the main toolbar by screen size.
// Minimal toolbar — just the essentials
toolbarButtons: [
    'microphone',
    'camera',
    'desktop',
    'chat',
    'participants-pane',
    'raisehand',
    'tileview',
    'hangup',
],

Video Quality

The videoQuality object lets you control codec preferences and per-codec bitrate caps for each quality level.
videoQuality.codecPreferenceOrder
array
Ordered list of preferred video codecs for desktop endpoints. The first codec in the list is tried first. Example: ['AV1', 'VP9', 'VP8', 'H264'].
videoQuality.mobileCodecPreferenceOrder
array
Ordered list of preferred codecs for mobile and React Native endpoints. Example: ['H264', 'VP8', 'VP9', 'AV1'].
videoQuality.enableAdaptiveMode
boolean
default:"false"
When enabled, the client makes runtime codec and resolution adjustments when WebRTC statistics report CPU overuse on outbound video streams.
Each codec (av1, vp8, vp9, h264) accepts a maxBitratesVideo object with keys low, standard, high, fullHd, ultraHd, and ssHigh (all in bits per second):
videoQuality: {
    codecPreferenceOrder: ['VP9', 'VP8', 'H264'],
    vp9: {
        maxBitratesVideo: {
            low:      100000,
            standard: 300000,
            high:     1200000,
            fullHd:   2500000,
            ultraHd:  5000000,
            ssHigh:   2500000,
        },
        scalabilityModeEnabled: true,
        useSimulcast: false,
        useKSVC: true,
    },
},

Feature Flags

disableThirdPartyRequests
boolean
default:"false"
When true, no requests are made to external servers. Avatars fall back to locally-generated identicons and external analytics/stats integrations are disabled. Useful for air-gapped or privacy-strict deployments.
disableReactions
boolean
When set to true, disables the emoji reactions feature for all participants. Reactions are enabled by default when this option is not set.
disablePolls
boolean
default:"false"
Removes the polls feature from the UI entirely.
disableChat
boolean
default:"false"
Disables the chat panel, including notifications, sounds, and private messages.
disableSelfView
boolean
default:"false"
Hides the local self-view tile from both tile view and the filmstrip.
requireDisplayName
boolean
default:"false"
Forces every participant to provide a display name before joining. When combined with prejoinConfig.hideDisplayName: false, the name field is prominently shown on the prejoin screen.
enableInsecureRoomNameWarning
boolean
default:"false"
Displays a warning label when the room name is considered easy to guess and no password or lobby is active.
roomPasswordNumberOfDigits
number | false
default:"false"
When set to a number, restricts room passwords to that many numeric digits. Useful for phone dial-in scenarios.

Minimal Production Config Example

The following snippet shows a complete minimal config.js suitable for a self-hosted production server. Replace every occurrence of jitsi-meet.example.com with your actual domain.
var config = {
    hosts: {
        domain: 'jitsi-meet.example.com',
        muc: 'conference.jitsi-meet.example.com',
    },

    bosh: 'https://jitsi-meet.example.com/http-bind',
    websocket: 'wss://jitsi-meet.example.com/xmpp-websocket',

    // Show prejoin screen so users can check devices first
    prejoinConfig: {
        enabled: true,
        hideDisplayName: false,
    },

    // Require a name before joining
    requireDisplayName: true,

    // Warn when room name is too simple and no protection is set
    enableInsecureRoomNameWarning: true,

    // Peer-to-peer for 1:1 calls
    p2p: {
        enabled: true,
        stunServers: [
            { urls: 'stun:jitsi-meet.example.com:3478' },
        ],
    },

    // Limit toolbar to a focused set of controls
    toolbarButtons: [
        'microphone',
        'camera',
        'desktop',
        'chat',
        'participants-pane',
        'security',
        'raisehand',
        'tileview',
        'hangup',
    ],

    // Video quality targets
    videoQuality: {
        codecPreferenceOrder: ['VP9', 'VP8', 'H264'],
    },

    constraints: {
        video: {
            height: { ideal: 720, max: 720, min: 240 },
        },
    },
};
After editing config.js, no Jitsi service restart is necessary. Simply reload the browser page to pick up the new settings.

Build docs developers (and LLMs) love