Sobre o projeto

Tandem é um projeto self-hosted em pré-lançamento (0.1.0, ainda sem versões marcadas) cujo objetivo é declarado claramente: ler um livro, ouvir o mesmo livro e nunca perder seu lugar. Um servidor roda em Docker junto ao PostgreSQL e ao web app, enquanto um PWA em React e um app Android em Kotlin/Jetpack Compose atuam como clientes leves. O servidor detém todo o trabalho com estado — ele escaneia volumes de ebooks e audiobooks, extrai metadados e capas, emparelha um ebook com seu audiobook, executa uma fila de transcrição, gera mapas de sincronização e é o único escritor da posição de leitura. Os clientes leem e escrevem a posição através de endpoints REST com autenticação JWT e mantêm apenas caches locais no dispositivo. A capacidade distintiva é a transferência em nível de frase entre formatos. Alternar da leitura para a audição (ou vice-versa) leva à frase em que você estava, em vez do início do capítulo, entre dispositivos. Isso requer uma transcrição: o audiobook é transcrito e alinhado ao texto do EPUB. O Whisper pode rodar localmente em uma imagem de servidor construída com a stack local opcional ou, por padrão, as tarefas são enviadas para um worker Jetson separado (faster-whisper; um Orin Nano 8 GB é a implantação de referência, modelo medium por padrão). Uma fila de transcrição com tentativas, uma janela de horários alternativos e um editor de transcrição acompanham isso; a transcrição é opcional e, sem ela, você ainda tem uma biblioteca e dois leitores, mas não a sincronização entre formatos. Outros recursos descritos incluem um scanner de biblioteca com agrupamento de séries e emparelhamento automático de ebook/audiobook, um leitor/player web PWA com controles de tela de bloqueio (a solução para iPhone, já que não há app iOS), um leitor/ouvinte Android com downloads offline, reprodução em segundo plano e Android Auto, contas de múltiplos usuários com funções e registro apenas por convite por padrão, integrações opcionais (Audiobookshelf, Google Books, metadados do Open Library e importações ACSM/Audible que requerem uma build de imagem especial), e dumps noturnos do Postgres além de snapshots de capas restauráveis pela UI. A implantação é via Docker Compose. O README é excepcionalmente explícito que segredos devem estar em arquivos em vez de variáveis de ambiente (chave JWT, senha do Postgres, chaves de criptografia de credenciais Fernet em secrets/), que o servidor deve rodar como um processo único porque a fila e os agendadores são locais ao processo, e que uma instalação nova cria um superadmin com uma senha gerada aleatoriamente escrita no log, forçando a redefinição no primeiro login. Uma configuração de reverse-proxy requer a definição de FORWARDED_ALLOW_IPS e um exemplo de Caddyfile endurecido é fornecido. Tabelas extensas de variáveis de ambiente cobrem configurações obrigatórias, opcionais, de throttle de autenticação, limite de upload e ajustes de sincronização; a documentação da API (/docs, /redoc) é deliberadamente desativada em produção. As limitações documentadas são sinceras: apenas EPUB para sincronização (PDFs emparelham, mas nunca alinham; MOBI/AZW3 devem ser convertidos), audiobooks devem ser arquivos únicos (rips de múltiplos arquivos são ignorados, mescle para .m4b primeiro), uma transcrição por vez, sem escalonamento horizontal, sem app iOS, Android Auto não testado em hardware, sem relatórios de erro em lugar nenhum, caminhos de download/streaming implementados recentemente e nada em qualquer loja de aplicativos. O projeto é descrito como um esforço de um único mantenedor em uso diário com uma suíte de testes real, mas exposição limitada a hardwares e layouts de biblioteca além dos do autor.