Your AI companion, always by your side.
ELINO is an AI companion that lives on your desktop — not in a browser tab.
It renders Live2D/VRM characters, connects to the LLM of your choice, and remembers you. Not just your last message, but conversations from weeks ago. It notices when you've been quiet and talks first. All memory stays on your machine.
Status: Active development. Issues and Discussions are welcome.
🧠 Human-like memory — Four-layer memory with hybrid BM25 + vector search. Forgetting curve, emotional weighting, pinned facts. Details below.
🎭 Live2D & VRM — Both formats in one app. Switch anytime — memory and personality carry over.
💬 Real emotions — AI estimates emotion and automatically maps it to Live2D/VRM expressions and motion. (WIP)
👄 Hybrid lip sync — Phoneme timing × audio amplitude. Natural mouth movement for both model types.
🗣️ Proactive speech — Goes quiet? Your companion reaches out with something relevant, not random.
🎛️ Multiple companions — Character slots with independent memory, personality, and appearance.
🌱 Self-growth — Your companion learns from conversations and gradually changes its personality and speech style. Changes require your approval via confirmation dialog.
🎙️ Voice conversation — Talk with your mic, get spoken replies. Whisper STT + OpenAI TTS / VOICEVOX / browser TTS.
📡 Streaming mode — YouTube chat + OneComme. Your companion talks to your audience. (WIP)
🌐 VRChat integration — Chat with players in VRChat via OSC chatbox. (WIP)
⚡ Claude Code integration — Connect to a running CLI session for AI-powered dev.
ELINO's memory isn't a chat log. It's a layered retrieval system designed to work like human recall.
| Layer | What it stores |
|---|---|
| Facts | Things you've shared — name, preferences, events |
| Summaries | Auto-generated conversation summaries |
| Relationship | Episodic records of how your bond has evolved |
| Emotional State | 6-axis internal state, persistent across sessions |
When recalling, ELINO runs BM25 + vector search in parallel and merges results via RRF (Reciprocal Rank Fusion). BM25 catches exact keywords; vector search catches meaning. Powered by paraphrase-multilingual-MiniLM-L12-v2 — works across languages naturally.
Memories have a retention score that decays over time. Frequently recalled or emotionally significant memories decay slower. Important things stay. Trivial things fade. Like a person.
Your companion continuously tracks:
| Axis | What it affects |
|---|---|
| Valence | Positive ↔ negative mood |
| Arousal | Energy level — calm vs. excited |
| Dominance | Assertive vs. tentative tone |
| Trust | How openly it speaks to you |
| Curiosity | Engagement — asks questions vs. passive |
| Fatigue | Response length and energy |
These shape how your companion speaks and behaves, persisting across sessions.
Pin critical memories so they never fade. All data stays in %APPDATA%/elino/ — no cloud, no telemetry.
git clone https://github.com/Tacky7788/Project-elino.git
cd elino
npm install
cp .env.example .env # Add your API keys (or configure in-app)
npm run dev # Start development modeFirst launch opens a setup wizard. Click the desktop character to chat. Settings in the system tray.
Production & packaging
npm run build && npm start # Production
npm run pack # Create installer- Node.js 18+
- npm
| Provider | Models |
|---|---|
| Anthropic | Claude 4.5 / 4 / 3.5 |
| OpenAI | GPT-4o / 4.1 / o3 |
| Gemini 2.5 / 2.0 | |
| Groq | Llama, Mixtral (fast inference) |
| DeepSeek | DeepSeek-V3 / R1 |
| Format | Description |
|---|---|
.model3.json |
Live2D Cubism 4 |
.vrm |
VRM 3D avatar |
.zip |
Either format, auto-extracted |
Use Settings > Character > Browse to select. On first launch, sample models are downloaded automatically.
Where to find models: VRoid Hub · Live2D Samples · Booth
Live2D SDK: Required for Live2D models (free download, license agreement needed). The setup wizard handles this. VRM works without it.
| Tab | Contents |
|---|---|
| LLM | Model, API keys, max tokens |
| Voice | STT/TTS engine, voice config |
| Character | Model type, window, FPS, resolution, lip sync |
| Personality | Name, presets, character slots |
| Proactive | Auto-speech frequency and triggers |
| Streaming | YouTube / OneComme integration (WIP) |
| Web Access | Browser access via localhost (WIP) |
Project structure
elino/
main.cjs # Electron main process
preload.cjs # IPC bridge
src/
core/ # Backend (brain, LLM, memory, TTS)
renderer/ # Frontend (TypeScript)
app.ts # Chat UI
character-live2d.ts
character-vrm.ts
settings.html # Settings UI (8 tabs)
public/
live2d/models/ # Model files
lib/ # Live2D SDK
Data directory
%APPDATA%/elino/companion/
user.json # User info
settings.json # App settings
active.json # Slot management
slots/{slotId}/
profile.json # Character profile
personality.json # Personality config
memory.json # Memory data
state.json # Emotional state
history.jsonl # Conversation history
- Windows only (Electron + NSIS)
- Live2D SDK must be provided separately (proprietary license)
Contributions welcome! Open an issue or PR. Bug reports, feature ideas, translations, model compatibility fixes — all appreciated.
If ELINO resonates with you, a ⭐ on the repo helps a lot.