Your AI. Your Character. Your World.
An open-source AI companion with a virtual avatar that talks, reacts, and gets things done.
VirtualClaw combines a live virtual character with a powerful AI agent backend — bridging the expressiveness of projects like AIRI/moeru-ai with the agent capabilities of OpenClaw, wrapped in a character system inspired by SillyTavern.
- 🎭 Virtual avatar that reacts with real emotions (happy, thinking, focused, surprised...)
- 💬 Natural conversation via streaming WebSocket connection
- 🔀 Multi-LLM support — Claude, OpenAI GPT, or local Ollama models
- 🛠️ Agent-ready architecture — tools and skills coming in Phase 2
- 🔒 Self-hosted, privacy-first — your data stays on your machine
virtualclaw/
├── apps/
│ └── web/ # React frontend (avatar + chat UI)
└── packages/
└── agent-gateway/ # Node.js backend (WebSocket + multi-LLM)
Flow:
User → Chat UI → WebSocket → Agent Gateway → LLM Router → Claude / OpenAI / Ollama
↓
Emotion Detector → Avatar animation state
- Node.js 20+
- At least one LLM API key (or Ollama running locally)
git clone https://github.com/Kiendt91/virtualclaw.git
cd virtualclaw
npm installcd packages/agent-gateway
cp .env.example .env
# Edit .env and add your API key(s)LLM_PROVIDER=claude # claude | openai | ollama
ANTHROPIC_API_KEY=sk-ant-... # for Claude
OPENAI_API_KEY=sk-... # for OpenAI
OLLAMA_BASE_URL=http://localhost:11434 # for Ollama# From root — starts both gateway and web app
npm run devOr start separately:
npm run dev:gateway # http://localhost:3001
npm run dev:web # http://localhost:5173Visit http://localhost:5173 and start talking to your AI companion!
cp packages/agent-gateway/.env.example .env
# Fill in your API keys in .env
docker compose upApp available at http://localhost
Connect to ws://localhost:3001/ws
{
"type": "chat",
"id": "msg_001",
"content": "Hello!",
"history": [],
"options": {
"provider": "claude"
}
}| Event | Description |
|---|---|
chat_start |
Stream begins, returns provider + model |
chat_chunk |
Streamed text delta |
chat_end |
Full response + emotion tag |
error |
Something went wrong |
status |
Current server config |
The gateway automatically detects and returns one of:
idle · happy · excited · thinking · focused · surprised · proud · sad
-
Phase 1 — MVP ← We are here
- Agent Gateway with WebSocket streaming
- Multi-LLM support (Claude, OpenAI, Ollama)
- Emotion detection system
- React frontend with animated avatar placeholder
- Docker Compose setup
-
Phase 2 — Character System
- Live2D / VRM avatar renderer
- Character card system (SillyTavern-compatible import)
- Persistent memory (SQLite)
- Lorebook / world info
-
Phase 3 — Agent Power
- Tool execution (file, shell, browser)
- "Working" avatar state during task execution
- Telegram / Discord channel support
-
Phase 4 — Desktop & Community
- Tauri desktop app
- Community character card repository
- Plugin SDK
All skill levels welcome! See what's needed:
| Area | Skills | Good first issue |
|---|---|---|
| Avatar Engine | Three.js, Live2D SDK | Replace emoji with VRM model |
| Backend | Node.js, TypeScript | Add new tool (e.g. weather API) |
| Frontend | React, CSS | Improve chat UI animations |
| AI/ML | Python | Better emotion detection model |
| DevOps | Docker | GitHub Actions CI/CD |
- Fork the repo
- Create a feature branch:
git checkout -b feat/my-feature - Commit your changes
- Open a Pull Request
MIT — use it, fork it, build on it.
Made with ❤️ for the open-source AI community