Why is the Jitsi captions button grey or missing on mobile?

Short answer

A transcriber joining does not prove the browser received its status and caption messages. Enable captions, check presence and JSON delivery, and try Show subtitles on stage for the panel problem. Pass a boolean to setSubtitles; mobile captions in chat shipped in app 26.0.0, but the separate Android visibility proposal never merged. [S1][S3][S6][S7][S8][S10][S11][S12]

Symptoms

In #17098, the captions panel opens and Start turns grey. Jigasi joins and reportedly writes recognized speech to a file, but the button never becomes Stop and language selection never appears. The report supplies no server version or runtime error. It closed automatically as stale, not through a confirmed fix. [S1]

Android #16710 reports missing controls/text in app 25.6.1, build 21431857, while desktop works. The proposed fix #16718 closed unmerged. Its author’s initial overlay diagnosis was later revised to button visibility logic. Neither closure proves recovery. [S2][S6]

Cause

There are separate paths for recognition, status presence and live caption messages. Jigasi sends a transcription-status presence extension; the client processes transcription-result JSON. Saving speech alone does not establish that both reached the UI. [S12][S16]

In Meet 11248, transcription.enabled must be true and disableClosedCaptions false. Disabling captions can still leave transcription available from the recording dialog. The panel also depends on the local showSubtitlesOnStage preference and is unavailable in breakout rooms. translationEnabled: false hides translation selection; a visible picker does not install a translator. [S10][S11]

Other causes have clearer diagnoses: #17079 passed an object where setSubtitles expects a boolean; #16850 invited Jigasi without anyone requesting subtitles. Maintainers confirmed both mistakes. #16373 establishes neither a universal one-person-call defect nor a fixed release, and its maintainer says Jigasi must be configured. [S3][S4][S5]

Fix

  1. Docker stable-11248: check the backend and effective configuration. It remains the latest Docker release checked October 12. For stock Jigasi transcription, set ENABLE_TRANSCRIPTIONS=1 in your existing .env. Use the matching transcriber.yml; preserve any extra overlays from your deployment. Backend installation is covered in Jigasi and Vosk setup, which describes an older layout. [S9][S14][S15]

    Inspect logs with the current stock service names: [S15][S18]

    Terminal
    docker compose -f docker-compose.yml -f transcriber.yml logs --tail=200 transcriber prosody jicofo
  2. Docker stable-11248: apply only the needed overrides. Put this in ${CONFIG}/web/custom-config.js, readable by the web container. autoCaptionOnTranscribe defaults to false; enable it when you want clients to request subtitles automatically once a transcriber arrives. It does not start recognition without a backend. Preserve existing language/backend settings. [S10][S12][S14]

    JavaScript
    config.transcription ||= {};
    Object.assign(config.transcription, {
        enabled: true,
        disableClosedCaptions: false,
        autoCaptionOnTranscribe: true
    });

    During a maintenance window, recreate the affected services using your full overlay list. Startup regenerates the web configuration. [S14][S15][S18]

    Terminal
    docker compose -f docker-compose.yml -f transcriber.yml up -d --force-recreate web prosody jicofo transcriber
  3. Debian/Ubuntu, Meet 2.0.11248: edit /etc/jitsi/meet/meet.example.com-config.js. Append the same assignments after the existing config definition, then reload the meeting. Docker .env variables and custom-config.js are not the package configuration mechanism. Inspect the installed Jigasi service separately: [S10][S17][S18]

    Terminal
    sudo journalctl -u jigasi -u jicofo -u prosody -n 200 --no-pager
  4. Web clients on checked Meet 11248, either installation: try the stage overlay. In Settings, More, enable Show subtitles on stage. The released local setting is showSubtitlesOnStage, default false. This implements the older display path suggested in #17098; recovery of that report remains untested. Do not set disableClosedCaptions: true, which removes both displays. [S1][S10][S11]

  5. Embedded clients, reported stable-10741 and checked 11248: correct the API arguments. Run this after joining, with api your existing JitsiMeetExternalAPI instance. The positional arguments mean enabled, display subtitles, language: [S3][S13]

    JavaScript
    api.executeCommand('setSubtitles', true, true, 'en');
    // Stop this client's subtitle request:
    api.executeCommand('setSubtitles', false);

    Do not pass { enabled: true }. For custom autostart, prefer the verified automatic client request above. A server-only invitation needs appropriate room metadata; the maintainer’s partial example uses room.jitsiMetadata.recording.isTranscribingEnabled and an auto-started header, not a complete installable plugin. [S3][S5]

  6. Native apps, either server installation: update and check Chat. PR #16787 merged January 20; app 26.0.0, released January 23, includes captions inside chat. The latest documented app is 26.3.0, September 28. These releases establish support, but do not confirm a fix for every #16710 symptom. #16718 remains unmerged. [S2][S6][S7][S8]

Verify

For Docker and packages 11248, inspect what browsers receive, then inspect config.transcription in the meeting frame’s console. Expect enabled: true, disableClosedCaptions: false, and autoCaptionOnTranscribe: true after the example. Refresh with caches bypassed if the served settings differ. [S10][S14][S17][S18]

Terminal
curl -fsS https://meet.example.com/config.js

For embedded clients, examine outgoing XMPP presence after starting captions and again after muting. The exact expected element is: [S3]

xml
<jitsi_participant_requestingTranscription>true</jitsi_participant_requestingTranscription>

[object Object] proves the API argument is still wrong. Require received transcription-result messages containing recognized speech and visible text on the selected display. A file or joined bot alone is insufficient. No live meeting was tested here. [S3][S12][S16]

If it still fails

For stock Docker 11248, match JIGASI_TRANSCRIBER_USER and XMPP_HIDDEN_DOMAIN across Jigasi and Prosody, and verify the existing password without sharing it. Prosody’s transcriber_prefixes identifies that hidden-domain user; the client ignores ordinary, non-hidden participant endpoint messages for this path. Check Jicofo’s jigasi.brewery-jid against JIGASI_BREWERY_MUC and XMPP_INTERNAL_MUC_DOMAIN. These are discovery and identity checks, not proof of #17098’s cause. [S12][S15]

Check the transcription-capable Jigasi endpoint, its conference presence and JSON delivery rather than inventing a separate Prosody transcription component. In Jigasi logs, TranscriptionService is not properly configured indicates backend setup failure. TranscriptionGatewaySession started transcribing is a debug-level start message, not proof of recognized words. Browser Error dialing indicates a failed invitation. [S12][S16]

For authentication or recognition failures, use transcription troubleshooting. For language routing, use caption languages and translation. [S10][S15][S16]

FAQ

Does upgrading fix the grey panel?

No confirmed release fix was identified for #17098. It is not fixed as of 2026-10-12 in the sense that recovery remains unverified; its stale closure is not a fix. [S1]

Can captions work without Jigasi?

These instructions cover Jigasi transcription. The #16373 maintainer requires a configured Jigasi backend for that setup; enabling a UI flag alone is insufficient. [S4]

Why does autostart stop after changing camera state?

Jigasi can leave when nobody requests subtitles and backend transcription is inactive. #16850’s maintainer recommends client requests or backend metadata, not a new release. [S5][S16]

Can someone help inspect the full setup?

Our Jitsi transcription service covers backend and caption integration. Provide versions, sanitized configuration and matching browser/server logs.

Sources

[S1] Grey panel #17098, including maintainer reply, March 5, 2026, community report and maintainer comment; status checked October 12.

[S2] Android #16710, November 26, 2025, community report; status checked October 12, 2026.

[S3] IFrame presence #17079, March 4, 2026, community report and maintainer confirmation.

[S4] setSubtitles #16373, August 26 to September 1, 2025, community report and maintainer comment.

[S5] Autostart #16850, January 20 to 22, 2026, maintainer comments and partial example.

[S6] Android proposal #16718, November 2025 to July 2026, proposed source code and contributor discussion; closed unmerged.

[S7] Native captions #16787, merged January 20, 2026, source code.

[S8] Mobile app changelog, January 23 and September 28, 2026, release notes.

[S9] Latest Docker release, September 14, 2026, release note; checked October 12.

[S10] Meet 11248 config, September 2026, source code.

[S11] Settings UI, caption gates, preference default, September 2026, source code.

[S12] Caption middleware, September 2026, source code.

[S13] IFrame commands, checked October 12, 2026, official doc.

[S14] Docker web settings, startup, mounts, September 14, 2026, source code.

[S15] Transcriber Compose, credentials/JSON, Prosody, Jicofo, September 14, 2026, source code.

[S16] Jigasi session, September 2026, source code.

[S17] Package config installation, Jigasi unit, September 2026, source code.

[S18] Compose up, logs, journalctl, curl, HTTP caching, checked October 12, 2026, official docs.

Open questions

The maintainer did not name a config.js switch for the older UI; the verified fallback is a local setting. The panel’s root cause, #16373’s screenshot-only error, and recovery on specific Android devices need testing. No released fix for those reports was confirmed.

Written by the Jitsi Help engineering team

Jitsi infrastructure engineers who deploy and run Jitsi Meet servers in production. Last updated . How we write our guides

Did this fix it?

Something on this page is outdated or wrong?

Collect debug info

These commands gather what an engineer needs to diagnose a Jitsi server. Copy them, run them, and keep the output.

Terminal
# Run on the server, from your docker-jitsi-meet folder

# 1. Every service should be "running" (or "healthy")
docker compose ps

# 2. Which images and release tags are running
docker compose images

# 3. Recent logs from the core services
docker compose logs --tail=200 web prosody jicofo jvb

# 4. The settings most fixes depend on
grep -E '^(PUBLIC_URL|JVB_ADVERTISE_IPS|ENABLE_LETSENCRYPT|ENABLE_AUTH|AUTH_TYPE)=' .env

# 5. Is anything listening for media on UDP 10000?
sudo ss -ulnp | grep 10000

Installed with the Debian packages instead of Docker? Read the service logs with:

Terminal
sudo journalctl -u prosody -u jicofo -u jitsi-videobridge2 --since "1 hour ago"

Remove passwords, secrets and tokens before you share any output.

Send the output to an engineer

Discussion

    Stuck, or would rather not do this by hand?

    Deploy it in one click

    A private Jitsi server in your own AWS account with SSL, your domain and optional recording, transcription and JWT. Free 15 minute trial.

    Start free trial

    Talk to a Jitsi engineer

    Setup, fixes, branding, recording, scaling. Tell us what is happening and we reply with a plan and a quote.

    Get expert help

    Related

    Recently updated