Three voices, one switch
Gemini, Claude and GPT sit behind one provider trait. Each channel can choose its model without taking Luna offline.
A town built down a hillside above the water, with an observatory on the ridge above it: the dome stands open along a slit and the telescope inside tracks slowly across the sky. Windows warm and dim on their own rhythms behind the rooflines, smoke drifts from the chimneys, two figures walk the road above the water, and fireflies wander over it. On the hilltop beside the observatory a wolf-eared girl in a red scarf stands watching the moon. At night the roofs are plum-dark under a low moon and a field of stars; by day the hills are green, the roofs are red tile, and the moon has faded to a pale disc in a hazy blue sky.
The observatory — meet Luna
A Twitch chatbot written in Rust — a clever, mischievous wolf girl who listens to a room full of voices and answers as part of the room, not above it.
Private repo — source code is in a private repository
Inside the observatory
Luna is built around context: what the room is saying, what it has said before, and what is happening on the stream right now. The machinery stays behind the personality.
Gemini, Claude and GPT sit behind one provider trait. Each channel can choose its model without taking Luna offline.
When the conversation needs visual context, Luna can pull a stream frame and carry it into the answer.
Chat history lives in Postgres and is recalled through local embeddings and Qdrant, blended with recency.
Autonomous messages are paced like one reasonably active chatter instead of a timer trying to fill silence.
Trivia, reminders, a timeout game, stocks and 7TV emote search are spread across nine command categories.
Personality and model choices are channel-specific, so Luna can fit the room she has joined.
A signal crosses the room
The path is deliberately small. Each step adds context without turning a chat reply into a dashboard workflow.
Twitch events and chat messages arrive as one stream of room context.
Relevant memories and, when requested, a current stream frame join the prompt.
The channel-selected provider writes one reply in Luna’s voice and sends it back to chat.
Open the observatory
Sign in with Twitch, choose the channel settings in the dashboard, and connect Luna when the room is ready for her.