Skip to main content
Volver al blog
Blog

Por qué construimos MadoHub con Tauri en lugar de Electron

El razonamiento técnico detrás de elegir Tauri v2 para una herramienta de desarrollo de escritorio: rendimiento, tamaño del binario y las ventajas de Rust para la integración con el sistema.

Cuando empezamos a construir MadoHub, teníamos un requisito claro: una aplicación de escritorio con UI basada en la web que pudiera gestionar sesiones PTY, leer sistemas de archivos e integrarse en profundidad con procesos del sistema. Las dos opciones serias eran Electron y Tauri.

Elegimos Tauri. Aquí está el porqué, y lo que aprendimos.

El argumento del tamaño del binario

La ventaja más citada de Tauri es el tamaño del binario. Una app Electron vacía pesa ~150MB porque incluye un navegador Chromium completo. Una app Tauri arranca por debajo de 5MB porque usa la webview nativa del sistema (WebKit en macOS, WebView2 en Windows, WebKitGTK en Linux).

Para una herramienta para desarrolladores, el tamaño del binario importa más de lo que parece. Los desarrolladores son muy exigentes con lo que instalan. Una descarga de 200MB para una "herramienta de productividad" genera desconfianza. Una descarga de 10MB transmite "esto es ligero y está enfocado".

Pero el tamaño del binario fue el factor menos importante en nuestra decisión.

El backend en Rust

La verdadera razón por la que elegimos Tauri es el backend en Rust.

MadoHub gestiona sesiones PTY, supervisa paneles tmux, analiza archivos JSONL, realiza llamadas a API para el enrutamiento y maneja operaciones del sistema de archivos, todo de forma concurrente. Son operaciones a nivel de sistema que se benefician de:

Seguridad de memoria sin garbage collection: la gestión de PTY implica controlar ciclos de vida de procesos, leer descriptores de archivo y manejar señales. En Node.js (el backend de Electron), un bug en la gestión de procesos puede filtrar descriptores o dejar procesos zombis. El modelo de ownership de Rust detecta esos fallos en compilación.

Concurrencia real: MadoHub supervisa varios procesos de terminal al mismo tiempo, consulta paneles tmux en hilos en segundo plano y hace llamadas concurrentes a APIs para el enrutamiento. El runtime asíncrono de Rust (tokio) maneja esto con sobrecarga mínima. Node.js puede hacer I/O asíncrono, pero el trabajo ligado a CPU (como analizar archivos JSONL grandes) bloquea el event loop.

Manejo estructurado de errores: las operaciones del sistema fallan de formas previsibles: los archivos no existen, los procesos terminan, las llamadas a la API agotan el tiempo. El tipo Result de Rust nos obliga a manejar todos los caminos de fallo. En nuestro código de enrutamiento, eso marca la diferencia entre un "no se encontró el archivo de sesión, recurriendo a la resolución por CWD" limpio y un error undefined misterioso que hace caer el pipeline.

Nuestro workspace en Rust

El backend de MadoHub se divide en 7 crates centrados:

CrateResponsabilidad
madohub-ptyGestión de sesiones PTY, integración con tmux
madohub-paneSondeo de paneles tmux para monitorización de equipos
madohub-agentEnrutamiento de agentes, análisis JSONL, llamadas a API
madohub-gitOperaciones git (status, commit, push)
madohub-teamDetección de equipos desde ~/.claude/teams/
madohub-persistenceSerialización del estado del canvas a ~/.madohub/
madohub-coreTrait compartido para emisor de eventos

Esta estructura modular permite probar cada crate por separado, y los tiempos de compilación siguen siendo razonables porque los crates sin cambios no se recompilan.

La historia del frontend

El frontend de Tauri es una webview que renderiza una aplicación web estándar. Usamos React 19 + TypeScript + Tailwind CSS + Zustand para la gestión de estado, la misma pila que usarías para una app web.

La comunicación entre frontend y backend ocurre mediante el sistema de comandos de Tauri, esencialmente IPC tipado. El frontend llama a un comando de Tauri, el backend en Rust lo ejecuta y el resultado vuelve. Para datos en streaming (salida del terminal, eventos de enrutamiento), Tauri proporciona un sistema de eventos.

Una ventaja infravalorada: la webview usa el motor de renderizado nativo del sistema, así que hereda el renderizado de texto, la física de scroll y las funciones de accesibilidad de la plataforma. El texto en MadoHub parece nativo porque es renderizado nativo.

Lo que sacrificamos

Tauri no está libre de concesiones.

Inconsistencias de webview entre plataformas: WebKit (macOS) y WebView2 (Windows) tienen comportamientos de renderizado distintos en casos límite: backdrop-filter funciona de forma diferente, ciertos comportamientos de scroll varían y algunas APIs web nuevas llegan en momentos distintos. Nos hemos topado con algunas de estas diferencias, sobre todo en animaciones y efectos de desenfoque.

Ecosistema más pequeño: Electron lleva una década de ecosistema de plugins, herramientas de depuración y conocimiento comunitario. El ecosistema de Tauri crece rápido, pero es más joven. Hemos tenido que construir desde cero algunas cosas que en Electron habrían sido paquetes npm.

Curva de aprendizaje de Rust: nuestro equipo de frontend está formado principalmente por desarrolladores de TypeScript. Escribir Rust para el backend requirió tiempo de adaptación. La recompensa merece la pena para código a nivel de sistema, pero la inversión inicial es real.

Rendimiento en la práctica

Para una herramienta como MadoHub - donde puedes tener 5 tiles de terminal abiertos, cada una emitiendo salida PTY, mientras el sistema de enrutamiento detecta finalizaciones y consulta paneles tmux - el rendimiento no es teórico. Los frames perdidos en el canvas, el renderizado lento del terminal o los disparadores de enrutamiento retrasados impactan directamente en la usabilidad.

En nuestros benchmarks, MadoHub con 8 tiles de terminal activas usa unos 120MB de RAM. Una app Electron equivalente arrancaría en 300MB o más antes de abrir ninguna terminal, solo por la sobrecarga de Chromium.

El uso de CPU durante la operación normal (terminales activas, enrutamiento en reposo) se mantiene por debajo del 5%. Durante el enrutamiento activo (llamadas a API + análisis JSONL + entrega de contenido), sube brevemente al 15-20% y luego vuelve a la línea base.

¿Elegiríamos Tauri otra vez?

Sin duda, sí, para este tipo de aplicación. La combinación de un backend en Rust a nivel de sistema y un frontend basado en web encaja de forma natural con herramientas para desarrolladores que necesitan una integración profunda con el sistema operativo.

Para una app más sencilla - algo sin interacciones con el sistema más allá de I/O de archivos básica - la elección es menos clara. La madurez de Electron y el tamaño de su ecosistema lo convierten en la opción pragmática para muchos casos de uso.

Pero para MadoHub, donde el backend gestiona sesiones PTY concurrentes, supervisa procesos del sistema y analiza datos estructurados a gran velocidad, Rust no es solo una optimización de rendimiento. Es una garantía de corrección que nos permite publicar con confianza.