# character

CLI-first prototype for a headless chat-reactive VTuber that connects to stream.place.

## Goal

Take chat messages from stream.place, generate spoken replies, and drive a VTuber/avatar output stream with:

- chat intake
- LLM response generation
- TTS audio output
- avatar motion/expression events
- video/audio composition suitable for live streaming

## Architecture sketch

```text
stream.place chat (Jetstream / ATProto)
  -> bot runtime
  -> reply planner
  -> TTS provider
  -> avatar controller
  -> ffmpeg compositor / scene renderer
  -> WHIP/RTMP uplink
```

## Current direction

This repo starts with a headless-friendly prototype:

- TypeScript runtime via bun
- stream.place chat adapter stub
- Gemini Live-compatible TTS/voice adapter interface
- avatar event bus for motion/expression cues
- local dev scripts for simulation and testing

## Open questions

- best headless avatar renderer on Linux
- whether to use browser-based canvas capture or native renderer
- whether Gemini Live should handle both reply generation and speech output
- whether stream.place posting should use ATProto OAuth directly or a simpler bot identity path

## OpenVT path

This repo now includes a simple OpenVT-oriented setup path:

- `scripts/openvt-setup.sh` clones upstream OpenVT and initializes submodules
- `docs/openvt-setup.md` explains the constraints and manual steps
- `scripts/openvt-run-notes.sh` prints the expected local streaming workflow

Run:

```bash
chmod +x scripts/openvt-setup.sh scripts/openvt-run-notes.sh
./scripts/openvt-setup.sh
./scripts/openvt-run-notes.sh
```

## Wayland / WayVNC launch

If the machine already has a remote Wayland session, launch OpenVT into that session with:

```bash
devenv shell -- ./scripts/openvt-wayland-launch.sh
```

See `docs/wayvnc-openvt.md`.
