# How do I migrate deprecated Jigasi transcription to the bridge?

> Jitsi has deprecated Jigasi transcription without announcing a removal release or date. Its replacement sends audio from JVB to a proxy, controlled by Jicofo. Test a separate room before retiring your transcriber, because saved files and offline backends need separate migration work. The notice concerns transcription, not Jigasi SIP calling. [S1][S2][S3][S4]

Source: https://jitsi.help/guides/migrate-jigasi-transcription-to-bridge/
Updated: October 6, 2026
Publisher: Jitsi Help (https://jitsi.help/)

## Who this is for

For administrators running Jigasi captions with Vosk, Google or Whisper/Skynet. Keep the [Vosk guide](/guides/jitsi-transcription-vosk/) as your legacy reference. [S3][S13]

The handbook's exact deprecation sentence is:

> The Jigasi transcription support is deprecated and will be removed in a future release. [S1]

It appeared on July 9, 2026, in commit `ce6b471` through PR #645. No removal date or release was announced in the sources checked on October 6, 2026. [S1]

The notice names transcription. Jigasi's SIP gateway has a separate switch; Docker provides separate `jigasi` and `transcriber` services. Preserve SIP dial-in and dial-out. [S2][S3]

## How it works

Jigasi joins as a transcriber. Its replacement sends audio from a selected JVB over WebSocket to `opus-transcriber-proxy`, which connects to recognition backends and returns captions. Jicofo supplies the destination and controls activation. [S3][S4][S7][S8]

With server-controlled `asyncTranscription=true`, the client skips dialing Jigasi. Jicofo also requires `recording.isTranscribingEnabled=true`, set through start/stop controls. This enables routing by room. Use fresh rooms: an already attached transcriber or custom client can still request the old path. [S6][S7]

Comparison: [S3][S4][S6]

| Feature | Jigasi route | Bridge route |
|---|---|---|
| Live captions | Supported. | Results return through JVB to the client. [S3][S4][S8] |
| Saved transcripts | TXT/JSON output and advertised download links are configurable. | Optional JSONL debug dumps exist; an equivalent finished transcript download workflow was not verified. [S3][S4] |
| Translation | Google or a custom service. | `ENABLE_TEXT_TRANSLATION=true` enables separately configured text translation. [S3][S4] |
| Languages | Depend on the recognition service and model. | Depend on the selected provider/model; old language settings do not transfer automatically. [S3][S4] |
| Speaker names | Participant information accompanies results. | Audio sources carry endpoint identity; validate displayed names during the pilot. [S3][S4][S6][S8] |
| Recording | Can save transcriber audio; Jibri video recording is separate. | The client can request recording and transcription together; the proxy does not replace Jibri. [S3][S6] |
| Offline recognition | Local Vosk and Whisper/Skynet services are supported. | A compatible local Realtime WebSocket adapter is needed; a drop-in Vosk or Skynet migration was not verified. [S3][S4] |

## Before you start

On October 6, 2026, the latest Docker release remains `stable-11248`, published September 14. It ships `transcriber.yml`; use matching Compose files and Jitsi images. The proxy is pinned separately to `6747f187c0e7f4fa17f7744e0d76a5ce6d7d4b24`. [S2][S4]

Package baseline: Jitsi Meet `2.0.11248-1`, web/Prosody plugins `1.0.9442-1`, Jicofo `1.0-1205-1`, JVB `2.3-318-gbf271b11f-1`, Jigasi `1.1-415-g2750d54-1`. The earliest compatible release remains unconfirmed. [S10]

Back up environment, overlays, Jigasi configuration, custom Prosody/Jicofo files and transcripts. Keep credentials private. Schedule changes and rollback with no active meetings or SIP calls. Decide which languages, translation, files and recording workflows must pass before switching. [S2][S3][S5][S6][S12]

Keep the proxy internal, or on loopback when package JVB shares its host. Remote bridges need an authenticated WSS gateway; the standalone proxy lacks incoming authentication. Cloud backends receive audio even when the proxy is self-hosted. [S4][S13]

## Steps

1. **Docker stable-11248: record the working configuration.** Run from your Compose directory. Add existing overlays, including `jigasi.yml` for SIP, to every command. The backup filename is this guide's example. [S2][S12]

   ```sh
   docker compose -f docker-compose.yml -f transcriber.yml config --services
   docker compose -f docker-compose.yml -f transcriber.yml config --images
   umask 077
   cp -p .env .env.before-bridge
   chmod 600 .env.before-bridge
   ```

   Service `transcriber` has literal `JIGASI_MODE=transcriber`; `.env` cannot override it. Preserve its password and backend settings. [S2]

2. **Docker stable-11248: install the bridge route without enabling it everywhere.** Reuse the proxy service, backend assignments and Jicofo HOCON from the [bridge transcription setup guide](/guides/jitsi-bridge-transcription-opus-proxy/). That recipe creates `compose.override.yaml` and `${CONFIG}/jicofo/custom-jicofo.conf`. Keep `transcriber.yml` in your command list. Replace its all-room Prosody module with the pilot below before applying changes. [S4][S5][S13]

   Set shell `CONFIG` to match your existing `.env`; the documented default is: [S5]

   ```sh
   CONFIG="$HOME/.jitsi-meet-cfg"
   ```

   Create `${CONFIG}/prosody/prosody-plugins-custom/mod_bridge_transcription_pilot.lua`. This is an adaptation of the handbook module, using Prosody's JID API to select only `bridge-migration-test`. It runs after metadata initialization and leaves other rooms alone. [S1][S5][S6][S11]

   ```lua
   local jid = require "util.jid";
   local is_healthcheck_room = module:require("util").is_healthcheck_room;
   module:hook("muc-room-created", function(event)
       local room = event.room;
       if is_healthcheck_room(room.jid)
           or jid.node(room.jid) ~= "bridge-migration-test" then
           return;
       end
       room.jitsiMetadata = room.jitsiMetadata or {};
       room.jitsiMetadata.asyncTranscription = true;
   end, -2);
   ```

   In `.env`, keep `ENABLE_TRANSCRIPTIONS=1` and append `bridge_transcription_pilot` to existing `XMPP_MUC_MODULES`. Do not also load `force_async_transcription`, which would select every room. Make the pilot readable and the secret-bearing custom Jicofo file private for UID 1000. [S5][S12]

   ```sh
   sudo chmod 644 "${CONFIG}/prosody/prosody-plugins-custom/mod_bridge_transcription_pilot.lua"
   sudo chown 1000:1000 "${CONFIG}/jicofo/custom-jicofo.conf"
   sudo chmod 600 "${CONFIG}/jicofo/custom-jicofo.conf"
   ```

3. **Docker stable-11248: start the pilot.** Define this shell helper; add your normal optional overlays inside it. Validate, then recreate the changed services during the maintenance window. It keeps the legacy transcriber available. [S2][S12]

   ```sh
   dc() {
       docker compose -f docker-compose.yml -f transcriber.yml -f compose.override.yaml "$@"
   }
   dc config --quiet
   dc up -d --force-recreate opus-transcriber-proxy web prosody jicofo
   ```

   Open a new `https://meet.example.com/bridge-migration-test` as moderator and start transcription. Verify no Jigasi transcriber joined it. Test a separate new room for legacy captions. [S6][S7]

4. **Docker stable-11248: switch after acceptance.** Remove only the pilot's room-name condition to select all ordinary new rooms, retaining the health-check exclusion. Recreate Prosody during maintenance. After legacy sessions finish and all required features pass, stop only the caption service: [S1][S2][S6][S12]

   ```sh
   dc up -d --force-recreate prosody
   dc stop transcriber
   ```

   Keep its configuration, transcript storage and credentials. Leave the separate SIP `jigasi` service running. A later unrestricted `dc up -d` can start `transcriber` again while its overlay remains included; remove that overlay from routine commands after the rollback period. [S2][S12]

5. **Docker stable-11248: roll back.** Stop captions and close bridge rooms. Remove only `bridge_transcription_pilot` from `XMPP_MUC_MODULES`. Start the retained transcriber and apply changes. The unused proxy URL can remain with async routing disabled. Test a new room. [S6][S7][S12]

   ```sh
   dc start transcriber
   dc up -d --force-recreate web prosody jicofo
   dc stop opus-transcriber-proxy
   ```

6. **Debian/Ubuntu reference packages: perform the same room pilot.** Follow the package proxy and Jicofo steps in the setup guide. Merge its URL block into `/etc/jitsi/jicofo/jicofo.conf`. Save the pilot above as `/usr/share/jitsi-meet/prosody-plugins/mod_bridge_transcription_pilot.lua`; enable `"bridge_transcription_pilot";` in the main conference MUC's existing `modules_enabled` list in `/etc/prosody/conf.avail/meet.example.com.cfg.lua`. Set existing `transcription.enabled` to `true` in `/etc/jitsi/meet/meet.example.com-config.js`. [S10][S13]

   ```sh
   sudo systemctl restart prosody
   sudo systemctl restart jicofo
   ```

   Keep Jigasi during the pilot. For cutover, remove the room-name condition as in step 4, restart Prosody and test a new ordinary room. Then a transcription-only installation can use `sudo systemctl stop jigasi`. For shared SIP, set existing `org.jitsi.jigasi.ENABLE_TRANSCRIPTION=false` in `/etc/jitsi/jigasi/sip-communicator.properties`, preserve `org.jitsi.jigasi.ENABLE_SIP`, and restart Jigasi during maintenance. [S3][S10][S12]

   For rollback, remove the pilot from the MUC modules, restore the previous transcription setting and restart Prosody, Jicofo and Jigasi. Use a new room; existing async rooms do not automatically turn into legacy rooms. [S3][S6][S12]

## Configuration reference

Defaults: stable-11248, released Jigasi and pinned proxy. Provider/listener settings are in the setup guide. [S2][S3][S4][S13]

| Setting | Location | Default | Migration role |
|---|---|---|---|
| `CONFIG` | Docker `.env` | `~/.jitsi-meet-cfg` | Host configuration root. [S5] |
| `JIGASI_MODE` | Docker overlays | `transcriber` or `sip`, explicitly set | Identifies separate services. [S2] |
| `JIGASI_TRANSCRIBER_PASSWORD` | Docker `.env` | Unset | Retain legacy authentication for rollback. [S2] |
| `ENABLE_TRANSCRIPTIONS` | Docker `.env` | `0` | Keep caption controls enabled. [S5] |
| `XMPP_MUC_MODULES` | Docker `.env` | Empty | Add the pilot module. [S5] |
| `modules_enabled` | Prosody conference MUC | Install-specific | Load the pilot module. [S10] |
| `asyncTranscription` | Server room metadata | Absent | Select bridge routing. [S6][S7] |
| `recording.isTranscribingEnabled` | Room metadata | Absent | Start/stop bridge transcription. [S7] |
| `transcription.enabled` | Client config | `false` | Caption UI availability. [S10] |
| `jicofo.transcription.url-template` | Jicofo HOCON | Unset | Bridge proxy destination. [S7] |
| `org.jitsi.jigasi.ENABLE_TRANSCRIPTION` | Jigasi properties | `false` in code | Disable only legacy transcription after acceptance. [S3] |
| `org.jitsi.jigasi.ENABLE_SIP` | Jigasi properties | `true` in code | Preserve existing SIP behavior. [S3] |
| `ENABLE_TEXT_TRANSLATION` | Proxy environment | `false` | Enables caption text translation. [S4] |

## Common mistakes

- **Assuming REST compatibility means offline bridge support.** The custom proxy backend needs OpenAI Realtime transcription over WebSocket, including streaming audio and transcript events. Standard Whisper HTTP uploads and Jigasi's Vosk/Skynet protocols are not substitutes. A local adapter may work, but a complete offline deployment was not verified. [S3][S4]
- **Expecting old files and translations automatically.** Legacy settings are read by Jigasi, not the proxy. Debug dumps require separate storage planning and do not prove downloadable final transcripts. Treat translation and recording as separate acceptance tests. [S3][S4][S6]
- **Using unreleased Docker variables.** PR #2326 remains open and unmerged as of October 6, 2026; stock stable-11248 needs the custom Jicofo file. The OpenAI failure in Meet #17742 is also open, with no released fix verified. [S5][S9]

## Verify

Docker: [S4][S12]

```sh
dc exec -T jvb curl --fail --silent --show-error http://opus-transcriber-proxy:8080/health
dc logs --tail=100 opus-transcriber-proxy jvb jicofo transcriber
```

The health request must return HTTP 200 with exact body `OK`. JVB's `Websocket connected: true` shows transport connection, not successful speech recognition. [S4][S8]

Have two people speak different sentences in the pilot and confirm both appear with the correct attribution. Then stop transcription. Confirm the other test room still obtains legacy captions. Repeat your required language, translation, transcript-download and Jibri recording workflows before switching. These user-visible results are the acceptance proof, not just a green health check. [S3][S4][S6]

Package SIP should log `initialized SipGateway` and `skipped initialization of TranscriptionGateway` after disabling transcription. Test actual calls. [S3]

## If it still fails

Jicofo's `Transcription enabled, but no URL is configured.` means the URL was not loaded. Check the generated include and custom file permissions, then both room flags. On packages, use the configured logs; defaults include `/var/log/jitsi/jicofo.log` and `/var/log/jitsi/jvb.log`. [S5][S7][S10]

For the package example, `curl --fail --silent --show-error http://127.0.0.1:9090/health` should also return `OK`. Read `docker logs transcriber` for proxy errors, and `journalctl -u prosody -u jicofo -u jigasi --since "10 minutes ago"` for service errors. Here the standalone container name `transcriber` denotes the new proxy; in Compose it denotes legacy Jigasi. [S4][S12][S13]

Keep production audio and secrets out of debug dumps. For old authentication and Vosk failures, use [transcription troubleshooting](/troubleshooting/jitsi-transcription-not-working/). [S4][S13]

## FAQ

### Must I migrate today?

No deadline was announced, and stable-11248 still ships the transcriber. Plan and test the change. [S1][S2]

### Will SIP calls stop working?

Preserve SIP's service or enable setting. Restart shared services with no active calls. [S2][S3][S12]

### Can I migrate Vosk without sending audio to a cloud?

Keep Vosk until a local Realtime adapter passes your tests; no drop-in replacement was verified. Our [transcription setup service](/services/jitsi-transcription/) offers implementation help. [S3][S4][S13]

## Sources

All checked 2026-10-06.

[S1] [Transcription handbook](https://jitsi.github.io/handbook/docs/devops-guide/transcription/), [first addition](https://github.com/jitsi/handbook/commit/ce6b471ad9d4c941427cf266f859f56573178e87), [PR #645](https://github.com/jitsi/handbook/pull/645), 2026-07-09; current page updated 2026-10-05, official doc and source history.

[S2] [Latest Docker release](https://github.com/jitsi/docker-jitsi-meet/releases/latest), [transcriber overlay](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/transcriber.yml), [SIP overlay](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/jigasi.yml), 2026-09-14, release note and source code.

[S3] Released Jigasi [README](https://github.com/jitsi/jigasi/blob/2750d5448271a7a421cb28a914970a4383127380/README.md), [gateway switches](https://github.com/jitsi/jigasi/blob/2750d5448271a7a421cb28a914970a4383127380/src/main/java/org/jitsi/jigasi/JigasiBundleActivator.java), [transcription implementation](https://github.com/jitsi/jigasi/tree/2750d5448271a7a421cb28a914970a4383127380/src/main/java/org/jitsi/jigasi/transcription), [package service](https://github.com/jitsi/jigasi/blob/2750d5448271a7a421cb28a914970a4383127380/debian/jigasi.service), 2026-09-11 snapshot, official doc and source code.

[S4] Proxy [configuration](https://github.com/jitsi/opus-transcriber-proxy/blob/6747f187c0e7f4fa17f7744e0d76a5ce6d7d4b24/src/config.ts), [server](https://github.com/jitsi/opus-transcriber-proxy/blob/6747f187c0e7f4fa17f7744e0d76a5ce6d7d4b24/src/server.ts), [backend implementations](https://github.com/jitsi/opus-transcriber-proxy/tree/6747f187c0e7f4fa17f7744e0d76a5ce6d7d4b24/src/backends), [proxy implementation](https://github.com/jitsi/opus-transcriber-proxy/blob/6747f187c0e7f4fa17f7744e0d76a5ce6d7d4b24/src/transcriberproxy.ts), 2026-10-05 snapshot, source code.

[S5] Docker [handbook](https://jitsi.github.io/handbook/docs/devops-guide/devops-guide-docker/), [Jicofo initialization](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/jicofo/rootfs/etc/s6-overlay/scripts/config), [Jicofo template](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/jicofo/rootfs/defaults/jicofo.conf), [Prosody template](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/prosody/rootfs/defaults/conf.d/jitsi-meet.cfg.lua), [web template](https://github.com/jitsi/docker-jitsi-meet/blob/stable-11248/web/rootfs/defaults/settings-config.js), stable-11248, official doc and source code.

[S6] 11248 client [caption routing](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/react/features/subtitles/middleware.ts), [room metadata](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/resources/prosody-plugins/mod_room_metadata_component.lua), [recording dialog](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/react/features/recording/components/Recording/AbstractStartRecordingDialog.ts), [speaker names](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/react/features/chat/components/web/SubtitleMessage.tsx), 2026-09-14, source code.

[S7] 11248 Jicofo [room gates](https://github.com/jitsi/jicofo/blob/stable/jitsi-meet_11248/jicofo-common/src/main/kotlin/org/jitsi/jicofo/xmpp/muc/ChatRoomImpl.kt), [conference logic](https://github.com/jitsi/jicofo/blob/stable/jitsi-meet_11248/jicofo/src/main/java/org/jitsi/jicofo/conference/JitsiMeetConferenceImpl.java), [configuration defaults](https://github.com/jitsi/jicofo/blob/stable/jitsi-meet_11248/jicofo-selector/src/main/resources/reference.conf), 2026-09-14, source code.

[S8] 11248 JVB [exporter](https://github.com/jitsi/jitsi-videobridge/blob/stable/jitsi-meet_11248/jvb/src/main/kotlin/org/jitsi/videobridge/export/Exporter.kt), [serializer](https://github.com/jitsi/jitsi-videobridge/blob/stable/jitsi-meet_11248/jvb/src/main/kotlin/org/jitsi/videobridge/export/MediaJsonSerializer.kt), 2026-09-14, source code.

[S9] [Docker PR #2326](https://github.com/jitsi/docker-jitsi-meet/pull/2326), proposed source code; [Meet #17742](https://github.com/jitsi/jitsi-meet/issues/17742), community report, status checked 2026-10-06.

[S10] [Package index](https://download.jitsi.org/stable/Packages), 11248 [web installer](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/debian/jitsi-meet-web-config.postinst), [Prosody installer](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/debian/jitsi-meet-prosody.postinst), [plugin mapping](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/debian/jitsi-meet-prosody.install), [Jicofo launcher](https://github.com/jitsi/jicofo/blob/stable/jitsi-meet_11248/resources/jicofo.sh), [client defaults](https://github.com/jitsi/jitsi-meet/blob/stable/jitsi-meet_11248/config.js), [Jicofo logging](https://github.com/jitsi/jicofo/blob/stable/jitsi-meet_11248/debian/init.d), [JVB service](https://github.com/jitsi/jitsi-videobridge/blob/stable/jitsi-meet_11248/debian/jitsi-videobridge2.service), checked 2026-10-06, official repository and source code.

[S11] [Prosody JID API](https://prosody.im/doc/developers/util/jid), dated 2020-09-20, official doc.

[S12] [Compose CLI](https://docs.docker.com/reference/cli/docker/compose/), [merging files](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge/), [copy](https://manpages.debian.org/trixie/coreutils/cp.1.en.html), [chmod](https://manpages.debian.org/trixie/coreutils/chmod.1.en.html), [chown](https://manpages.debian.org/trixie/coreutils/chown.1.en.html), [systemctl](https://www.freedesktop.org/software/systemd/man/latest/systemctl.html), [journalctl](https://www.freedesktop.org/software/systemd/man/latest/journalctl.html), [curl](https://curl.se/docs/manpage.html), checked 2026-10-06, official docs.

[S13] jitsi.help [bridge setup](/guides/jitsi-bridge-transcription-opus-proxy/), [Vosk guide](/guides/jitsi-transcription-vosk/), [troubleshooting](/troubleshooting/jitsi-transcription-not-working/), [setup service](/services/jitsi-transcription/), checked 2026-10-06, independent guides.

## Open questions

No removal release/date, fully tested offline Realtime adapter, or saved-download parity was confirmed. The complete migration and rollback need testing on a real server, especially with SIP, required languages, translation and recording. No live meeting test is claimed here. [S1][S3][S4][S6]

---

Jitsi Help is an independent service. It is not affiliated with, endorsed by or sponsored by 8x8, Inc. or the Jitsi project. Jitsi and Jitsi Meet are trademarks of 8x8, Inc., used here only to describe the software we host and support.
