Durvald
Reproductor de música local-first con núcleo Rust compartido e interfaces nativas
Producto y estado actual
Durvald es un reproductor de música local-first en evolución desde una interfaz SolidJS/Tauri hacia aplicaciones nativas con un núcleo compartido en Rust. Su objetivo es organizar y reproducir la colección del usuario en su propio dispositivo.
La implementación macOS es la más avanzada. Windows forma parte de la migración a interfaces nativas y Linux cuenta con una implementación GTK4 inicial. Los clientes están en etapas distintas; no se declara paridad de funciones entre plataformas.
Versión nativa macOS: detalle del álbum, lista de canciones y reproductor persistente.
Autoría y aprendizaje
Desarrollé todo el proyecto, desde el logotipo y la identidad visual hasta las interfaces y el núcleo Rust, con ayuda de distintos modelos de inteligencia artificial. Durvald es un proyecto personal de desarrollo y aprendizaje.
De Tauri a interfaces nativas
La versión Tauri todavía estaba incompleta, aproximadamente a mitad del desarrollo, cuando elegí las interfaces nativas como oportunidad para aprender SwiftUI y GTK4. Buena parte del núcleo Rust ya se utilizaba en Tauri; su reutilización limitó el impacto del cambio. La migración ocurrió durante la construcción del producto, sin sustituir un sistema consolidado en producción.
La primera implementación combinó SolidJS para la presentación, comandos y eventos Tauri para la comunicación y Rust para el procesamiento. Su código sigue siendo público en durvald-tauri, como referencia de la etapa anterior del mismo producto.
La arquitectura actual concentra las responsabilidades compartidas en durvald-core, independiente de la interfaz. El objetivo del producto se mantiene, mientras clientes nativos reemplazan la capa de presentación compartida. Esta decisión exige mantener integraciones y comportamientos específicos por plataforma. La sección de memoria registra una observación local de ambas versiones; los benchmarks controlados quedan fuera del alcance actual.
Captura de la versión SolidJS/Tauri; no representa la interfaz nativa actual.
Consistencia visual entre sistemas
La búsqueda de interfaces propias de cada sistema también respondió a un problema observado por el autor en Windows: los efectos de transparencia y desenfoque con backdrop-filter fallaban en componentes superpuestos de la interfaz Tauri. El autor relacionó este comportamiento con la issue Chromium #40835530, aportada como referencia técnica de la investigación.
Esta experiencia aumentaba el trabajo de compatibilidad visual de la interfaz compartida y contribuyó a la decisión de adoptar clientes nativos. La referencia identifica el problema investigado; su estado actual de resolución no se confirmó en esta revisión.
Captura del defecto en Windows proporcionada por el autor. Según su experiencia, el mismo problema no ocurría en Linux.
Distribución Linux y coste de mantenimiento
Además de buscar interfaces nativas, el flujo Linux del proyecto dependía de un entorno Ubuntu, según la experiencia del autor. Los informes externos aportan contexto: la discusión #12960 registra un fallo de linuxdeploy en Arch después de compilar, con una herramienta strip incompatible y comentarios del mantenedor sobre portabilidad de glibc. Las issues #15106 y #11701 también describen fallos al generar AppImage en Arch.
Estos informes refuerzan la necesidad de controlar el entorno de empaquetado y las dependencias de distribución. No demuestran un requisito universal de Ubuntu ni una comparación controlada entre distribuciones. La migración a GTK4 elimina la WebView del cliente Linux, pero las bibliotecas del sistema, el empaquetado y la compatibilidad entre distribuciones siguen requiriendo validación.
Núcleo compartido y contratos
El núcleo Rust concentra indexación, persistencia SQLite, reproducción local, historial, configuración e integración Last.fm. SwiftUI y otros clientes FFI usan la superficie UniFFI; el cliente GTK4, también escrito en Rust, consume directamente la API pública Rust sin bindings UniFFI.
Esta separación mantiene las reglas compartidas fuera de las interfaces. La documentación define contratos para rutas y portadas gestionadas, escaneo y cancelación, formatos de audio y errores públicos. Los clientes deben reaccionar a las variantes de CoreError, sin interpretar mensajes de diagnóstico como contratos.
Consistencia y operaciones prolongadas
Solo puede ejecutarse un escaneo de biblioteca a la vez. La cancelación es cooperativa: el trabajo se detiene en puntos seguros y los resultados cancelados no se guardan. Un escaneo completo reconcilia archivos eliminados; uno parcial o cancelado conserva los registros existentes.
En GTK4, los widgets permanecen en el hilo GTK/GLib y las operaciones del núcleo se envían a un runtime Tokio. Esto separa el trabajo bloqueante del hilo de interfaz y exige coordinar los resultados asíncronos con el ciclo de vida de la ventana.
Implementación por plataforma
- macOS: cliente nativo SwiftUI integrado mediante UniFFI; la línea de desarrollo más avanzada.
- Windows: en desarrollo dentro de la transición a una implementación nativa. Este caso todavía no ofrece una demostración ni una lista validada de funciones de esta versión.
- Linux: base Rust/GTK4 que abre una ventana, inicializa el núcleo y consulta la cantidad de canciones persistidas. Importación, listas y controles de reproducción siguen pendientes. Actualizar la biblioteca relee la base; no inicia un escaneo.
Memoria observada en reposo
En una captura local de Activity Monitor, con ambas versiones en reposo según el autor, el proceso nativo (Durvald) muestra 73,5 MB. Los cuatro procesos identificados por el autor como pertenecientes a Tauri suman 176,9 MB: http://localhost:1420 (95,7 MB), durvald (53,2 MB), durvald Graphics and Media (17,3 MB) y durvald Networking (10,7 MB).
| Implementación | Memoria mostrada |
|---|---|
| Tauri — suma de los cuatro procesos identificados | 176,9 MB |
| Nativa macOS — proceso identificado | 73,5 MB |
| Diferencia en esta captura | 103,4 MB (aproximadamente un 58% menos) |
Observación local proporcionada por el autor, quien confirmó la identificación de los procesos.
La comparación suma los valores mostrados por Activity Monitor, no memoria física exclusiva. Es una observación puntual: no se han registrado equipo, versión de macOS, commits, modo de compilación, tamaño de biblioteca ni tiempo en reposo. La dirección localhost indica contenido servido localmente en la versión Tauri. Estos valores no demuestran una reducción general de memoria, CPU o tiempo de inicio; una comparación reproducible requiere condiciones equivalentes y varias ejecuciones.
Evidencias y límites
Este caso reúne código público, capturas de interfaz y una observación local de memoria. Su enfoque es el aprendizaje de interfaces nativas y la reutilización del núcleo Rust durante el desarrollo. Los benchmarks comparativos quedan fuera del alcance actual; la captura de memoria se mantiene como observación puntual, sin prometer mejoras generales de rendimiento.