Sobre el proyecto

Tandem es un proyecto auto-alojado en fase de pre-lanzamiento (0.1.0, sin versiones etiquetadas aún) cuyo objetivo es claro: leer un libro, escuchar el mismo libro y nunca perder la posición. Un servidor se ejecuta en Docker junto con PostgreSQL y la aplicación web, mientras que una PWA de React y una aplicación de Android en Kotlin/Jetpack Compose actúan como clientes ligeros. El servidor gestiona todo el trabajo con estado: escanea volúmenes de libros electrónicos y audiolibros, extrae metadatos y portadas, empareja un libro electrónico con su audiolibro, ejecuta una cola de transcripción, genera mapas de sincronización y es el único escritor de la posición de lectura. Los clientes leen y escriben la posición a través de endpoints REST con autenticación JWT y mantienen solo cachés locales en el dispositivo. La capacidad distintiva es el traspaso a nivel de frase entre formatos. Cambiar de leer a escuchar (o viceversa) sitúa al usuario en la frase exacta en la que se encontraba, en lugar de al inicio del capítulo, a través de diversos dispositivos. Esto requiere una transcripción: el audiolibro se transcribe y se alinea con el texto del EPUB. Whisper puede ejecutarse localmente en una imagen de servidor construida con el stack local opcional o, por defecto, los trabajos se envían a un trabajador Jetson independiente (faster-whisper; un Orin Nano 8 GB es el despliegue de referencia, modelo medium por defecto). Esto viene acompañado de una cola de transcripción con reintentos, una ventana de horario no laboral y un editor de transcripciones; la transcripción es opcional y, sin ella, se dispone de una biblioteca y dos lectores, pero no de sincronización entre formatos. Otras características descritas incluyen un escáner de biblioteca con agrupación por series y emparejamiento automático de ebook/audiolibro, un lector/reproductor web PWA con controles de pantalla de bloqueo (la solución para iPhone, ya que no hay aplicación de iOS), un lector/oyente de Android con descargas offline, reproducción en segundo plano y Android Auto, cuentas multiusuario con roles y registro solo por invitación por defecto, integraciones opcionales (Audiobookshelf, Google Books, metadatos de Open Library e importaciones de ACSM/Audible que requieren una construcción de imagen especial), y volcados nocturnos de Postgres más instantáneas de portadas restaurables desde la interfaz de usuario. El despliegue se realiza a través de Docker Compose. El README es inusualmente explícito en que los secretos deben estar en archivos en lugar de variables de entorno (clave JWT, contraseña de Postgres, claves de cifrado de credenciales Fernet en secrets/), que el servidor debe ejecutarse como un único proceso porque la cola y los planificadores son locales al proceso, y que una instalación limpia crea un superadmin con una contraseña generada aleatoriamente escrita en el log, obligando a un restablecimiento en el primer inicio de sesión. Una configuración de proxy inverso requiere establecer FORWARDED_ALLOW_IPS y se proporciona un ejemplo de Caddyfile endurecido. Tablas extensas de variables de entorno cubren ajustes obligatorios, opcionales, de limitación de autenticación, límite de carga y sintonización de sincronización; la documentación de la API (/docs, /redoc) está deliberadamente desactivada en producción. Las limitaciones documentadas son sinceras: solo EPUB para la sincronización (los PDF se emparejan pero nunca se alinean; MOBI/AZW3 deben convertirse), los audiolibros deben ser archivos únicos (los rips de varios archivos se omiten, fusionar a .m4b primero), una sola transcripción a la vez, sin escalado horizontal, sin aplicación de iOS, Android Auto no probado en hardware, sin informes de errores en ninguna parte, rutas de descarga/streaming implementadas recientemente y nada en ninguna tienda de aplicaciones. El proyecto se describe como el esfuerzo de un único mantenedor en uso diario con una suite de pruebas real, pero con exposición limitada a hardware y diseños de biblioteca distintos a los del autor.