Executando verificação de segurança...
2

Pitch: Pare de Perder Output do Terminal: Criei uma CLI que Grava e Pesquisa suas Sessões de Shell

Se você passa a maior parte do dia no terminal, provavelmente já passou por isso: está debugando um serviço, acompanhando logs em três abas diferentes, com hot-reload rodando no dev server, e aí precisa daquele stack trace de vinte minutos atrás. Sumiu. Scrollback limpo, terminal fechado, ou simplesmente soterrado por output mais recente.

Cansei disso. Então criei o broll, uma CLI em Rust que grava suas sessões de terminal, armazena tudo em SQLite com full-text search e permite navegar por tudo depois em uma TUI.

O nome vem de B-roll, aquela filmagem de bastidores no cinema que captura tudo que acontece por trás da cena principal. É exatamente o que o output do seu terminal é: a filmagem não roteirizada dos bastidores do seu trabalho de desenvolvimento. Você não pensa nela enquanto está rodando, mas quando algo dá errado, é a primeira coisa que queria ter guardado.

Se quiser pular direto para testar, a documentação tem tudo que você precisa para começar:

cargo install broll

O Problema

Emuladores de terminal oferecem um buffer de scrollback. Esse buffer é finito, restrito à sessão e não pesquisável. Se você está rodando um dev server com hot-reload, cada reinício apaga o output anterior. Se está trabalhando em múltiplos terminais, um para a API, um para um worker, outro para comandos avulsos, correlacionar o que aconteceu entre eles depois é praticamente impossível.

Dá para redirecionar para arquivos, claro. Mas isso exige saber de antemão qual output você vai precisar depois, e você perde a interatividade do shell.

Como o broll Funciona

Você envolve sua sessão de shell com broll start e trabalha normalmente. Quando terminar, exit ou broll stop. Tudo entre esses dois pontos, cada comando digitado e cada byte de output, é capturado, com timestamp, e armazenado.

$ broll start --name "debugging-auth-issue"
# ... trabalhe normalmente, rode comandos, acompanhe logs ...
$ exit

Por baixo dos panos, o broll cria um PTY sub-shell e instala hooks leves no shell (zsh preexec/precmd, bash PROMPT_COMMAND) que emitem sequências de escape OSC. Esses marcadores permitem que o recorder do broll diferencie o que você digitou do que o shell imprimiu de volta, sem interferir no seu fluxo de trabalho. Seu shell se comporta exatamente como sempre. O broll é invisível até você precisar dele.

O output capturado vai para o SQLite com indexação FTS5 full-text. Isso significa que você pode pesquisar em todas as suas sessões depois:

$ broll search "connection refused"

Isso abre uma TUI com dois painéis e busca ao vivo: os resultados atualizam conforme você digita, com debounce no input. Selecione um resultado e pressione Enter para abrir o visualizador completo da sessão, posicionado direto na linha relevante.

A TUI

O visualizador e os painéis de busca são construídos com ratatui. Algumas coisas das quais estou particularmente satisfeito:

  • Syntax highlighting para JSON, níveis de log (ERROR/WARN/INFO/DEBUG), URLs e referências file:line no output
  • Yank estilo vim (yy, Y, V para visual line mode) para copiar linhas direto para o clipboard
  • Suporte a mouse para scroll e clique nos resultados
  • Busca dentro da sessão com / no visualizador, igual ao less/vim

O visualizador preserva a formatação do terminal. O broll usa um terminal virtual (crate vt100) para renderizar os bytes brutos capturados, então output colorido, barras de progresso e alinhamento de colunas ficam corretos quando você revisa depois.

Redação Automática de Secrets

Como sessões de terminal podem conter conteúdo sensível, como variáveis de ambiente com tokens, API keys, URLs de banco de dados ou JWTs, o broll passa todo output capturado por um filtro de redação antes de armazenar. Padrões regex cobrem sete categorias de secrets (chaves AWS, bearer tokens, blocos de chave privada, connection strings, etc.) e substituem os valores sensíveis por [REDACTED], preservando o contexto ao redor.

Por exemplo, algo assim:

export DATABASE_URL=postgres://admin:[REDACTED]@db.prod.internal:5432/myapp
export AWS_SECRET_ACCESS_KEY=[REDACTED]
Authorization: Bearer [REDACTED]

Isso vem ativado por padrão. Você pode desabilitar com --no-filter se precisar do output bruto para uma sessão específica.

Outras Features

  • Gerenciamento de sessões: nomear, renomear, anotar, agrupar, deletar e visualizar estatísticas
  • Export/import: compartilhar sessões como arquivos JSON portáveis com colegas
  • Extração de comandos: extrair apenas os comandos de uma sessão (sem output) para documentação ou scripting
  • Prefix matching: broll view abc encontra o session ID abc123... para não precisar digitar UUIDs completos

Próximos Passos

Estou planejando uma série de vídeos detalhados, com deep dive mostrando como as features do broll funcionam por dentro, passando linha por linha pelo código Rust. Tem muita coisa interessante aqui: criação de PTY, parsing de sequências de escape OSC, state machines para delimitar comandos e output, I/O multi-threaded com channels, tratamento de resize do terminal com atomics, e integração de busca full-text com FTS5. Não serão overviews rápidos. Cada vídeo será um deep dive real nos internals, então se você curte Rust ou systems programming, acho que vai aproveitar bastante.

Algumas features no roadmap: busca com regex, timelines entre sessões, chunks de output retráteis e auto-start via integração com o shell para nem precisar rodar broll start.


broll é licenciado sob MIT e está disponível no crates.io e no GitHub.

Se você testar, adoraria ouvir seu feedback. E se terminal tooling ou internals de Rust são sua praia, acompanhe. Tem mais conteúdo vindo.

Carregando publicação patrocinada...