📈 GH Trending Explorer 🎲 Surprise me

← all repos

mutuals-inc / character-harness

git clone https://github.com/mutuals-inc/character-harness.git

The harness Mutuals uses to give life to its characters

—
stars, 24h
+32
stars, 7 days · #1,251
+32
stars, 30 days · #8,486
32
★ total · +32% this week
8
forks · 4 open issues

Star history starts 2026-10-20; the chart appears after the second daily snapshot.

LanguageTypeScript
LicenseApache-2.0
Created2026-10-13 (7d ago)
Last pushtoday
Watchers2
OwnerOrganization

Links

README excerpt
# Mutuals Character Harness
The harness Mutuals uses to give life to its characters: a character you can talk to by voice, with a face and body that react to what it says.
> Status: pre-release. The runtime and the player work end to end. Ready-made player builds are on this repo's GitHub Releases, or you can build the player yourself with the Kaigen engine.
## How it works
The **runtime** runs the conversation: it hears you through ElevenLabs speech to text, writes the reply with a chat model, speaks it with an ElevenLabs voice, and stages each sentence with an emotion, a talking style and a gesture. The **player** app renders the character, plays the voice and captures the mic; it is written in C on the Kaigen engine and connects to the runtime over a local WebSocket.
A character is a folder with a manifest, a personality prompt and a body: any VRM model, with the animations you bring. Extensions add behavior on every turn.
## What's inside
| Folder | What it is |
|---|---|
| `runtime/` | The conversation loop, and the preparation of VRM models and their animations for the player. |
| `player/` | The app that shows the character. Building it needs a Kaigen licence; using a release build doesn't. |
| `extensions/` | Plug-ins that run on every turn: `emotion-tags` changes the face from a sentence's delivery tag, `director` stages each line, `memory` remembers what the user tells the character, `reactions` starts each reply with how the character took what the user said. |
| `examples/` | Example extensions to copy from. `gesture-cues` is the one `docs/your-first-extension.md` builds. |
| `characters/` | Character manifests. `foxglove/` is the reference character. |
| `docs/` | How the pieces fit. Start with `docs/architecture.md`. |
## Quickstart
Needs Node 23.6 or later and the keys the character uses. FoxGlove needs two:
- `ELEVENLABS_API_KEY` (ElevenLabs): speech to text and the character's voice.
- `XAI_API_KEY` (xAI): the character's chat model and the director that stages its lines.
The `memory` and `reactions` extensions, if a character uses them, need `TYPESAFE_API_KEY` (Typesafe).
1. Copy `.env.example` to `.env` and fill in the keys.
2. Run `npm install`, then `npm start` for FoxGlove, or `npm start -- characters/ ` for your own character (`docs/bring-your-own-character.md`). `npm run check -- characters/ ` checks a character without starting it.
3. Start the player: a release build, or your own build (`player/README.md`). Set `HARNESS_PLAYER` in `.env` to the command that opens it, and `npm start` opens it too; otherwise the runtime prints what the player needs.
4. Open Claude Code or Codex in this folder and ask it to change something. `AGENTS.md` tells it where everything lives.
`npm test` runs the tests; they need no keys or network.
## Docs
- `docs/architecture.md`: the turn loop and the event system
- `docs/character-manifest.md`: what a character is
- `docs/extensions.md`: how to write an extension
- `docs/your-first-extension.md