pular para o conteúdo
todos os projetos

Ferramenta de terminal / 2026

tbook

Um leitor de EPUB no terminal. Texto, imagens e memória de leitura em um binário Go.

contexto
Projeto pessoal, código público
atuação
Desenvolvimento do leitor em Go
estado
Funcional; sem release publicada
stack
Go / Bubble Tea / Glamour / EPUB
ver código
Biblioteca do tbook com três livros e a capa de Alice no País das Maravilhas renderizada em blocos ANSI.
Biblioteca real do tbook: seleção pelo teclado e capa extraída do EPUB. Captura documentada em public/shots/README.md.

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.

  1. Entrada e biblioteca

    internal/cli

    Comandos, busca e download pelo Project Gutenberg.

  2. Documento

    internal/epub

    EPUB, capítulos, imagens e conversão para Markdown.

  3. Sessão

    internal/core

    Capítulo, percentual, bookmarks e tempo de leitura.

  4. Interface

    internal/ui

    Bubble Tea e renderização por capítulo/largura.

  5. Persistência

    internal/store

    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.

Leitura de Pride and Prejudice no terminal com texto, ilustração ANSI e progresso por capítulo.
Texto e ilustração no mesmo terminal. A interface consome a sessão de leitura, que mantém seu próprio estado.

decisões técnicas

  1. Núcleo independente da TUI

    por quê
    Session concentra navegação e estado, com testes de retomada, limites de capítulo, bookmarks e persistência.
    em vez de
    Guardar essas regras nos handlers da interface.
    o preço
    CLI e TUI precisam coordenar a sessão e o salvamento.
  2. Imagens como caracteres ANSI

    por quê
    A renderização não depende de protocolos gráficos específicos do emulador.
    em vez de
    Usar kitty, sixel ou outro protocolo para exibir a imagem original.
    o preço
    A resolução é limitada; a ilustração permanece reconhecível, mas perde detalhe.
  3. Persistência em JSON

    por quê
    O estado é pequeno e local. A ferramenta abre sem banco ou processo auxiliar.
    em vez de
    Adicionar um banco embutido e consultas estruturadas.
    o preço
    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.038s
Saída da execução local no commit 03186d4; tempos desta execução, sem interpretação como benchmark.

fontes e revisão

a seguir: Scheduling API