> termcourse: leia e publique em instâncias do Discourse pelo terminal

Este é um aplicativo de terminal (TUI), apenas um pouco de diversão … e um pouco experimental nesta fase!

:information_source: Resumo Uma interface de terminal para navegar e publicar em fóruns Discourse, com listas de tópicos, visualização completa de tópicos, respostas, curtidas, busca e um compositor embutido.
:hammer_and_wrench: Link do Repositório GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Guia de Instalação README.md no repositório (seção Quickstart)
:heart: Patrocínio Considere se tornar um patrocinador contínuo do meu trabalho de código aberto (Sponsor @merefield on GitHub Sponsors · GitHub) em um nível que atenda aos recursos e necessidades de você ou da sua organização, para garantir que este projeto receba a manutenção que merece e continue funcionando para o seu site no futuro.

Gostando do termcourse? Por favor, dê uma :star: no GitHub

Visão Geral

O termcourse é um cliente Discourse baseado em terminal, reconstruído como um executável único em Go. Ele pode usar uma sessão de cookies leve, estilo navegador, com nome de usuário/e-mail e senha, incluindo MFA com TOTP e códigos de reserva. A autenticação por chave de API está disponível para sites onde o login interativo não é adequado.

A interface usa o stack atual da Charm e funciona tanto com teclado quanto com mouse. Sua navegação em estilo de pastas, filtros contextuais, painéis responsivos, controles com temas, renderização de Markdown e imagens inline foram projetados para tornar a navegação em um fórum confortável sem sair do terminal.

Funcionalidades

  • Navegue pelas listas de tópicos Latest, Hot, New, Unread, Top e Private Message, com alternância do período de Top.
  • Navegue pelas pastas persistentes Topics, Search, Notifications e Compose, com filtros de segundo nível contextuais.
  • Use o teclado em todo o aplicativo ou clique em abas, linhas de tópicos, controles do rodapé e botões destacados ao passar o mouse.
  • Abra tópicos visíveis com Enter ou teclas de número 10.
  • Leia tópicos completos com carregamento preguiçoso de posts, trechos compactos, posts selecionados expandidos e rolagem responsiva.
  • Clique na trilha de progresso de um tópico para pular diretamente para aquele ponto no fluxo de posts.
  • Crie tópicos, escolha categorias, responda a tópicos ou posts individuais e curta ou deixe de curtir posts.
  • Busque posts e vá diretamente para o post correspondente no contexto do seu tópico.
  • Navegue e filtre notificações, incluindo badges de não lidas e mensagens privadas.
  • Componha conteúdo de várias linhas com movimento de cursor, inserção, quebra de linha, suporte a colar e validação em tempo real.
  • Renderize Markdown GFM, incluindo links, listas, citações, código, listas de tarefas e tabelas.
  • Exiba imagens inline e em tela cheia de alta qualidade com o protocolo gráfico Kitty, com símbolos coloridos chafa ou viu como alternativas portáteis.
  • Receba atualizações em tempo real de listas de tópicos, tópicos, notificações e mensagens privadas ao usar uma sessão de cookies.
  • Use credenciais por site a partir do ambiente ou credentials.yml, com solicitação para campos de login ausentes.
  • Escolha entre os temas default, slate, fairground, rust e hacker, adicione temas YAML e alterne temas enquanto o aplicativo está em execução.
  • Use saída truecolor, 256 cores ou 16 cores com detecção automática de capacidade do terminal.
  • Execute a interface em inglês, francês, alemão ou espanhol.
  • Redimensione o terminal livremente: layouts, cores, listas de tópicos e imagens Kitty respondem ao espaço disponível.
  • Veja o tempo de repetição fornecido pelo servidor quando o Discourse limita a taxa de uma ação, com diagnósticos opcionais de HTTP, UI e imagem.

Instalação e execução

No Linux ou macOS, o instalador recomendado baixa a release pré-compilada para o sistema operacional e arquitetura atuais, verifica seu checksum SHA-256 e a versão relatada, e então a instala:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh | sh
termcourse your.discourse.host

O Termcourse solicita um nome de usuário e senha quando as credenciais ainda não foram configuradas. A entrada da senha é oculta.

Use termcourse --version para mostrar a versão semântica instalada; a mesma versão aparece no cabeçalho largo do terminal.

Para uma instalação local de usuário que não requer sudo:

curl -fsSL https://raw.githubusercontent.com/merefield/termcourse/master/install-release.sh |
  TERMCOURSE_BIN_DIR="$HOME/.local/bin" sh

Cada GitHub Release fornece checksums SHA-256 e arquivos pré-compilados para Linux, macOS e Windows em AMD64 e ARM64. Linux/macOS usam .tar.gz; Windows usa .zip. As releases pré-compiladas não requerem Go.

No Windows, baixe e inspecione o instalador, e então execute-o sem alterar a política de execução da máquina:

Invoke-WebRequest https://raw.githubusercontent.com/merefield/termcourse/master/install-release.ps1 -OutFile install-release.ps1
powershell -NoProfile -ExecutionPolicy Bypass -File .\install-release.ps1

Ele instala em %LOCALAPPDATA%\Programs\termcourse\bin por padrão e executa a mesma verificação de checksum e versão. Os instaladores também podem fixar uma release com --version ou -Version. Go 1.26.6 ou mais novo é necessário apenas ao instalar a partir do código-fonte.

Para construir um executável local a partir de um checkout em vez disso:

git clone https://github.com/merefield/termcourse.git
cd termcourse
make build
./termcourse your.discourse.host

Para uso repetido, coloque os detalhes de login em um .env local ou use o credentials.yml por host descrito no README.

Login com nome de usuário/senha (recomendado)

O login com nome de usuário/senha habilita atualizações em tempo real:

DISCOURSE_USERNAME="you@example.com" \
DISCOURSE_PASSWORD="your_password" \
termcourse your.discourse.host

Fallback com chave de API

DISCOURSE_API_KEY="your_key" \
DISCOURSE_API_USERNAME="your_username" \
termcourse your.discourse.host

Veja o README mais recente para configuração, temas, controles, backends de imagem e solução de problemas.

Notas de autenticação

  • O login com nome de usuário/senha segue o fluxo CSRF e de cookies do Discourse e habilita atualizações em tempo real do MessageBus.
  • MFA com TOTP e códigos de reserva é suportado.
  • A autenticação por chave de API mantém a funcionalidade HTTP, mas não estabelece uma sessão de navegador em tempo real.
  • Alguns sites desativam ou restringem o login com nome de usuário/senha via script; as credenciais de API são o fallback para esses sites.

Segurança

  • O Termcourse não grava credenciais solicitadas ou cookies de sessão em disco; os cookies de sessão permanecem na memória.
  • A solicitação de senha mantém a senha fora do histórico do shell.
  • Credenciais persistentes são opcionais e permanecem sob o controle do usuário em arquivos de ambiente ou YAML.
  • O registro de diagnóstico é opt-in, desativado por padrão e não registra credenciais ou corpos de resposta.

Limitações

  • Sites que proíbem fluxos de login remoto podem requerer autenticação por chave de API.
  • Atualizações em tempo real requerem autenticação por cookie com nome de usuário/senha.
  • A qualidade de imagens inline nativas depende do suporte do terminal; Kitty é preferido, com renderização de símbolos disponível em outros lugares.
  • Ele vive no terminal. :slight_smile:

Créditos

Parcialmente inspirado por Dumbcourse: old browser friendly UI at dumb/d-pad/small screens. :clap:

27 curtidas

Para que você possa fazer login rapidamente em vários sites (obviamente uma sessão por vez por aba), fiz as seguintes melhorias:

Melhorias de autenticação e configuração do termcourse

  • O caminho de login padrão agora é nome de usuário/senha.
  • Você não precisa mais incluir https:// — isso é opcional
  • Campos de login ausentes são solicitados interativamente (por exemplo: nome de usuário conhecido, senha ausente).
  • A ajuda da CLI inclui variáveis de ambiente principais e locais de arquivos de log de depuração.

Credenciais e comportamento de ENV

  • Suporta arquivo de credenciais mapeado por host com ordem de pesquisa:
    1. TERMCOURSE_CREDENTIALS_FILE (se definido)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Precedência de autenticação:
    1. Sinalizadores da CLI
    2. Credenciais do host do YAML
    3. Variáveis de ambiente DISCOURSE_* genéricas
    4. Solicitação interativa
  • Para autenticação: ao fazer login, valores ausentes de nome de usuário/senha são solicitados.
  • Para autenticação de API, tanto o nome de usuário da API quanto a chave devem resultar em valores não vazios.

Depuração

  • Depuração de HTTP/autenticação: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Depuração de renderização de UI: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Higiene do repositório

  • Adicionados credentials.example.yml e .env.example com exemplos alinhados.
  • Adicionadas entradas .gitignore para arquivos secretos locais:
    • .env
    • credentials.yml
3 curtidas

Isto é bem rudimentar, mas funciona.

Você precisa ter o viu ou o chafa instalados - e isso pode ser um projeto em si :slight_smile:

No modo de alta qualidade no chafa ou com o viu, o Windows Terminal é superior ao terminal do MacOS porque suporta muito mais cores (obrigado Microsoft!)

Notas de Lançamento: Renderização de Imagem (no terminal!)

Renderização de Imagem

  • Adicionadas pré-visualizações de imagem de postagem em linha com seleção de backend:
    • tenta o chafa primeiro automaticamente, depois o viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: saída conservadora para estabilidade do terminal.
    • quality: renderização de símbolos com detalhes/cores mais altos.
  • Adicionado controle de altura da pré-visualização:
    • TERMCOURSE_IMAGE_LINES (padrão: 14)
    • Aplica-se à altura da linha de pré-visualização; útil para ajustar a densidade visual.
  • Comportamento de aspecto do viu aprimorado:
    • Mudou para renderização direcionada por linha (-h) para preservar melhor a proporção.
  • Adicionados controles de filtro de qualidade de pré-visualização:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 filtra pré-visualizações barulhentas apenas com blocos.
    • Defina como 0 para sempre mostrar a saída do renderizador.
  • Adicionado limite de segurança para download de imagem:
    • TERMCOURSE_IMAGE_MAX_BYTES (padrão: 5242880)
    • Impede que downloads de imagens grandes demais afetem o desempenho.
  • Adicionado suporte para links de imagem upload://... do Discourse:
    • Resolve automaticamente para /uploads/short-url/....
  • Sanitização/estabilidade do terminal aprimorada:
    • Mantém códigos de cores SGR válidos onde necessário.
    • Remove sequências de controle/gráficas desestabilizadoras.
    • Impede que fragmentos de escape ANSI sejam exibidos como texto puro.

Uma observação: encontrei um site que bloqueia nome de usuário/senha remotos, então este cliente não funcionará nessa situação (a menos que você o possua e possa definir uma chave de API!) - sugestões são bem-vindas, mas atualmente não há suporte nessas instâncias.

Não tenho certeza se usarei isso no mundo real, não vejo a utilidade para mim, mas experimentei e é delicioso. Adoro poder interagir com uma plataforma de fórum de próxima geração a partir de uma interface primitiva e bare-metal.

De certa forma, é muito esteticamente agradável.

1 curtida

Sim, estou pensando que pode ser útil quando:

  • você está em uma plataforma de baixa fidelidade
  • mexendo em um Raspberry Pi (ainda não testado, a propósito)
  • de um servidor para verificar se você está ativo… ou se o código do front-end está travando! :smiley:
  • para um site Discourse que é muito baseado em texto…
  • … e como uma curiosidade técnica :slight_smile:

Eu estava querendo testá-lo no meu celular com o Terminus…

3 curtidas

OK, provavelmente a última atualização de hoje:

  • A interface agora é responsiva ao redimensionamento da janela :tada:
  • Melhorias no conteúdo das instruções da barra superior
  • As teclas de 1 a (1)0 agora abrem o tópico correspondente na lista de tópicos

Lembre-se de usar git pull para obter as atualizações.

3 curtidas

Cara, agora eu tenho que começar a trabalhar na minha arte ASCII!!
¯\_(ツ)_/¯

3 curtidas

Adicionei um sistema de temas totalmente personalizável, este é o “fairground” (carrinho de feira):

… e este é o “slate” (ardósia):

Detalhes no README :graduation_cap:

5 curtidas

ok, vamos lá pessoal, algumas atualizações :tangerine: suculentas:

  • adicionar suporte para Mensagens Privadas - toque em f duas vezes :tada:
  • adicionar colunas adicionais para Categoria, Usuários, Visualizações, progressivamente quando a largura for expandida
  • ajustar a temática para separadores verticais
  • README atualizado

2 curtidas

Eu fiz o merge disto ontem:

  • Se você se esforçar para instalar chafa ou viu, agora será recompensado com um novo recurso: o toggle “janela cheia” para imagens de post. No Windows, isso é particularmente bom devido ao generoso suporte de profundidade de cor no aplicativo Windows Terminal.

O termcourse agora tem um pop-up de status de MP não lida na barra de status da lista de tópicos e, assim como o cliente do navegador, enviará notificações de leitura post por post à medida que você move o cursor

2 curtidas

Eu mesclei correções para temas no macOS

2 curtidas

Legal… Roda em um Pip-Boy?

3 curtidas

sinta-se à vontade para enviar um PR ou compartilhar os códigos de cores e eu os adicionarei aos temas de exemplo no arquivo yml :slight_smile:

2 curtidas

Adorei! Mesclado, obrigado!

2 curtidas

https://github.com/merefield/termcourse/pull/2

A renderização era péssima… então eu consertei… a interface do usuário agora tem renderização de diferença, então é muito mais rápida e suave… ela não pinta mais a tela inteira a cada movimento do cursor.

Eu testei isso apenas no Windows até agora, então, por favor, relatem quaisquer problemas - mas isso deve ajudar significativamente os sistemas mais lentos.

Eu também adicionei alguns testes e GitHub CI!

Agora tem um sistema de notificação em tempo real baseado no MessageBus para notificá-lo na barra de status quando a lista de tópicos tiver novas atualizações (assim você pode pressionar g para atualizar):

Provavelmente vou trabalhar nos emblemas de leitura de tópicos em seguida…

Ótimo!

Por que não usar os mesmos atalhos de teclado do Discourse? Assim a experiência seria mais integrada :slight_smile:

1 curtida

Não é uma má ideia… vale a pena analisar em algum momento para ver se as coisas podem ser trazidas para mais perto de forma sensata :+1: … mas há, é claro, algumas diferenças significativas no meio, então algumas coisas podem permanecer diferentes.

1 curtida