# Headless VTuber architecture notes

## Recommended first build

Use a split architecture:

1. Chat/runtime process on the headless machine
2. Avatar renderer as either:
   - a headless browser scene with sprite layers and viseme/expression animation, or
   - a Linux-native VTuber renderer if one exposes remote control hooks
3. ffmpeg composition and push to stream.place via WHIP or RTMP

## Why not start with a full Live2D rig?

Live2D-on-Linux headless is possible but likely slows iteration. First prove:

- incoming chat
- generated reply
- synthesized audio
- deterministic motion/expression events
- continuous video stream

Then swap the renderer.

## Recommended prototype phases

### Phase 1

- simulate stream.place chat locally
- generate reply text
- synthesize or stub audio
- emit avatar actions like `talk:start`, `emotion:happy`, `head:nod`
- render a simple animated scene to a test stream or file

### Phase 2

- connect real stream.place chat feed
- post replies back to chat
- map reply prosody/emotion to avatar events

### Phase 3

- replace simple avatar scene with a real VTuber rig
- add interrupt handling, queueing, moderation, and pacing

## Candidate render paths

### Path A: Browser/canvas renderer

Pros:

- easiest to automate from CLI
- easy websocket control
- easy capture with Chromium or ffmpeg from a virtual display
- good enough for a first expressive avatar

Cons:

- not a full Live2D rig

### Path B: OpenVT or custom Godot scene

Pros:

- closer to real VTuber motion
- Linux-native

Cons:

- more integration work
- remote-control API may need custom glue

### Path C: OBS scene graph on another machine

Pros:

- simplest if final stream production happens elsewhere

Cons:

- not fully headless/self-contained
