Kuali
Transcripción local y open source para Discord y Google Meet con atribución real por hablante.
English · Español
Funciones ·
Inicio rápido ·
Privacidad ·
Desarrollo ·
Comunidad ·
Sitio web

Kuali escucha llamadas en vivo, las transcribe en tu computadora y conserva
quién dijo cada cosa. Las reuniones se convierten en una biblioteca con
transcripción en vivo, búsqueda, resúmenes, decisiones, preguntas y tareas por
participante.
Whisper y Silero procesan el audio en memoria. Kuali no conserva una grabación
de audio ni la envía a un servicio operado por el proyecto.
## Por qué Kuali
Kuali está construido alrededor de los participantes, no de un único archivo
con todo el audio mezclado:
- **La identidad existe antes de transcribir.** Discord entrega una pista y una
identidad estable por usuario, mientras que la integración de Meet transporta
el contexto del participante junto al audio. Kuali no tiene que adivinar
después mediante diarización sobre una grabación.
- **Configurar Discord y Google Meet es extremadamente simple: tres pasos
cortos.** La guía bilingüe muestra los controles reales, guarda el progreso y
evita URLs de OAuth manuales, archivos de configuración y el modo
desarrollador del navegador.
- **La IA que ya usas puede generar los resultados.** Kuali reutiliza sesiones
autenticadas de Claude Code, Codex o Gemini CLI. También admite claves de
Anthropic, OpenAI y Gemini, además de endpoints compatibles con OpenAI como
Ollama y LM Studio.
- **Los resultados vuelven a Discord como una interfaz, no como una pared de
texto.** Una sola tarjeta se actualiza con tareas y vistas privadas paginadas
para resumen, puntos clave, decisiones, preguntas y transcripción completa.
Los archivos íntegros siguen disponibles para descargar.
- **El seguimiento automático hace difícil olvidar una llamada.** Kuali puede
entrar después del usuario configurado, pausarse sin perder la configuración
y también aceptar invitaciones manuales con `/grabar` o `/record`.
- **La configuración está pensada para cualquiera que pueda instalar una app.**
La elección del modelo, las integraciones, el consentimiento, el estado en
vivo y los cambios posteriores tienen UI guiada, sin configuración escrita a
mano.
El núcleo nativo de escritorio está escrito en Rust. El bot y el gateway de
Discord corren desde tu Mac, mientras que las reuniones del navegador usan una
conexión loopback hacia la misma computadora. Kuali carga Whisper solo cuando
una reunión activa lo necesita y libera el modelo de la RAM al finalizar la
última reunión activa. El proyecto es gratis y open source; no requiere una
suscripción ni una cuenta alojada por Kuali.
Conoce los flujos de
[transcripción de Discord](https://kuali.garrux.dev/es/transcripcion-reuniones-discord/)
y
[transcripción de Google Meet](https://kuali.garrux.dev/es/transcripcion-google-meet/)
en el sitio oficial.
## Funciones
- Transcripción en vivo con identidad establecida antes de decodificar, sin
diarización posterior para Discord y la captura compatible de Meet.
- Configuración interactiva en tres pasos para Discord y Google Meet.
- Resultados opcionales mediante Claude Code, Codex, Gemini CLI, claves API o
proveedores compatibles con OpenAI.
- Entrega interactiva en Discord con resumen, puntos clave, decisiones,
preguntas, tareas, transcripción paginada y descargas completas.
- Seguimiento automático en Discord con un control inmediato para pausarlo.
- Captura experimental para Microsoft Teams y Zoom, con soporte parcial mientras
se validan y mejoran sus integraciones.
- Varias reuniones simultáneas con participantes, relojes y estado independientes.
- Núcleo de escritorio nativo en Rust con cerca de 40 MB de memoria observada
mientras está en espera.
- Ciclo de Whisper bajo demanda: las reuniones activas comparten un modelo y se
libera de la RAM al finalizar la última.
- Whisper local con aceleración Metal y detección de voz mediante Silero.
- Biblioteca con búsqueda dentro de la transcripción, carpetas por canal y
exportación Markdown o JSON.
- Preguntas respondidas sobre reuniones pasadas desde Discord o la app, con
citas, y limitadas en Discord a las llamadas en las que estuvo quien pregunta.
- Resúmenes, puntos clave, decisiones, preguntas y tareas por participante,
completamente opcionales.
- Filtros de tareas por persona, reunión, estado y rango de fechas.
- Webhooks firmados con la reunión terminada y su transcripción completa.
- Interfaz en español e inglés, configuración guiada, controles en la barra de
menús e inicio automático.
## Inicio rápido
Instala la versión actual para macOS con Homebrew:
```sh
brew install --cask igarrux/kuali/kuali
xattr -dr com.apple.quarantine /Applications/Kuali.app
```
Para compilar desde el código fuente, instala Rust 1.89+, CMake y un toolchain
de C/C++. Node.js 22+ solo hace falta para desarrollar y probar la extensión.
```sh
git clone https://github.com/igarrux/kuali.git
cd kuali
cargo run -p kuali-app
```
La primera vez, Kuali abre su configuración guiada. Desde ahí puedes crear el
bot de Discord, instalar la extensión y descargar un modelo de Whisper sin
editar archivos de configuración manualmente.
### Discord
Crea un bot en el [Portal de desarrolladores de Discord](https://discord.com/developers/applications),
pega su token y tu `@usuario` en Kuali y elige un servidor en la ventana de
autorización que se abrirá. Kuali obtiene el ID de la aplicación desde el token
y prepara automáticamente los ámbitos y permisos mínimos; no tienes que crear
un enlace de OAuth manualmente.
Kuali puede seguir automáticamente a una cuenta configurada. El seguimiento se
puede pausar sin olvidar la cuenta. Una persona dentro de un canal de voz también
puede invitar al bot mediante `/grabar` o `/record`.
Al entrar, Kuali reproduce y publica el aviso de consentimiento. Lo repite para
quienes llegan después y conserva un registro de auditoría anexado cronológicamente.
Kuali nunca transcribe su propio aviso.
Al terminar una reunión, Kuali puede publicar una tarjeta compacta en Discord
con las tareas, la duración, el número de participantes y accesos privados al
resumen, puntos clave, decisiones, preguntas abiertas y transcripción completa.
El resumen y la transcripción también incluyen archivos de texto descargables,
sin llenar el canal con un bloque enorme. La tarjeta aparece mientras se prepara
el resumen y luego se actualiza en el mismo lugar. Las vistas privadas largas se
paginan dentro de la misma tarjeta, sin repartir la reunión entre varios mensajes.
Una reunión también puede quedar reservada a quienes estuvieron en la llamada.
Con *Ajustes → Discord → Solo quienes estuvieron en la llamada pueden leer la
reunión*, la tarjeta del canal conserva el título, la duración, el número de
participantes y cuántas tareas quedaron, pero no muestra ningún fragmento, y
Kuali responde únicamente a los participantes —en privado, con un mensaje
efímero— desde los botones de la tarjeta o con `/resumen` y `/summary`.
Cualquier otra persona del canal, por permisivo que sea su rol de Discord, no
lee nada.
### Preguntar por reuniones pasadas
`/pregunta` y `/ask` responden preguntas sobre todo lo que Kuali ha grabado
—«¿qué decidimos sobre el despliegue?», «¿qué me quedó pendiente?»— en lugar de
obligarte a encontrar antes la reunión correcta.
**La búsqueda se limita a las reuniones en las que estuviste.** Kuali usa la
cuenta que Discord autenticó y busca solo en llamadas que la registraron como
presente, dentro del servidor donde escribiste el comando. Esto no es un filtro
aplicado a los resultados: las reuniones fuera de ese conjunto nunca se
recuperan, así que el modelo no las ve y no puede citarlas. Haber estado en
silencio también cuenta, y las reuniones de navegador quedan excluidas porque
una cuenta de Discord no puede corresponderse con un participante de Google
Meet, Teams o Zoom. Las respuestas son siempre efímeras y citan las reuniones en
las que se apoyan, para que puedas comprobar lo que se afirma.
La aplicación de escritorio tiene lo mismo en **Preguntar**, sin la restricción
por participación: se ejecuta en la máquina que grabó las reuniones, para quien
es su dueño.
Las preguntas están **desactivadas hasta que las actives**, en **Preguntar**
dentro de la aplicación. Responder bien necesita un modelo de 128 MB que entiende
lo que se quiso decir y no solo qué palabras se usaron —es lo que encuentra
*cortafuegos* cuando preguntas por *firewall*— y nada de ese tamaño se descarga
sin preguntar. Al activarlo verás el tamaño de la descarga, cuántos fragmentos
tiene tu biblioteca actual y una estimación de tiempo; durante el indexado la
estimación pasa a medirse en tu propio equipo.
Hasta que eso termine, las preguntas se rechazan en lugar de responderse solo con
coincidencia de palabras. Una función que a veces acierta y a veces falla lo
evidente enseña a no confiar en ella, así que es todo o nada.
Responder además envía fragmentos de la transcripción al proveedor configurado,
así que obedece el mismo interruptor de *Ajustes → resúmenes y tareas*. Con esa
opción desactivada, las preguntas no están disponibles, igual que los resúmenes.
El modelo de embeddings corre por completo en tu equipo y no envía nada a ningún
sitio.
### Reuniones del navegador
Instala la extensión desde su ficha oficial en
[Chrome Web Store](https://chromewebstore.google.com/detail/kuali/cgojkmdggflcggedmapamcmkelgaahhp)
con Chrome, Edge, Brave o Arc. El código y las instrucciones para cargarla
manualmente durante el desarrollo están en
[`browser-extension/`](browser-extension/README.es.md).
La extensión se comunica únicamente con el receptor local de Kuali. Mantiene
separadas las pistas y la identidad de los participantes cuando el servicio de
reuniones las expone; si recibe audio mezclado, lo etiqueta como tal en lugar de
inventar quién habló.
### Estado de las plataformas
| Plataforma | Estado |
|---|---|
| Discord | Estable |
| Google Meet | Estable |
| Microsoft Teams | Experimental · soporte parcial |
| Zoom | Experimental · soporte parcial |
Teams y Zoom todavía no tienen el mismo nivel de pruebas en reuniones reales
que Discord y Google Meet. La captura, la identidad de participantes o la
separación de hablantes pueden ser incompletas en algunos modos mientras mejora
el soporte.
## Uso de recursos
| Estado | Whisper en RAM | Memoria observada de la app |
|---|---|---:|
| Esperando una reunión | No | Cerca de 40 MB |
| Reunión activa con el modelo Q5 recomendado | Sí | Hasta unos 600 MB |
| Después de finalizar la última reunión activa | No | Regresa hacia el consumo en espera |
Estas cifras son mediciones aproximadas en Apple Silicon; el consumo real varía
según la reunión y el equipo. Las reuniones simultáneas comparten un único
modelo cargado. Los pesos descargados permanecen en disco cuando el modelo se
libera de la RAM.
## Modelos de transcripción
Los pesos se descargan por separado y no vienen dentro de la aplicación. La
ubicación predeterminada es `~/.kuali`, pero se puede cambiar desde Ajustes,
incluido un almacenamiento externo. Kuali verifica la integridad al descargar o
mover los pesos, y cada modelo instalado se puede eliminar individualmente.
| Nivel | Modelo técnico | Descarga | Recomendado para |
|---|---|---:|---|
| **Ligero** | **Large v3 Turbo Q5** | **574 MB** | **Recomendado para transcripción en vivo rápida y precisa** |
| Equilibrado | Large v3 Turbo | 1,6 GB | Más fidelidad sin dejar de priorizar el tiempo real |
| Preciso | Large v3 Q5 | 1,1 GB | Audio difícil, acentos y vocabulario mixto |
| Máxima precisión | Large v3 Q8 | 1,7 GB | La mayor fidelidad local de Kuali con cuantización conservadora |
## Resúmenes y tareas
Los resúmenes son opcionales. Si desactivas **Ajustes → Resúmenes y tareas**,
Kuali no enviará ninguna transcripción a un LLM. El interruptor bloquea tanto la
generación automática como la manual.
Al activarlo, Kuali puede usar una sesión autenticada de Claude Code, Codex o
Gemini CLI; una clave directa de Anthropic, OpenAI o Gemini; o un endpoint
compatible con OpenAI, como Ollama o LM Studio. Las credenciales se guardan con
permisos `0600` en el archivo de configuración de Kuali.
## Privacidad
| Dato | Tratamiento |
|---|---|
| Audio | Se procesa en memoria; no se guarda como archivo de audio |
| Transcripciones y metadatos | Se guardan localmente en los datos de Kuali |
| Pesos de Whisper | Se guardan en la carpeta elegida por el usuario |
| Solicitudes a LLM | El interruptor **Resúmenes y tareas** las desactiva; si está activo, van únicamente al proveedor configurado |
| CLI local como proveedor | Se ejecuta sin herramientas, con el entorno vacío y encerrada por el núcleo: no ve tu carpeta personal ni puede escribir en el disco |
| Webhooks | Permanecen desactivados hasta crear y habilitar una suscripción |
Las reglas de grabación y consentimiento cambian según el lugar. Kuali ofrece
aviso hablado, aviso escrito y un registro verificable; quien lo opera sigue
siendo responsable de utilizarlos correctamente. Consulta la
[política de privacidad](PRIVACY.es.md).
### Ubicaciones de datos
```text
~/.kuali/ Pesos de Whisper y Silero
~/Library/Application Support/com.onwev.Kuali/
└── meetings//
├── meta.json
└── meeting.json
~/Library/Preferences/com.onwev.Kuali/config.toml
```
**Ajustes → Datos → Restablecer Kuali** elimina la configuración, reuniones,
registros y pesos de Whisper que pertenecen a Kuali después de pedir una frase
de confirmación. Conserva el runtime, Silero, la extensión y cualquier archivo
ajeno dentro de carpetas externas.
## Webhooks
Kuali puede enviar un evento `meeting.completed` para todas las reuniones o
solo para un canal de Discord. El contenido incluye participantes, transcripción
con tiempos, estado del resumen y—si está activado—los puntos clave y tareas.
Las entregas siguen [Standard Webhooks 1.0](https://www.standardwebhooks.com/):
el sobre JSON contiene `type`, `timestamp` y `data`, y cada solicitud incluye
`webhook-id`, `webhook-timestamp` y `webhook-signature`.
Los secretos usan el formato `whsec_`. La firma es un HMAC-SHA256 en Base64
calculado sobre los bytes exactos de
`webhook-id + "." + webhook-timestamp + "." + cuerpo`. Los fallos transitorios
usan el calendario de reintentos recomendado durante varios días, conservando
el identificador de entrega y renovando el timestamp de cada intento.
## Desarrollo
Instala [`just`](https://just.systems/) y [`fzf`](https://junegunn.github.io/fzf/)
para usar el menú de comandos versionado con el proyecto:
```sh
brew install just fzf
just
```
Elige una receta y presiona Enter, o ejecuta una directamente; por ejemplo,
`just dev`, `just test` o `just check`. Usa `just --list` para consultar todas
las recetas y sus descripciones. Los comandos subyacentes siguen siendo:
```sh
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
(cd browser-extension && npm test)
node --test src/i18n.test.mjs
```
La prueba E2E interactiva de Google Meet abre una reunión real y verifica el
protocolo de captura, la atribución, la transcripción en vivo, el cierre y la
liberación del modelo:
```sh
cd browser-extension
npm run test:e2e:meet
```
### Estructura
| Ruta | Responsabilidad |
|---|---|
| `crates/kuali-core` | Tipos compartidos y configuración |
| `crates/kuali-discord` | Discord, consentimiento y audio por hablante |
| `crates/kuali-meet` | Receptor local y protocolo de reuniones del navegador |
| `crates/kuali-stt` | Segmentación, Silero, Whisper y almacenamiento de modelos |
| `crates/kuali-llm` | Proveedores y resultados estructurados |
| `crates/kuali-store` | Persistencia, búsqueda y exportación |
| `crates/kuali-engine` | Coordinación de reuniones simultáneas |
| `src-tauri` / `src` | Backend de escritorio e interfaz bilingüe |
| `browser-extension` | Extensión de captura para el navegador |
## Comunidad
Kuali se construye públicamente y las contribuciones son bienvenidas:
- Consulta el [roadmap](ROADMAP.md) para conocer las áreas activas.
- Elige un issue marcado como
[`good first issue`](https://github.com/igarrux/kuali/labels/good%20first%20issue)
o [`help wanted`](https://github.com/igarrux/kuali/labels/help%20wanted).
- Haz preguntas y propón cambios amplios en
[GitHub Discussions](https://github.com/igarrux/kuali/discussions).
- Sigue [CONTRIBUTING.md](CONTRIBUTING.md) para preparar el entorno, comprender
la arquitectura, ejecutar pruebas y abrir el PR contra `sandbox`.
- Usa el canal privado indicado en [SECURITY.md](SECURITY.md) para problemas de
seguridad o exposición accidental de datos sensibles.
Los reportes reproducibles, pruebas controladas de plataformas, documentación,
traducciones, accesibilidad y cambios de código enfocados son valiosos.
## Licencia
El escritorio está disponible bajo la [licencia MIT](LICENSE). La extensión se
distribuye por separado bajo la
[licencia Apache 2.0](browser-extension/LICENSE); los avisos de terceros están
en [`browser-extension/NOTICE`](browser-extension/NOTICE).