Composition root
app_shell.py wires the motor thread, health monitor, OBS client, SmartAggregator, Stream Admin, topic inbox bridge, TTS controls, and UI panels through typed protocols. Keep it orchestration-only; push logic into testable modules.
This section was refreshed against Engram project memory and the current website copy. It separates shipped behavior from old marketing copy and future work, because developer documentation is only useful when it refuses to overpromise.
Green claims were already aligned with project memory. Amber claims were corrected in this pass. Blue claims are active-development boundaries that developers should not treat as release guarantees.
OpenCohost is the orchestration chassis
Correct: the product value is coordinating Ollama, TTS, LiveAudio context, Agenda Mode, chat reaction, profiles, avatar/music presence, and resilience rather than being only a wrapper.
The voice story is not just Qwen-TTS
Updated: the verified implementation includes Piper local synthesis, optional Edge-TTS light synthesis when privacy allows it, and active custom/Qwen voice work. The docs no longer promise a guaranteed Qwen-only stack.
Local-first does not mean compute-free
Correct: local mode avoids default cloud/API billing, but developers must still budget GPU/VRAM, RAM, electricity, model choice, game load, and setup time.
LiveAudio stays a separate bridge
Correct: voice listening, Silero VAD, Whisper transcription, subtitles, transcripts, and clean voice context belong to the LiveAudio bridge rather than an always-on OpenCohost microphone path.
No fake waitlist or installer promise
The rendered FAQ no longer claims a public installer or email waitlist path as if it existed. Access remains active development until a real release flow is implemented.
Composition root
app_shell.py wires the motor thread, health monitor, OBS client, SmartAggregator, Stream Admin, topic inbox bridge, TTS controls, and UI panels through typed protocols. Keep it orchestration-only; push logic into testable modules.
UIState observer
A framework-agnostic, thread-safe state container with typed properties. Observers dispatch on a daemon thread; UI callbacks must hop back to the Tk main loop before touching widgets.
Priority queue + accumulation
The motor thread prioritizes real-time inputs such as PTT, chat, and agenda work while compacting overflow into bounded consultations so local models are not buried by raw stream noise.
LLM tier switching
Manual Quality / Balanced / Fast slots map to Ollama model tags. Switching preserves conversation/profile state and rolls back to the last known good model on failure.
Privacy-aware voice path
The TTS path supports Piper local synthesis, persisted Piper speed presets, and a tts_local_only switch that blocks Edge-TTS before text can leave the machine.
Human-gated topic intake
The topic inbox lets agents propose ideas, but approve remains human-only. Read-time namespace validation, short SQLite timeouts, and rollback keep UI suggestions safe under load.
Avatar state bridge
A pub/sub bridge lets core modules signal avatar states without coupling to UI or OBS. OBSClient can subscribe and update image sources when state changes.
Degradation ladder
Agenda recovery and model switching prefer graceful degradation: retries, stale-prefetch discard, explicit pause states, and rollback instead of silent deadlocks during a live show.
TTS local-only switch
tts_local_only.json is persisted under config. When ON, the motor routes light synthesis to Piper and server_qwen.py returns HTTP 400 before any Edge-TTS call can run.
Piper speed presets
The UI exposes Rápida, Media, Calma, and Lenta presets backed by length_scale values. Engine changes persist to tts_speed.json and rebuild Piper synthesis config under lock.
Agenda double-close fix
The controller no longer prefetches a second kira-agenda-stop while a topic is already CLOSING, and stale prefetched actions are discarded instead of played later.
Topic inbox
Agents can propose topic candidates with the ti_ namespace. UI polling is fail-open, approval is human-only, and failed queue operations roll back approved rows.
OpenCohost does not have a formal plugin system yet, but developers can extend these surfaces deliberately: