Show HN: Minnarone – Multimodal agents that watch, listen, and react live Carlos A. Rueda released Minnarone, an open-source framework for building multimodal AI agents that perceive live audio, video, and chat context and react proactively, initially supporting a chat-only shadow mode for Twitch. The framework generalizes a bot that participated in Twitch live streams indistinguishably from a human, and is available on GitHub under the MIT license. Cover of enkk's origin video. A reusable framework for building AI agents that perceive a live multimodal context audio, video/screen, chat, platform events and react proactively — both as a public participant streamer co-host, group commentator and as a private assistant suggestions for sellers, presenters, meeting participants . It grew out of the generalization of Minnarone , a bot that watched Twitch live streams and interacted in chat in a way indistinguishable from a human. An English Twitch shadow run: live chat, speech, and video become context, then Minnarone produces a candidate reaction without sending it. The first supported task is a chat-only shadow rehearsal: Minnarone reads the channel, builds candidate replies, records local evidence, and sends no Twitch message. From a clean clone: git clone https://github.com/carlitose/minnarone.git cd minnarone uv sync --extra tui cp .env.example .env mkdir -p .local/minnarone/onboarding/examplechannel cp -R examples/onboarding/. .local/minnarone/onboarding/examplechannel/ In the local copy, change examplechannel , soul.md , and facts/channel.md . Put the dedicated bot account's read credentials and the LLM key in .env ; never paste tokens into YAML. Then validate and run: uv run python -m minnarone .local/minnarone/onboarding/examplechannel/twitch-chat-shadow.it.yaml --check uv run python -m minnarone .local/minnarone/onboarding/examplechannel/twitch-chat-shadow.it.yaml --tui --check is local and lazy: it validates construction but does not prove a Twitch connection, hardware capacity, or first model inference. The run itself starts in shadow and requires an attended stop with Ctrl-C . These inputs have deliberately different jobs: | Input | Responsibility | Not its job | |---|---|---| YAML configuration | Select adapters, modes, models, providers, safety budgets, and cadences. | Persona prose or stable channel knowledge. | soul.md | Define identity, voice, values, and behavioral boundaries. | Runtime wiring or claims about the channel. | facts/ | Hold manually curated, sourced, stable facts about channels or interlocutors. | Learned memory, secrets, or prompt instructions. | Built-in prompt templates / prompts dir | Shape runtime instructions; an explicit prompts dir overrides packaged templates. | General configuration, soul, or facts. | Minnarone does not auto-learn persistent facts. Review each change. Use the prompt skill below for template overrides; onboarding must not blur that safety boundary. Chat-only shadow P0 . Start with, run twitch-chat-shadow.it.yaml --check , then observe candidate sends in the TUI. No write token is needed or read. Media smoke P1/P2 . Prove capture components separately before adding them to the agent. Follow the bounded chat, --no-chat --audio , VAD, and --no-chat --video commands in the Twitch operator guide /carlitose/minnarone/blob/main/docs/twitch-operator.md smoke-commands . Inspect .smoke/ /stats.json ; a smoke is evidence for that component only. Full multimodal shadow P3-P5 . Choose a hardware profile in the runtime model research /carlitose/minnarone/blob/main/docs/research/runtime-model-profiles.md , acquire artifacts explicitly at the revisions in the model manifest /carlitose/minnarone/blob/main/docs/runtime-model-manifest.json , and verify the complete bundle: required files, published SHA-256 digests, and a local loader smoke. A primary weight digest alone is not a readiness result. The Italianis a twitch-full-shadow.it.yaml P3-only MPS example . It uses English VoxCeleb CAM++ 3dspeaker speech campplus sv en voxceleb 16k.onnx , dimension 512 , and threshold 0.5 ; the older Mandarin 192-dimension artifact is not the public default. P4 CUDA and P5 llama.cpp require their profile-specific backend, device, model, and runtime settings; do not run it unchanged. Run every isolated smoke, then --check , then a bounded shadow TUI run while watching memory, queues, and latency. Attended live. Use a separate local config only after every gate below passes. A new live -configured session still starts in shadow. Inspect the candidate output, then press p twice within three seconds to promote. Press k for the immediate kill-switch; returning live always requires pressing p twice again. Never leave a live session unattended. Live is not the quickstart. It requires recorded broadcaster consent for the target channel, a dedicated bot account , an allow-list, and read/write tokens belonging to that account. The allow-list is a technical defense, not evidence of consent. Complete token validation for account, required scope, expiry, and revocation at startup and no later than hourly. A mismatch, 401 , revocation, missing scope, block, ban, or stop request means fallback to shadow or stop, never a best-effort send. Choose an honest disclosure mechanism appropriate to the channel: the bot profile, channel description, a clear response, or an announcement. Do not instruct the system to deny what it is. Minnarone currently sends through IRC; do not promise a Twitch Chat Bot Badge , which requires the supported Send Chat Message API/App-token authorization path and is not provided by IRC. The defaults max per minute: 1 and max per hour: 20 are conservative Minnarone budgets . They are not official Twitch limits and do not grant permission to fill Twitch's rate bucket. Keep both layers of constraints. Shadow still reads and stores data. A run can contain perceptions.jsonl , debug/prompts/ , debug/events.jsonl , summaries, and derived copies of chat. retention.perceptions days is reserved and inert; it does not delete data. Choose a purpose-bound duration, document an opt-out contact, stop the run, and perform manual deletion of the complete run directory and derived copies when requested, consent is withdrawn, or the data is no longer needed. The portable canonical skills are under .agents/skills/ on every checkout. Relative .claude/skills/ symlink aliases are optional conveniences on symlink-capable checkouts. With core.symlinks=false , Git may materialize an alias as a plain file containing only its target; that plain file is not a valid skill. Code agents must load the matching canonical .agents SKILL.md before acting. | Skill | Trigger | Actions | Boundary | |---|---|---|---| minnarone-prompts | minnarone-twitch-onboarding minnarone-runtime-doctor Humans can follow the paths above directly. Code agents should start at AGENTS.md /carlitose/minnarone/blob/main/AGENTS.md and contributors at ; both route architecture, quality, prompt safety, dirty-worktree handling, and skills. /carlitose/minnarone/blob/main/CONTRIBUTING.md CONTRIBUTING.md Minnarone was conceived and built by enkk , its original author and designer: a bot able to listen to and watch a Twitch live stream and to interact in chat with other users and with the streamer without anyone realizing they were talking to an artificial intelligence a kind of Turing test applied to chat . Origin video : https://www.youtube.com/watch?v=EkunaRO0uKg https://www.youtube.com/watch?v=EkunaRO0uKg Transcript :— the transcript of enkk's video from which the specification of this framework was derived. docs/source/transcript.md This repository generalizes that idea into a reusable framework: the same perception + reaction engine serves different use cases Twitch, Teams meetings by changing only the configuration. Disclaimer: This project was inspired by Enkk's idea and video. However, it is not affiliated with him, and he is not involved in the maintenance of this repository. — requirements, user stories, use cases, edge cases, system design and roadmap. Project specification /carlitose/minnarone/blob/main/docs/SPECIFICATION.md — capture smoke, VAD diagnostics, Twitch operator guide /carlitose/minnarone/blob/main/docs/twitch-operator.md adapter: twitch runtime and enabling public send shadow/live .— synthesizer and suggester profiles on Teams via Meeting assistant guide /carlitose/minnarone/blob/main/docs/meeting-assistant-operator.md adapter: os capture .— transcript and screenshots from which the specification was derived. Source material /carlitose/minnarone/blob/main/docs/source The "Minnarone" app starts from a YAML configuration file soul, facts, adapter, provider, cadences, mode — without writing code. Prerequisites : Python 3.11+ 3.12 recommended — see .python-version . First create and activate a virtual environment. With uv https://docs.astral.sh/uv/ recommended : uv venv create .venv activate it pick your shell : source .venv/bin/activate macOS / Linux source .venv/Scripts/activate Windows — Git Bash .venv\Scripts\Activate.ps1 Windows — PowerShell .venv\Scripts\activate.bat Windows — cmd uv pip install -e . core uv pip install -e '. tui ' + observability dashboard textual uv pip install -e '. audio ' + Twitch audio runtime: faster-whisper + sherpa-onnx ASR + speaker uv pip install -e '. video ' + Twitch video runtime: Streamlink Python + PyAV uv pip install -e '. vlm ' + captioning vlm.backend: qwen : transformers + torch/torchvision + Pillow uv pip install -e '. vlm-llamacpp ' + captioning vlm.backend: llamacpp : Pillow only via multimodal llama-server, no torch uv pip install -e '. os-capture ' + system audio capture soundcard and screen capture mss Validate the config and build the agent dry-run, no loop, no network : python -m minnarone path/to/config.yaml --check Start the live reaction loop: python -m minnarone path/to/config.yaml Start with the observability TUI dashboard requires the tui extra : python -m minnarone path/to/config.yaml --tui Replay a past run or a perceptions.jsonl offline replay dashboard : python -m minnarone --replay