À propos du projet
Tandem est un projet auto-hébergé en pré-version (0.1.0, aucun tag de version pour l'instant) dont l'objectif est simple : lire un livre, écouter le même livre, et ne jamais perdre sa page. Un serveur s'exécute dans Docker aux côtés de PostgreSQL et de l'application web, tandis qu'une PWA React et une application Android Kotlin/Jetpack Compose font office de clients légers. Le serveur gère tout le travail d'état : il scanne les volumes d'ebooks et de livres audio, extrait les métadonnées et les couvertures, associe un ebook à son livre audio, gère une file d'attente de transcription, génère des cartes de synchronisation et est le seul à écrire la position de lecture. Les clients lisent et écrivent la position via des points de terminaison REST avec authentification JWT et ne conservent que des caches locaux à l'appareil.
La capacité distinctive est le passage au niveau de la phrase entre les formats. Passer de la lecture à l'écoute (ou inversement) permet de retomber sur la phrase où l'on s'était arrêté plutôt qu'au début du chapitre, et ce, sur tous les appareils. Cela nécessite une transcription : le livre audio est transcrit et aligné sur le texte EPUB. Whisper peut s'exécuter localement dans une image serveur construite avec la pile locale optionnelle ou, par défaut, les tâches sont confiées à un worker Jetson séparé (faster-whisper ; un Orin Nano 8 Go est le déploiement de référence, modèle medium par défaut). Une file d'attente de transcription avec tentatives, une fenêtre d'exécution hors heures de pointe et un éditeur de transcription accompagnent ce système ; la transcription est optionnelle, et sans elle, vous disposez toujours d'une bibliothèque et de deux lecteurs, mais sans synchronisation inter-formats.
Les autres fonctionnalités décrites incluent un scanner de bibliothèque avec groupement par série et appairage automatique ebook/livre audio, un lecteur/lecteur web PWA avec commandes d'écran de verrouillage (pour iPhone, puisqu'il n'y a pas d'application iOS), un lecteur/écouteur Android avec téléchargements hors ligne, lecture en arrière-plan et Android Auto, des comptes multi-utilisateurs avec rôles et inscription sur invitation par défaut, des intégrations optionnelles (Audiobookshelf, Google Books, métadonnées Open Library et imports ACSM/Audible nécessitant une construction d'image spéciale), ainsi que des dumps Postgres nocturnes et des instantanés de couvertures restaurables depuis l'interface utilisateur.
Le déploiement s'effectue via Docker Compose. Le README précise explicitement que les secrets doivent se trouver dans des fichiers plutôt que dans des variables d'environnement (clé JWT, mot de passe Postgres, clés de chiffrement d'identifiants Fernet sous secrets/), que le serveur doit s'exécuter comme un processus unique car la file d'attente et les ordonnanceurs sont locaux au processus, et qu'une installation fraîche crée un superadmin avec un mot de passe généré aléatoirement et écrit dans le journal, forçant une réinitialisation lors de la première connexion. Une configuration de reverse-proxy nécessite le paramétrage de FORWARDED_ALLOW_IPS et un exemple de Caddyfile sécurisé est fourni. Des tableaux détaillés de variables d'environnement couvrent les paramètres obligatoires, optionnels, de limitation d'authentification, de limite de téléchargement et de synchronisation ; les docs API (/docs, /redoc) sont délibérément désactivées en production.
Les limitations documentées sont franches : EPUB uniquement pour la synchronisation (les PDF sont appairés mais jamais alignés ; MOBI/AZW3 doivent être convertis), les livres audio doivent être des fichiers uniques (les rips multi-fichiers sont ignorés, fusionnez-les d'abord en .m4b), une seule transcription à la fois, pas de mise à l'échelle horizontale, pas d'application iOS, Android Auto non testé sur matériel, aucun rapport de plantage, chemins de téléchargement/streaming récemment ajoutés, et aucune présence sur les boutiques d'applications. Le projet est décrit comme l'effort d'un seul mainteneur, utilisé quotidiennement avec une véritable suite de tests, mais avec une exposition limitée aux matériels et aux structures de bibliothèques autres que ceux de l'auteur.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.