Self-hosted live AI VTuber
Run your own living, talking co-host.
Puppet is the engine behind AI VTubers, minus the weeks of plumbing. Bring a model and a voice, attach a Godot avatar, and it handles the live loop, chat, moderation, and memory - on hardware you already own.
2D AVATAR IN GODOT · YOUR OWN LLM + VOICE · NO CLOUD LOCK-IN
The loop
Chat goes in. Personality comes out.
Four steps, all self-hosted, all yours. Every AI VTuber runs this same loop - Puppet just makes it a weekend job instead of a quarter.
- 01
Ingest
Pull chat from Twitch, YouTube, or any socket. Spam filtering, a ban-word list, and per-user cooldowns keep the feed sane before a single brain sees it.
- 02
Reason
Your LLM, local or hosted, with a persona prompt and rolling memory. If you self-host the model, nothing leaves your box.
- 03
Speak
A text-to-speech of your choice turns the reply into spoken lines. The engine tracks speech timing so the avatar stays in sync.
- 04
Puppet
A Godot avatar lipsyncs and emotes from audio and message signals, rendered live in the stream. This is the layer most people skip.
The wedge
Your edge is a real avatar, not the same rig.
Every AI VTuber is starting to look identical: the same stock Live2D model, the same canned emotes. The one genuinely hard, opinionated layer in the whole stack is the avatar itself - and it's exactly the part you can build better.
- A character rendered in real time in Godot: physics for hair and cloth, a real animation tree for expressions, no per-frame export fees and no per-seat rig costs.
- Live2D tools price by rig and export. Godot is a free engine, so your avatar is an asset you own outright, not a license you rent.
- A puppet you control in code: mood, energy, lip-sync and blink all driven by the same signals that make the brain talk.
# avatar.gd - drive expression from the pipeline
@onready var mouth := $Mouth
func on_speak(state: Dictionary) -> void:
mouth.target = state["envelope"] # 0.0 - 1.0 from TTS
$Blink.pace = 4.0 * state["energy"]
play("talk" if state["speaking"] else "idle")
func on_chat(ev: ChatEvent) -> void:
bubble.push(ev.author, ev.text)
mood.set(ev.sentiment)Your model, voice, persona and avatar are your assets. The engine is the loop that makes them talk in public without you holding every string.
Who pays, and why
A small stream crew is enough to start.
Not a platform play, not a billion-user bet. One narrow customer, one clear job.
The buyer
Solo VTubers and small stream teams who want an autonomous co-host for off-peak hours, hosting, and IRL chat without assembling a pipeline from scratch.
Why they pay
Building this plumbing across LLM + TTS + a chat bot + an avatar + moderation is weeks of work and a tangle of monthly services. Puppet bundles it self-hosted, on hardware they already own.
Revenue path
Free open-source Godot avatar to pull in the community. A paid tier for the managed pipeline - hosted routing, voice, bot, analytics - at a flat monthly. A custom-avatar studio later.
Next proof point
One live stream decides it. Run a demo Puppet VTuber on a small channel for a set number of hours and measure two numbers: engaged minutes per viewer, and moderation incidents under load. That data tells you whether this is a product worth shipping - and it's the first milestone for a single developer.
See the loop in two minutes.
The demo above is a working prototype of the live side. Send a message, watch the puppet talk back, and picture your own avatar in the frame.