tbook
Um leitor de EPUB no terminal. Texto, imagens e memória de leitura em um binário Go.
- Projeto pessoal, código público
- Desenvolvimento do leitor em Go
- Funcional; sem release publicada
- Go / Bubble Tea / Glamour / EPUB

o que é
O tbook abre EPUBs sem DRM, renderiza capa e ilustrações em blocos ANSI e oferece busca, bookmarks e temas. O acesso ao Project Gutenberg permite buscar e baixar livros pela própria CLI.
o problema
Ler no terminal exige traduzir um formato de documentos para uma grade de caracteres. Além do texto, é preciso preservar imagens, navegação e o ponto de retomada entre sessões.
as restrições
- Uma grade de caracteres
- As imagens são reduzidas a até 48×24 e desenhadas com
▀, usando truecolor ou fallback de 256 cores. - Estado local
- Configuração, bookmarks, capítulo e percentual de leitura são gravados em JSON. Não há sincronização entre dispositivos.
a arquitetura
Responsabilidades do sistema. A sessão pode ser testada sem abrir a interface.
Entrada e biblioteca
Comandos, busca e download pelo Project Gutenberg.
Documento
EPUB, capítulos, imagens e conversão para Markdown.
Sessão
Capítulo, percentual, bookmarks e tempo de leitura.
Interface
Bubble Tea e renderização por capítulo/largura.
Persistência
config.json e state.json no diretório do usuário.
Mapa de componentes, não uma sequência de chamadas: a TUI usa a sessão; core importa epub e store, sem importar Bubble Tea.

decisões técnicas
Núcleo independente da TUI
Sessionconcentra navegação e estado, com testes de retomada, limites de capítulo, bookmarks e persistência.- Guardar essas regras nos handlers da interface.
- CLI e TUI precisam coordenar a sessão e o salvamento.
Imagens como caracteres ANSI
- A renderização não depende de protocolos gráficos específicos do emulador.
- Usar kitty, sixel ou outro protocolo para exibir a imagem original.
- A resolução é limitada; a ilustração permanece reconhecível, mas perde detalhe.
Persistência em JSON
- O estado é pequeno e local. A ferramenta abre sem banco ou processo auxiliar.
- Adicionar um banco embutido e consultas estruturadas.
- Sem sincronização; o arquivo local é a fonte de estado.
limites e aprendizados
Retomada tem uma precisão definida
O código guarda capítulo e percentual, não uma âncora de parágrafo. Alterações de largura podem mudar o trecho visível ao retomar.
Distribuição ainda incompleta
Há configuração de goreleaser e workflow de release, mas nenhuma tag publicada na verificação. O repositório também não contém arquivo de licença.
estado atual
A suíte go test ./... passou no clone da revisão indicada em 1 de outubro de 2026. As capturas abaixo são artefatos reais do binário, já registrados no repositório do portfólio.
Teste local não é métrica de adoção. Não há números de usuários ou desempenho publicados neste case.
próximas questões
- Publicar uma release e explicitar a licença.
- Avaliar uma posição de leitura independente da largura da interface.
evidência
go test ./... · 2026-10-01
? github.com/bernardofernandezz/tui-ebook-reader/cmd/tbook [no test files]
ok github.com/bernardofernandezz/tui-ebook-reader/internal/cli 0.059s
ok github.com/bernardofernandezz/tui-ebook-reader/internal/core 0.027s
ok github.com/bernardofernandezz/tui-ebook-reader/internal/epub 0.011s
ok github.com/bernardofernandezz/tui-ebook-reader/internal/store 0.006s
ok github.com/bernardofernandezz/tui-ebook-reader/internal/ui 0.038sfontes e revisão
a seguir: Scheduling API