Yumii — Open-source, locally-runnable AI companion: a desktop voice orb (Live2D avatar mode coming soon).
Project description
Yumii 🌸 — An AI Companion for Your Desktop
Yumii is an open-source AI companion that lives on your desktop — a floating orb you talk to, with real-time voice, six personalities, and a memory of your life together that stays in a file on your machine. Runs on a normal CPU, no GPU needed.
⚠️ Alpha — no API stability promise yet. The voice loop, personalities, persistent memory (recall of any past conversation, self-written facts, session summaries with time sense), and tool-calling behind a human-in-the-loop gate all work end-to-end. The animated Live2D avatar is a planned "coming soon" mode. See
CHANGELOG.mdandROADMAP.md.
⚡ Install (one command)
Windows (PowerShell):
iex (irm https://yumii.me/install.ps1)
That's the whole install. It sets up uv, a private Python 3.12, Yumii's backend, and the desktop app — then puts Yumii in your Start Menu. Open her, paste one API key in the ⚙️ dashboard (a free Groq key is plenty, or an Ollama key), and start talking. Her local voice model downloads itself the first time she speaks.
Updating: re-run the same command.
macOS / Linux: the desktop shell is Windows-first for now —
curl -fsSL https://yumii.me/install.sh | bash installs the backend for
development, and the native shells are on the roadmap.
✨ What Yumii Does
- 🎙 Listens — Silero VAD + Whisper (local or Groq cloud), with a manual mic mute
- 🧠 Thinks — Groq, Ollama Cloud, OpenAI, or Anthropic, with a persistent personality
- 🗣 Speaks — Kokoro (fully local, no API key) or ElevenLabs / CAMB.ai, streamed in real time
- 🛠 Acts — tools (web search, Gmail/Calendar/Notion via Composio) behind a permission gate
- 🧠 Remembers — searches every past conversation (local FTS), writes and corrects her own facts, and knows when you last spoke and what happened — all in local SQLite
- 🟢 Reacts — a floating orb that pulses and shifts colour with the conversation (Live2D avatar mode coming soon)
- 🔐 Private by architecture — no account, no server, nothing phones home; API keys
live in an owner-only local file, memory lives in
~/.yumii/
🛠 Run From Source (developers)
Needs uv, Rust + MSVC C++ Build Tools (Windows); WebView2 ships with Win 10/11.
git clone https://github.com/CodeNeuron58/Yumii.git
cd Yumii
uv sync
cd desktop && npx @tauri-apps/cli dev # the desktop app — the only way to run Yumii
The shell starts the backend for you (yumii server is the headless
launcher it invokes — there is no interactive CLI and no browser UI).
⚠️ Use
uv, notpip— dependencies are locked with uv and installed viauv sync.
🤖 Providers
| Role | Options |
|---|---|
| Mind (LLM) | Groq (free tier) · Ollama Cloud (minimax-m3, 1M context) · OpenAI · Anthropic |
| Ears (STT) | Local Whisper (private, offline) · Groq Whisper (fast, cloud) · Vosk (offline streaming) |
| Voice (TTS) | Kokoro (local, free, recommended) · ElevenLabs · CAMB.ai |
Everything is switchable from the in-app ⚙️ dashboard.
🏗 Architecture
flowchart TD
mic["🎙 Microphone"] --> vad["Silero VAD<br/>speech detection"]
vad --> stt["Whisper STT<br/>local CPU · or Groq cloud"]
stt --> agent
subgraph agent [LangGraph Agent]
direction TB
sys["System prompt<br/>personality + episodic context + facts"] --> llm["LLM invoke<br/>Groq · Ollama · OpenAI · Anthropic<br/>tools bound · HITL-gated"]
llm --> synth["Synthesizer<br/>response + expression"]
end
agent <--> mem[("SQLite memory<br/>sessions · facts · transcript+FTS ·<br/>summaries · checkpoints — ~/.yumii")]
agent --> tts["TTS<br/>Kokoro local · ElevenLabs · CAMB.ai"]
tts --> ws["WebSocket"]
ws --> orb["Desktop orb (Tauri)<br/>pulse + emotion colour"]
orb -.->|coming soon| live2d["Live2D avatar mode"]
📁 Project Structure
src/yumii/
agent/ # LangGraph state machine, tool-bound LLM, personality manager,
# emotion synthesizer, fact extraction + memory review
api/ # FastAPI server: /health, /ws, REST, /dashboard.html
audio/ # STT pipeline (Silero VAD + Whisper/Groq/Vosk)
core/ # settings, auth.json credential store, engine orchestrator,
# SQLite memory (facts, transcript+FTS, session summaries)
tts/ # Kokoro (local ONNX) + ElevenLabs + CAMB.ai streaming
tools/ # tool registry + policies: web search, recall, memory,
# Composio integrations
assets/ # personality prompts, orb + dashboard pages, Silero model
cli.py # bare launcher: `yumii server` (the shell invokes this)
desktop/
src-tauri/ # Tauri v2 shell: orb window, tray, global hotkey,
# backend launcher
Memory lives at
~/.yumii/memory/(auto-created). API keys at~/.yumii/auth.json.
🔐 Security
~/.yumii/auth.json— API keys, owner-only permissions, atomic writes (the same storage model Claude Code and opencode use).~/.yumii/config.json— non-sensitive preferences.- No accounts, no telemetry, no server of ours: your data goes only to the LLM/STT/TTS providers you configure — or stays fully on-device with the local options.
🤝 Contributing
Contributions are welcome! See CONTRIBUTING.md.
Ideas: new personality prompts, more tools, TTS backends, the Live2D avatar mode, macOS/Linux desktop shells.
📄 License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yumii-0.11.0.tar.gz.
File metadata
- Download URL: yumii-0.11.0.tar.gz
- Upload date:
- Size: 4.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b1e8d478ef0c82977d4602d3e253fcccc8c2483692a5e2608ab4e86f52ca07b7
|
|
| MD5 |
500ee3ea2d9899494bb8f0406df2b8e5
|
|
| BLAKE2b-256 |
9d95b3abf84d31126aac862a92f4371d1b1df73f20ccfc3ebed50fb3d1e47115
|
Provenance
The following attestation bundles were made for yumii-0.11.0.tar.gz:
Publisher:
release.yml on CodeNeuron58/Yumii
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yumii-0.11.0.tar.gz -
Subject digest:
b1e8d478ef0c82977d4602d3e253fcccc8c2483692a5e2608ab4e86f52ca07b7 - Sigstore transparency entry: 2178062035
- Sigstore integration time:
-
Permalink:
CodeNeuron58/Yumii@26fbf9f2c4646b884c4c2701cde482454cd1f1c2 -
Branch / Tag:
refs/tags/v0.11.0 - Owner: https://github.com/CodeNeuron58
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@26fbf9f2c4646b884c4c2701cde482454cd1f1c2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file yumii-0.11.0-py3-none-any.whl.
File metadata
- Download URL: yumii-0.11.0-py3-none-any.whl
- Upload date:
- Size: 2.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e053c1b5bda6d25f1252609eaa25b3455a37c8d1c041da04399d0c056d4fca8
|
|
| MD5 |
925695593703eea75dff93a67af9a7bb
|
|
| BLAKE2b-256 |
aa264c1ea009fccfa6b39d7fa9cd35ebaf81ce2e190057ea9710502ba6f7a385
|
Provenance
The following attestation bundles were made for yumii-0.11.0-py3-none-any.whl:
Publisher:
release.yml on CodeNeuron58/Yumii
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yumii-0.11.0-py3-none-any.whl -
Subject digest:
7e053c1b5bda6d25f1252609eaa25b3455a37c8d1c041da04399d0c056d4fca8 - Sigstore transparency entry: 2178062209
- Sigstore integration time:
-
Permalink:
CodeNeuron58/Yumii@26fbf9f2c4646b884c4c2701cde482454cd1f1c2 -
Branch / Tag:
refs/tags/v0.11.0 - Owner: https://github.com/CodeNeuron58
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@26fbf9f2c4646b884c4c2701cde482454cd1f1c2 -
Trigger Event:
push
-
Statement type: