Un avatar virtual de escritorio con IA conversacional — compatible con macOS, Windows y Linux.
Construido con Tauri v2 (Rust + React + TypeScript).
- Personaje SVG animado con cabeza, torso, brazos y pies independientes
- 9 estados de ánimo con animaciones propias: happy, idle, excited, sleepy, thinking, talking, surprised, typing_watch, wave
- Gestos de brazos aleatorios cada 8-15s (levantar, aplaudir, saludar)
- Parpadeo autónomo y seguimiento ocular del ratón
- Pies flotantes con animación independiente
- Nombre y personalidad del avatar (5 opciones)
- Color de cabello, ojos y tono de piel (con selector libre de color)
- Configuración persistente entre sesiones
- Bocadillo de nube de pensamiento — diseño cómic con bolitas hacia el avatar
- Historial de conversación (últimos 50 mensajes)
- Indicador de escritura animado
| Proveedor | Configuración |
|---|---|
| OpenRouter | API key + 4 modelos gratuitos preconfigurados + modelos custom |
| LM Studio | Endpoint local (por defecto http://localhost:1234) |
| Ollama | Endpoint local (por defecto http://localhost:11434) |
- Síntesis de voz con
say→ archivo AIFF →afplay - 4 voces en español: Mónica, Paulina, Jorge, Juan
- Botón de silenciar / activar
- Cola de mensajes — habla completo sin cortar
- Transparente, sin bordes, siempre encima
- Draggable — click largo para arrastrar al escritorio
- Se expande al abrir chat o configuración (sin saltar de posición)
- System tray con menú mostrar/ocultar/salir
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Node.js 18+
# Linux — dependencias del sistema:
sudo apt install libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf
# macOS — Xcode command line tools:
xcode-select --installnpm install
npm run tauri devnpm run tauri build
# Instaladores en: src-tauri/target/release/bundle/- Crea una cuenta en openrouter.ai
- Genera una API key en openrouter.ai/keys
- En el avatar: botón ✨ → pestaña 🤖 IA → campo API Key
- Descarga LM Studio y carga un modelo
- Activa el servidor local en LM Studio (puerto 1234 por defecto)
- En el avatar: botón ✨ → pestaña 🤖 IA → sección Local → activar toggle →
http://localhost:1234
- Instala Ollama y descarga un modelo:
ollama pull llama3 - En el avatar: botón ✨ → pestaña 🤖 IA → sección Local → activar toggle →
http://localhost:11434→ nombre del modelo:llama3
desktop-avatar/
├── src/ # Frontend React + TypeScript
│ ├── avatar/
│ │ ├── AvatarSprite.tsx # SVG animado — 9 moods, gestos de brazos
│ │ ├── AvatarSprite.css # Animaciones CSS por parte del cuerpo
│ │ ├── SettingsPanel.tsx # Panel personalización + IA + voz
│ │ └── SettingsPanel.css
│ ├── chat/
│ │ ├── ChatBubble.tsx # Bocadillo nube de pensamiento
│ │ └── ChatBubble.css
│ ├── hooks/
│ │ ├── useChat.ts # Lógica de chat + llamada a IA
│ │ ├── useInputEvents.ts # Detección mouse/teclado → moods
│ │ └── useTts.ts # Text-to-speech (macOS say + afplay)
│ ├── store/
│ │ └── avatarStore.ts # Estado global (Zustand)
│ ├── types/index.ts
│ ├── App.tsx # Orquestador principal + expand/collapse
│ └── App.css
│
└── src-tauri/ # Backend Rust
├── src/
│ ├── main.rs # Entry point, tray, expand/collapse window
│ ├── ai.rs # OpenRouter + LM Studio + Ollama
│ ├── tts.rs # TTS con cola de mensajes
│ ├── os_context.rs # Hora, día, saludo contextual
│ └── input_listener.rs # (stub — permisos macOS)
└── tauri.conf.json # Ventana transparente, macOSPrivateApi
| Mood | Trigger |
|---|---|
happy |
Estado por defecto |
idle |
30s sin actividad |
sleepy |
2 min sin actividad |
excited |
Mañana (8-10h) |
thinking |
Esperando respuesta IA |
talking |
Avatar respondiendo |
surprised |
Click cuando estaba idle |
typing_watch |
Usuario escribiendo activamente |
wave |
Al iniciar la app |
- Sistema de outfits — capas SVG intercambiables
- Tienda de outfits descargables
- Memoria persistente — recuerda conversaciones pasadas
- Reacciones proactivas — el avatar habla espontáneamente
- STT — hablarle directamente por voz
- Notificaciones del sistema integradas
- El listener de teclado global está desactivado por defecto en macOS (requiere permisos de Accesibilidad del binario compilado)
- La API key se guarda en el store local de Tauri (cifrado por el SO)
- Los datos de conversación solo van a OpenRouter / servidor local — nunca a servidores propios
- El TTS usa
sayyafplaynativos de macOS — sin red
GPL 3.0