> termcourse: leer y publicar en instancias de Discourse desde la terminal

Esta es una aplicación de terminal (TUI), solo un poco de diversión … ¡y un poco experimental en esta etapa!

:information_source: Resumen Una interfaz de terminal para navegar y publicar en foros de Discourse con listas de temas, vistas completas de temas, respuestas, me gusta, búsqueda y un compositor integrado.
:hammer_and_wrench: Enlace al repositorio GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Guía de instalación README.md en el repositorio (sección Quickstart)
:heart: Patrocinio Por favor, considera convertirte en un patrocinador continuo de mi trabajo de código abierto (Sponsor @merefield on GitHub Sponsors · GitHub) en un nivel que se ajuste a los recursos y necesidades de ti o de tu organización, para asegurar que este proyecto reciba el mantenimiento que merece y siga funcionando para tu sitio en el futuro.

¿Disfrutando termcourse? Por favor, dale :star: en GitHub

Resumen

termcourse es un cliente de Discourse basado en terminal, reconstruido como un único ejecutable en Go. Puede utilizar una sesión de cookies ligera de estilo navegador con nombre de usuario/correo electrónico y contraseña, incluyendo MFA con TOTP y códigos de respaldo. La autenticación con clave de API está disponible para sitios donde el inicio de sesión interactivo no sea adecuado.

La interfaz utiliza la pila actual de Charm y funciona tanto con teclado como con ratón. Su navegación de estilo carpeta, filtros contextuales, paneles responsivos, controles con temas, renderizado de Markdown e imágenes en línea están diseñados para hacer la navegación por un foro cómoda sin salir de la terminal.

Características

  • Navega por las listas de temas de Últimos, Calientes, Nuevos, No leídos, Top y Mensajes Privados, con cambio de período para Top.
  • Navega por las carpetas persistentes de Temas, Búsqueda, Notificaciones y Compositor, con filtros de segundo nivel contextuales.
  • Usa el teclado en todo momento, o haz clic en pestañas, filas de temas, controles del pie de página y botones resaltados al pasar el cursor.
  • Abre temas visibles con Enter o las teclas numéricas 10.
  • Lee temas completos con carga perezosa de publicaciones, extractos compactos, publicaciones seleccionadas expandidas y desplazamiento responsivo.
  • Haz clic en la pista de progreso de un tema para saltar directamente a ese punto en el flujo de publicaciones.
  • Crea temas, elige categorías, responde a temas o publicaciones individuales, y da o quita “me gusta” a las publicaciones.
  • Busca publicaciones y salta directamente a la publicación coincidente en su contexto de tema.
  • Navega y filtra notificaciones, incluyendo insignias de no leídos y mensajes privados.
  • Compone contenido de varias líneas con movimiento del cursor, inserción, ajuste de línea, soporte para pegar y validación en vivo.
  • Renderiza Markdown GFM incluyendo enlaces, listas, citas, código, listas de tareas y tablas.
  • Muestra imágenes en línea y a pantalla completa de alta calidad con el protocolo gráfico de Kitty, con símbolos chafa de colores o viu como alternativas portátiles.
  • Recibe actualizaciones en tiempo real de listas de temas, temas, notificaciones y mensajes privados al utilizar una sesión de cookies.
  • Usa credenciales por sitio desde el entorno o credentials.yml, con solicitud de campos de inicio de sesión faltantes.
  • Elige entre los temas default, slate, fairground, rust y hacker, añade temas YAML y cambia de tema mientras la aplicación está en ejecución.
  • Usa salida a color verdadero, 256 colores o 16 colores con detección automática de capacidades de la terminal.
  • Ejecuta la interfaz en inglés, francés, alemán o español.
  • Redimensiona la terminal libremente: los diseños, colores, listas de temas e imágenes de Kitty responden al espacio disponible.
  • Ve el tiempo de reintento proporcionado por el servidor cuando Discourse limita por tasa una acción, con diagnósticos opcionales de HTTP, UI e imágenes.

Instalación y ejecución

En Linux o macOS, el instalador recomendado descarga la versión precompilada para el sistema operativo y la arquitectura actuales, verifica su suma de control SHA-256 y la versión informada, y luego la instala:

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

Termcourse solicita un nombre de usuario y una contraseña cuando las credenciales no se han configurado previamente. La entrada de la contraseña está oculta.

Usa termcourse --version para mostrar la versión semántica instalada; la misma versión aparece en el encabezado amplio de la terminal.

Para una instalación local de usuario que no requiere sudo:

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

Cada GitHub Release proporciona sumas de control SHA-256 y archivos precompilados para Linux, macOS y Windows en AMD64 y ARM64. Linux/macOS usan .tar.gz; Windows usa .zip. Las versiones precompiladas no requieren Go.

En Windows, descarga e inspecciona el instalador y luego ejecútalo sin cambiar la política de ejecución de todo el sistema:

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

Por defecto, se instala en %LOCALAPPDATA%\Programs\termcourse\bin y realiza la misma verificación de suma de control y versión. Los instaladores también pueden fijar una versión con --version o -Version. Go 1.26.6 o superior solo es necesario al instalar desde el código fuente.

Para compilar un ejecutable local desde un clon en su lugar:

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

Para uso repetido, coloca los datos de inicio de sesión en un .env local o usa el credentials.yml por host descrito en el README.

Inicio de sesión con nombre de usuario/contraseña (recomendado)

El inicio de sesión con nombre de usuario/contraseña habilita las actualizaciones en tiempo real:

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

Alternativa con clave de API

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

Consulta el README más reciente para configuración, temas, controles, motores de imagen y solución de problemas.

Notas de autenticación

  • El inicio de sesión con nombre de usuario/contraseña sigue el flujo CSRF y de cookies de Discourse y habilita las actualizaciones en tiempo real de MessageBus.
  • Se admiten MFA con TOTP y códigos de respaldo.
  • La autenticación con clave de API mantiene la funcionalidad HTTP pero no establece una sesión de navegador en tiempo real.
  • Algunos sitios deshabilitan o restringen el inicio de sesión con nombre de usuario/contraseña mediante guiones; las credenciales de API son la alternativa para esos sitios.

Seguridad

  • Termcourse no escribe las credenciales solicitadas ni las cookies de sesión en el disco; las cookies de sesión permanecen en memoria.
  • La solicitud de contraseña mantiene la contraseña fuera del historial de la shell.
  • Las credenciales persistentes son opcionales y permanecen bajo el control del usuario en archivos de entorno o YAML.
  • El registro de diagnóstico es opcional, deshabilitado por defecto, y no registra credenciales ni cuerpos de respuesta.

Limitaciones

  • Los sitios que prohíben los flujos de inicio de sesión remoto pueden requerir autenticación con clave de API.
  • Las actualizaciones en tiempo real requieren autenticación con cookies de nombre de usuario/contraseña.
  • La calidad de las imágenes en línea nativas depende del soporte de la terminal; se prefiere Kitty, con renderizado de símbolos disponible en otros lugares.
  • Vive en la terminal. :slight_smile:

Créditos

Parcialmente inspirado en Dumbcourse: interfaz amigable con navegadores antiguos en pantallas pequeñas/d-pad. :clap:

27 Me gusta

Para que puedas iniciar sesión rápidamente en múltiples sitios (obviamente una sesión a la vez por pestaña), he realizado las siguientes mejoras:

Mejoras en la autenticación y configuración de termcourse

  • La ruta de inicio de sesión predeterminada ahora es nombre de usuario/contraseña.
  • Ya no es necesario incluir https:// - esto es opcional
  • Los campos de inicio de sesión faltantes se solicitan de forma interactiva (por ejemplo: nombre de usuario conocido, contraseña faltante).
  • La ayuda de la CLI incluye variables de entorno principales y ubicaciones de archivos de registro de depuración.

Comportamiento de las credenciales y las variables de entorno

  • Admite un archivo de credenciales mapeado por host con orden de búsqueda:
    1. TERMCOURSE_CREDENTIALS_FILE (si está configurado)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Precedencia de autenticación:
    1. Indicadores (flags) de la CLI
    2. Credenciales de host desde YAML
    3. Variables de entorno DISCOURSE_* genéricas
    4. Solicitud interactiva
  • Para la autenticación: se solicitan los valores faltantes de nombre de usuario/contraseña para el inicio de sesión.
  • Para la autenticación de API, tanto el nombre de usuario de la API como la clave deben resolverse en valores no vacíos.

Depuración

  • Depuración HTTP/autenticación: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Depuración de renderizado de UI: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Higiene del repositorio

  • Se añadieron credentials.example.yml y .env.example con ejemplos alineados.
  • Se añadieron entradas a .gitignore para archivos secretos locales:
    • .env
    • credentials.yml
3 Me gusta

Esto es bastante rudimentario, pero funciona.

Necesitas tener instalado viu o chafa, y eso ya puede ser un proyecto en sí mismo :slight_smile:

En el modo de alta calidad con chafa o con viu, Windows Terminal es superior a la terminal de MacOS porque soporta muchos más colores (¡gracias Microsoft!)

Notas de la versión: Renderizado de imágenes (¡en la terminal!)

Renderizado de imágenes

  • Se añadieron previsualizaciones de imágenes posteriores en línea con selección de backend:
    • intenta chafa primero automáticamente, luego viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: salida conservadora para la estabilidad de la terminal.
    • quality: renderizado de símbolos de mayor detalle/color.
  • Se añadió control de altura de previsualización:
    • TERMCOURSE_IMAGE_LINES (predeterminado: 14)
    • Se aplica a la altura de la línea de previsualización; útil para ajustar la densidad visual.
  • Comportamiento de aspecto de viu mejorado:
    • Cambiado a renderizado dirigido por línea (-h) para preservar mejor la relación de aspecto.
  • Se añadieron controles de filtro de calidad de previsualización:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 filtra las previsualizaciones ruidosas solo de bloques.
    • Establécelo en 0 para mostrar siempre la salida del renderizador.
  • Se añadió límite de seguridad de descarga de imágenes:
    • TERMCOURSE_IMAGE_MAX_BYTES (predeterminado: 5242880)
    • Evita que las descargas de imágenes de gran tamaño afecten el rendimiento.
  • Se añadió soporte para enlaces de imágenes Discourse upload://…:
    • Resuelve automáticamente a /uploads/short-url/…
  • Estabilización/sanitización de la terminal mejorada:
    • Mantiene los códigos de color SGR válidos donde sea necesario.
    • Elimina secuencias de control/gráficas desestabilizadoras.
    • Evita que los fragmentos de escape ANSI se muestren como texto sin procesar.

Una nota: He encontrado un sitio que bloquea el nombre de usuario/contraseña remotos, por lo que este cliente no funcionará en esa situación (¡a menos que sea suyo y pueda configurar una clave de API!) - se aceptan sugerencias, pero actualmente no hay soporte en esas instancias.

No estoy seguro de si usaré esto en el mundo real, no le veo la utilidad para mí, pero lo he probado y es delicioso. Me encanta poder interactuar con una plataforma de foro de próxima generación desde una interfaz primitiva y de metal desnudo.

De alguna manera, es muy estéticamente agradable.

1 me gusta

Sí, creo que podría ser útil cuando:

  • estás en una plataforma de baja fidelidad
  • estás jugando con una Raspberry Pi (aún no probado, para tu información)
  • desde un servidor para comprobar que estás activo… ¡o si el código del front-end está fallando! :smiley:
  • para un sitio de Discourse que se basa mucho en texto…
  • … y como curiosidad técnica :slight_smile:

He estado pensando en probarlo en mi teléfono con Terminus…

3 Me gusta

OK, probablemente la última actualización de hoy:

  • La interfaz ahora responde al redimensionamiento de la ventana :tada:
  • Mejoras en el contenido de las instrucciones de la barra superior
  • Las teclas del 1 al (1)0 ahora abren ese número de tema en la lista de temas

Recuerda hacer git pull para obtener las actualizaciones.

3 Me gusta

¡Hombre, ahora tengo que ponerme a trabajar en mi arte ASCII!
¯\_(ツ)_/¯

3 Me gusta

He añadido un sistema de temas totalmente personalizable, este es “fairground” (carrusel):

… y este es “slate” (pizarra):

Detalles en el README :graduation_cap:

5 Me gusta

Aquí vamos chicos, algunas jugosas :tangerine: actualizaciones:

  • Añadir soporte para Mensajes Privados - pulsa f dos veces :tada:
  • Añadir columnas adicionales para Categoría, Usuarios, Vistas, progresivamente a medida que se expande el ancho
  • Ajustar la tematización para los separadores verticales
  • README actualizado

2 Me gusta

He fusionado esto ayer:

  • Si te esfuerzas en instalar chafa o viu, ahora serás recompensado con una nueva característica: el interruptor de “ventana completa” para las imágenes de las publicaciones. En Windows, esto es particularmente bueno debido a la generosa compatibilidad con la profundidad de color en la aplicación de terminal de Windows.

termcourse ahora tiene una ventana emergente de estado de mensaje privado (PM) no leído en la barra de estado de la lista de temas y, al igual que el cliente del navegador, enviará notificaciones de lectura publicación por publicación a medida que mueva el cursor.

2 Me gusta

He fusionado correcciones para temas en macOS

2 Me gusta

Genial… ¿Funciona en un Pip-Boy?

3 Me gusta

no dudes en hacer un PR de eso o compartir los códigos de color y los añadiré a los temas de ejemplo en yml :slight_smile:

2 Me gusta

¡Me encanta! ¡Fusionado, gracias!

2 Me gusta

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

Así que el renderizado apestaba… así que lo he arreglado… la interfaz de usuario ahora tiene renderizado de diferencias, por lo que es mucho más rápido y fluido… ya no pinta toda la pantalla con cada movimiento del cursor.

Solo he probado esto en Windows hasta ahora, así que por favor, informad de cualquier problema, pero debería ayudar significativamente a los sistemas más lentos.

¡También he añadido algunas pruebas y GitHub CI!

Ahora tiene un sistema de notificación en tiempo real basado en MessageBus para notificarle en la barra de estado cuando la lista de temas tenga nuevas actualizaciones (así puede presionar g para actualizar):

Probablemente trabajaré en las insignias de temas leídos a continuación…

¡Eso es genial!

¿Por qué no usar los mismos atajos de teclado que Discourse? Así la experiencia sería más fluida :slight_smile:

1 me gusta

No es una mala idea… definitivamente vale la pena revisarlo en algún momento para ver si las cosas se pueden acercar de manera sensata :+1: … pero por supuesto hay diferencias significativas en el medio, por lo que algunas cosas podrían seguir siendo diferentes.

1 me gusta