On 8 November 2026 Open WebUI published v0.13.1 and, the same day, v0.13.2. The release notes introduce Tether, a desktop companion app for macOS, Windows and Linux that signs in once and makes the local machine appear under “Your devices” so models and coding agents can operate on real files, repositories and tools. Tether connects outbound; no inbound ports are required. Sessions expire after 90 days of inactivity by default (SESSION_EXPIRES_IN). Coding agents such as Claude Code, Codex and Pi now surface in the model picker on an Open Terminal that offers them. Tool chats also keep a stable prompt prefix so provider caches can hit.
That is useful for terminal-driven workflows. It does not change the fact that any agent which needs live microphone audio—voice commands, real-time transcription, overlay captions during a call—still has to fight the Windows audio engine first.
Core Audio architecture. Shared mode mixes through the engine; exclusive mode bypasses it but still sits behind the driver and any DPC traffic on the same cores.
The desktop agent path is still a capture path
Tether (and the companion Open WebUI Desktop) gives agents a process boundary and file-system access. When the agent needs to hear the user or the remote party, the samples have to come from somewhere. On Windows that somewhere is almost always WASAPI:
- A capture client (shared or exclusive) requests a period—commonly 10 ms, sometimes 5–8 ms if the driver exposes a smaller buffer.
- The audio engine (or the exclusive endpoint) timestamps and, in shared mode, mixes, applies communications enhancements or spatial audio if enabled, and delivers the buffer.
- Any long ISR/DPC on a core the audio thread or mixing engine needs will push the next buffer past the period. The client either receives a larger packet or an underrun.
- Your front-end (whisper.cpp, a GGUF ASR, a local Ollama endpoint, or a BYOK streaming client) only sees the late or incomplete frames.
A 2–3 ms DPC spike is enough to push a 10 ms buffer into glitches or force the STT model to wait for the next stable partial. Speculative decoding or chunked models cannot recover samples that never arrived. Process affinity and ProBalance help with user-mode contention; they do not shorten an ISR that already owns the CPU.
Practical capture for overlays and local agents
A minimal real-time loop that stays off the audio callback looks like this (C# / NAudio style, or the equivalent in C++ with WASAPI):
// Shared-mode capture, event-driven, then hand off immediately var capture = new WasapiCapture(); capture.ShareMode = AudioClientShareMode.Shared; capture.DataAvailable += (s, e) => { // Copy into a lock-free SPSC ring (power-of-two, no alloc on writer) ring.Write(e.Buffer, e.BytesRecorded); // Signal consumer; do not resample or VAD here }; capture.StartRecording(); Consumer thread:
- Pulls from the ring.
- Resamples 48 kHz → 16 kHz mono int16 if the model expects it (roughly 1–3 ms on a modern CPU if you stay off the callback).
- Runs a lightweight VAD or energy gate (2–5 ms).
- On speech start, opens or reuses a streaming connection (local GGUF, Ollama HTTP, or BYOK endpoint) and sends 20–40 ms chunks.
The overlay or UI update must paint on a dedicated thread or via a message queue so it stays under one frame (≈16 ms). If the consumer and the model share a core with a noisy driver, affinity rules or a CPU Set become necessary.
Tether and Open WebUI give agents file and terminal access. Audio still has to cross the same engine boundary.
Trade-offs that still matter
- Shared mode is convenient and survives device changes, but the engine can inject extra buffering and enhancements. Exclusive mode reduces that latency at the cost of exclusive device ownership and more brittle device-change handling.
- Local models (Qwen3-ASR 1.7B Q4_K_M around 1.3 GB, LFM3-audio in the 1.5–2.4 GB range, or a small Whisper.cpp build) eliminate network RTT but still require clean, timely PCM. A 35–50 ms time-to-final on the model side is real once the samples arrive; it is irrelevant if the capture path already dropped or delayed them.
- BYOK streaming endpoints keep the model off the machine, which is attractive when VRAM or thermal headroom is limited, but they add RTT and make the capture-to-network hand-off the new critical section.
- Tether’s outbound connection and 90-day session are fine for file and terminal work. For continuous audio they do not remove the need for a stable local capture client that can survive sleep, device swaps, and long DPC spikes.
What to measure first
Before blaming the model or the agent framework:
- Record the actual WASAPI period and the observed buffer sizes under load.
- Check LatencyTest / ETW for ISR and DPC durations ≥ 2 ms on the audio or GPU driver.
- Confirm the consumer thread is not running on the same core as a noisy interrupt.
- Measure end-to-end partial latency (speech end → first overlay token) rather than only the model’s published TTFS.
Tether and the new coding-agent surface in Open WebUI 0.13.1 make local desktop agents more practical. The samples those agents need for real-time voice still have to survive the Windows capture path first. That path has not changed.
I'm building Talkaside, a Windows app for job interviews and calls in another language.
Drafted with AI assistance from this project's code and logs.


