Symptoms
Live captions appear during the meeting, but the saved transcript ends early. Issue #645 reports Docker stable-11031, Skynet 2026.5.0 and org.jitsi.jigasi.transcription.WhisperTranscriptionService. The reporter reproduced it with two participants on separate clients. [S1]
The report contains these Skynet lines: [S1]
Meeting 24e87def-4f30-4773-99ff-e815091d057b:
the connection was closed before sending all results
Closed 24e87def-4f30-4773-99ff-e815091d057b |
Audio: 3313.5s |
Interims: 1343 |
Finals: 328PR #650 reproduces this Jigasi sequence. The file is written roughly three seconds before the final disconnect: [S2]
17:00:35.100 Wrote final transcript
17:00:38.102 All participants have left, disconnecting from Whisper transcription server.
17:00:38.104 Websocket closed: 1006Issue #645 also reports reason: Session Closed, isRunning: false and isOpen: false. These are reported fragments, not a universal complete log format. The released writer’s actual message prefix is Wrote final transcript to , followed by the generated file path. [S1][S5]
Cause
Two operations can run in the wrong order. Released WhisperWebsocket.disconnectParticipantInternal removes participant listeners, sends EOF_MESSAGE and immediately calls wsSession.disconnect(). Late backend replies then have neither a usable connection nor the removed listeners. [S3]
Separately, TranscriptionGatewaySession.onJvbConferenceStopped stops transcription and publishes the current transcript immediately. Participant departure processing uses PRESENCE_UPDATE_WAIT_UNTIL_LEAVE_DURATION = 3000, so export can precede that processing. The PR also identifies missing listener completion notifications. [S4][S2]
PR #650 proposes retaining listeners during EOF handling, allowing the server to close, notifying completion, and postponing transcript export. Its patch has a five-second WebSocket fallback and a separate five-second export deadline. Those are code constants in an unmerged proposal, not released .env settings. [S2]
Visible captions can be interim text. Jigasi’s saved Transcript accepts non-interim results, while the browser distinguishes final, stable and unstable. A sentence being visible alone does not prove Jigasi had its final result when it saved the file. [S5][S9]
As checked October 12, 2026, issue #645 and PR #650 remain open; the PR has not merged. Docker stable-11248, released September 14, is still latest. Its image contains Jigasi 1.1-415-g2750d54-1, also available in the stable package repository, with the old shutdown/export code. Upgrading to that release does not install PR #650. [S2][S3][S4][S6]
Fix
-
Docker
stable-11031throughstable-11248: establish your baseline. Run this from your deployment directory, including your normal overlays in the helper. Stocktranscriber.ymlnames the servicetranscriber; substitute your actual service if you run transcription in a customjigasiservice. [S7][S8]Terminaldc() { docker compose -f docker-compose.yml -f transcriber.yml "$@" } dc exec -T transcriber dpkg-query -W -f='${Version}\n' jigasi dc logs --since=10m --timestamps transcriberMatch the transcript-write and close timestamps to the same session. For Skynet, inspect that deployment’s application log for the meeting ID and unsent-results warning. Its service name depends on your deployment, so do not assume it shares the Jitsi Compose project. [S1][S10]
-
Docker
stable-11248: confirm where the saved file lives. Stock configuration writes to/tmp/transcriptsinside the transcriber, mounted from${CONFIG}/storage/transcripts. Use the path inWrote final transcript toto identify the file. A customorg.jitsi.jigasi.transcription.DIRECTORYchanges the location. Follow save and download transcripts for storage setup. [S5][S7] -
Debian/Ubuntu, Jigasi
1.1-415-g2750d54-1or the older reported code: gather the same evidence. The upstream unit redirects application output to/var/log/jitsi/jigasi.log. The journal helps with startup failures, but may not contain the redirected transcript messages. The default transcript directory is/var/lib/jigasi/transcripts, unless configured otherwise. [S5][S11]Terminaldpkg-query -W -f='${Version}\n' jigasi sudo tail -n 200 /var/log/jitsi/jigasi.log sudo journalctl -u jigasi -n 100 --no-pagerThese package and log-query options are documented in the Debian manuals. [S8]
-
Both install types, before a released fix: test a controlled ending. After the final spoken sentence, keep the meeting and transcription active while waiting for its final result. Then end the meeting and compare the file. This is a mitigation to test, not a confirmed workaround or a prescribed number of seconds. The reporter says changing silence or buffer-flush intervals did not fully solve it. No verified configuration-only fix was found. [S1][S3][S4][S5]
-
Both install types with a
stable-11248web client: capture delivered finals independently. In an existing IFrame API integration, this diagnostic collector uses the released{ data }event envelope. Hereapiis your existingJitsiMeetExternalAPIinstance. [S9]JavaScriptconst finalCaptionChunks = new Map(); api.addListener('transcriptionChunkReceived', ({ data }) => { if (typeof data?.final !== 'string' || !data.final.trim()) return; const key = JSON.stringify([data.participant?.id, data.messageID]); finalCaptionChunks.set(key, data); });Persist collected finals in your application’s private storage before closing the page. The example only collects in memory. It avoids treating
stableorunstabletext as final, but cannot capture an unsent backend result. Earlier client versions need separate event compatibility checks. [S9][S10]
PR #650 is an experimental patch, not an approved production upgrade target. If testing a custom build, isolate it and record its exact commit. No released Docker tag or Debian package containing that PR was established. [S2][S6]
Verify
The version query prints 1.1-415-g2750d54-1 for the official stable-11248 image and cited package. That identifies the baseline; it does not prove a fix. [S6][S8]
For either install type, run a two-person test on meet.example.com. End with an easily recognized sentence, such as: The purple notebook is beside the window. Compare its final caption with the saved file’s last lines, then repeat with an immediate ending and with the controlled ending from step 4. Check words and speaker attribution rather than demanding identical punctuation. This is a proposed verification procedure based on the reported reproduction. [S1][S5]
Success requires the final sentence in the saved transcript. Wrote final transcript only proves a file was written. A clean WebSocket close alone is also insufficient if export still happens too early. [S3][S4][S5]
If it still fails
Check Skynet’s session log alongside Jigasi’s. Skynet logs its unsent-results warning when sending on a disconnected WebSocket. Its Interims and Finals counters distinguish response types; they do not prove Jigasi persisted every final. [S10]
For a custom PR build, compare completion and export order, and test backend inference that exceeds the proposed deadlines. Preserve logs and final/interim evidence from the same meeting. Do not diagnose every 1006 closure as this issue without the matching export sequence. [S2][S3][S4]
Vosk: its released end() sends a different EOF message and does not immediately call Whisper’s disconnect routine. It still shares Jigasi’s gateway export path, so this evidence cannot establish that Vosk is immune to all missing endings. Use the Vosk guide and test its shutdown separately. [S4][S12]
Bridge transcription: the handbook’s replacement path bypasses Jigasi, so it does not execute these two Jigasi methods. It has separate backend and storage behavior; migrating is not proof that all trailing-result loss is solved. Read bridge-based transcription before changing architecture. [S13]
For other setup errors, use transcription not working. Our transcription service can help compare the backend, browser and stored output.
FAQ
Which release fixes the missing last sentences?
No released fix was confirmed. PR #650 remains open and unmerged: not fixed as of 2026-10-12. [S2][S6]
Can I add EOF_WAIT_TIMEOUT_MS to .env?
No supported setting was found. EOF_WAIT_TIMEOUT_MS is a Java constant in the proposed patch, not a released Docker environment option. [S2]
Why did the caption appear but never reach the file?
The browser can display interim text, while Jigasi saves final results. Export may also happen before the final reply arrives. [S4][S5][S9]
Can I recover an already incomplete transcript?
Not from a missing final result in that file alone. Separately retained captions or audio may provide another source, but neither the issue nor PR supplies a reconstruction command. [S1][S2][S5]
Sources
[S1] Jigasi issue #645, 2026-07-20, community report; open when checked 2026-10-12.
[S2] Jigasi PR #650 and patch, 2026-09-25, proposed source code and contributor diagnosis; unmerged when checked 2026-10-12.
[S3] Released WhisperWebsocket.java, 2026-09-11 snapshot, source code.
[S4] Released TranscriptionGatewaySession.java, 2026-09-11 snapshot, source code.
[S5] Released Transcript and file publisher, 2026-09-11 snapshot, source code.
[S6] Latest Docker release, Jigasi image build log and stable package index, checked 2026-10-12, release note and official repository metadata/build evidence.
[S7] Transcriber Compose and properties template, 2026-09-14 release, source code.
[S8] dpkg-query, tail and journalctl, checked 2026-10-12, official Debian manuals.
[S9] Meet 11248 API sender, receiver, caption handling and payload, 2026-09-14 release, source code; event handbook, official doc.
[S10] Skynet connection manager, 2026-07-02 snapshot, source code; Docker exec and logs, checked 2026-10-12, official docs.
[S11] Jigasi service unit, 2026-09-11 snapshot, source code.
[S12] Released Vosk client, 2026-09-11 snapshot, source code.
[S13] Bridge transcription handbook, checked 2026-10-12, official doc.
Open questions
No real-server reproduction, dependable pause duration, patched-build completeness test, or first fixed release was verified. The report does not establish that every Whisper-compatible backend behaves identically. Vosk and bridge-provider shutdown need separate end-of-session tests. [S1][S2][S12][S13]