What it is, why we landed on it, what it costs, and exactly what it takes to build and run. The self-hosted ASR half of the transcription engine that sits behind our own Jitsi.
TL;DR. Today meet.boas.dev already hosts meetings — but on 8x8's hosted Jitsi (JaaS), which structurally cannot give us live, speaker-attributed transcription. The engine we want plugs a bot (jigasi) into our own Jitsi, splits each speaker's audio, and streams it to a self-hosted Whisper service (skynet) on a GPU box. That GPU box is the one piece that doesn't exist yet. This guide is how we stand it up.
The honest scope line: G0 (our Jitsi) is just a meeting server — no better than meet.boas.dev until this (G1) lands. G1 is where the value actually appears: transcription that knows who said what, in Icelandic and English, without sending a syllable to Google.
Why build this at all when meetings already work?
Meetings working ≠ transcription working. The operator's ask was never "host a call" — it was "something we can plug into a meeting for live transcription with automatic speakers, that slots into the pipeline." That is a fundamentally different capability, and it is what G1 delivers:
/summarize + /action-items write straight back to meetings, crm_deals, metis_tasks.Key structural fact: only skynet needs a GPU. jigasi talks to it over a WebSocket, so the Jitsi box and the GPU box can be entirely separate machines — which is why G0 (jitsi) is not blocked on GPU procurement, and why the GPU is a G1-only cost.
This is not a fresh guess. The stack was chosen in May 2026, ratified by Athena, PRD'd by Metis (#110), and then adversarially re-verified in a 7-week freshness pass (hermes, 2026-07-07, decision-grade / T-deep).
| When | What happened | Outcome |
|---|---|---|
| May 2026 | Landscape research across meeting-bot + ASR options; stack chosen: jitsi/skynet + jitsi/jigasi + IS-Whisper + local LLM | Athena-ratified, Metis PRD #110 |
| Jul 2026 | 7-week freshness re-scan — did anything newer displace it? Meeting-bot vendors (Recall.ai, Vexa, Attendee, MeetingBaas), streaming ASR (NVIDIA Nemotron/Parakeet), diarizers (pyannote 4.0) | Nothing displaces it. None of the vendors support Jitsi at all deep-read |
| Jul 2026 | Speaker-attribution claim re-checked against jigasi source code (not blog posts) | Confirmed at code level — per-SSRC roster mapping, no mixing code-verified |
| Jul 2026 | Operator ruled out all Google Cloud; asked for a deliberate in-meeting language toggle (not mid-sentence) | JaaS-native path killed; toggle confirmed buildable (small skynet patch) deep-read |
| Jul 2026 | G0 fleet sweep (proteus) — is jitsi already self-hosted anywhere? | No. Greenfield. meet.boas.dev = 8x8 JaaS, now recorded in fleet_services |
Source discipline: the architecture + attribution + licensing claims below are deep-read from the hermes T-deep refresh (primary sources: jigasi/skynet source, 8x8 dev portal, HF model cards). Live GPU pricing is estimate — verify at purchase. Streaming-ASR competitor dates are snippet-tier — re-verify before any build reliance.
Four hard constraints collapse the option space to exactly one path:
| Constraint | Kills… | Leaves… |
|---|---|---|
| Self-host mandatory (privacy; no client audio to third parties) | JaaS-native transcription (Google STT), Recall.ai & all hosted meeting bots | Self-operated stack only |
| Speaker attribution must be reliable | Acoustic diarization as the primary path (guesses, confuses on overlap) | Roster-based tagging → needs jigasi inside the conference |
| jigasi needs XMPP-server access | Attaching to 8x8/JaaS (closed; won't expose Prosody/Jicofo config) | Our own Jitsi (G0) — the whole reason to self-host |
| Bilingual IS/EN, no Google | Cloud STT, and IS-less models (Canary, Voxtral, Parakeet) | Whisper large-v3 (only confirmed IS+EN, streaming, permissive) on our GPU = skynet |
Every arrow points to the same place: self-hosted Jitsi + jigasi + skynet(Whisper) on a GPU box. It is not a preference — it is what survives the constraints.
| Component | Role | GPU? | License / note |
|---|---|---|---|
| Jitsi (Prosody/Jicofo/JVB/web) | The conference. JVB is an SFU — one clean audio stream per speaker | No | Apache-2.0 · G0 ready |
| jigasi | Joins server-side, maps each RTP stream → roster identity, tags speaker_id|lang, ships to skynet | No | Apache-2.0 · the attribution engine |
skynet streaming_whisper | Receives tagged audio chunks, runs Whisper, returns text with the tag echoed back | Yes | Jitsi/8x8 OSS · needs per-stream lang hint |
| Whisper large-v3 (+ IS fine-tune) | The ASR model. Stock v3 for EN; an IS fine-tune/LoRA for Icelandic speakers | Yes | MIT (base) · LoRA jonasaise preferred |
| Local LLM | /summarize, /action-items → structured write-back | Yes | Runs on the same GPU box |
| pyannote community-1 | Fallback diarizer (retro transcripts / safety net) | Yes (batch) | CC-BY-4.0 · v4.0, 2026-07-07 |
docker-jitsi-meet on srv908592 (co-host), jigasi transcriber prereqs, DNS + resource caps. Runbook written; hades supplied traefik wiring; deploy is a go the day transcription is wanted. Not deployed today — see §9.
A box with a 24 GB-class GPU (see §7). Install NVIDIA driver + CUDA + container toolkit. This is the gating dependency for everything below.
Run streaming_whisper in Docker on the GPU. Load stock whisper-large-v3(-turbo) for EN + the IS fine-tune. Expose the WebSocket endpoint for jigasi.
The historically fiddly step: Prosody transcriber VirtualHost, brewery-room MUC, Jicofo BREWERY. Point jigasi's transcription websocket at skynet. Budget iteration time here — forum pain is almost all setup, not runtime.
Config, not code: EN speakers → stock v3; IS speakers → IS fine-tune. skynet selects model per stream from the roster language.
Small scoped patch to skynet (state.py, meeting_connection.py): re-read a participant's language mid-call instead of latching it at first chunk. jigasi already does the live half for free. ~2–3 files, no model reload.
Run a few hundred English utterances through each IS checkpoint and measure the English error delta vs stock v3. Cheap; prevents a fine-tune that silently degrades English.
Recording/transcription consent is a production gate, not optional. Must be in place before any real client call is transcribed.
/summarize + /action-items → meetings/crm_deals/metis_tasks. Add dropped/unmapped-SSRC logging (see Don'ts) and a diarization fallback path.
~$2,000–3,500 one-time
RTX 4090 / 3090 (24 GB) mini-tower or workstation. Amortizes vs cloud in 2–4 months at always-on. Fits the fleet's owned-hardware pattern (N5). Ongoing: power + our own ops.
~$500–1,000 /mo always-on
L4 / A10 (24 GB) at ~$0.7–1.5/hr on-demand. Cheaper on spot or if you only spin it up per-meeting. Better if usage is bursty; worse if always-on.
Software cost is $0 — every component is OSS (Apache-2.0 / MIT / CC-BY). The GPU is the whole line item. No per-minute STT fees (that's the entire point of leaving JaaS/Google).
jonasaise) — frozen base structurally preserves English.fleet_services.| Item | Effort | Note |
|---|---|---|
| skynet + Whisper deploy | Moderate | Docker + GPU drivers/CUDA; standard once the box exists |
| jigasi attach (brewery/XMPP) | Moderate–fiddly | The historically painful step; budget iteration |
| Language-toggle patch (D7) | Small | 2–3 python files, scoped, no model reload |
| EN-WER eval | Small | A few hundred utterances per candidate |
| Consent flow (D5) | Moderate | HARD GATE — legal/privacy, blocks production |
| Write-backs + instrumentation | Moderate | Integration into meetings/crm_deals/tasks |
| Ongoing GPU ops | Continuous | proteus daemon/process domain; monitoring, dropped-segment alerts |
meet.boas.dev. It gets deployed in lockstep with G1, when the transcription that justifies it is close.Sources & provenance. Architecture, attribution mechanism, licensing, and model claims: hermes T-deep refresh constellation-hermes/research/meeting-transcription-refresh-2026-07-07/ (primary: jigasi/skynet source, 8x8 dev portal, HF model cards) + the ratified May-2026 landscape arc. Infra/host/DNS facts: proteus G0 sweep (Task 064/065), fleet_services, live srv908592 inspection. GPU pricing = estimate, verify at purchase. Board: metis #110 (Track D), #41 (Phase-1 infra).
Prepared by proteus · Pantheon infrastructure · 2026-07-08 · for operator review ahead of GPU procurement.