> termcourse : lire et publier sur des instances Discourse depuis le terminal

Ceci est une application en interface texte (TUI), un peu pour le plaisir… et encore un peu expérimentale à ce stade !

:information_source: Résumé Une interface en terminal pour parcourir et publier sur les forums Discourse, avec des listes de sujets, des vues complètes des sujets, des réponses, des likes, une recherche et un composeur intégré.
:hammer_and_wrench: Lien du dépôt GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Guide d’installation README.md dans le dépôt (section Quickstart)
:heart: Sponsoring Merci de considérer l’idée de devenir un sponsor régulier de mon travail open source (Sponsor @merefield on GitHub Sponsors · GitHub) à un niveau adapté aux ressources et aux besoins de votre personne ou de votre organisation, afin de garantir que ce projet reçoive l’entretien qu’il mérite et continue de fonctionner pour votre site à l’avenir.

Vous aimez termcourse ? Merci de lui mettre une :star: sur GitHub

Vue d’ensemble

termcourse est un client Discourse basé sur le terminal, reconstruit en tant qu’exécutable Go unique. Il peut utiliser une session de cookies de type navigateur légère avec un nom d’utilisateur/e-mail et un mot de passe, y compris la MFA TOTP et les codes de secours. L’authentification par clé API est disponible pour les sites où la connexion interactive n’est pas appropriée.

L’interface utilise la pile Charm actuelle et fonctionne avec le clavier et la souris. Sa navigation par dossiers, ses filtres contextuels, ses panneaux responsives, ses contrôles thématisés, son rendu Markdown et ses images en ligne sont conçus pour rendre la navigation dans un forum confortable sans quitter le terminal.

Fonctionnalités

  • Parcourir les listes de sujets Derniers, Chauds, Nouveaux, Non lus, Top et Messages Privés, avec un cycle de périodes pour Top.
  • Naviguer dans les dossiers persistants Sujets, Recherche, Notifications et Compose, avec des filtres de second niveau contextuels.
  • Utiliser le clavier partout, ou cliquer sur les onglets, les lignes de sujets, les contrôles du pied de page et les boutons surlignés au survol.
  • Ouvrir les sujets visibles avec Entrée ou les touches numériques 10.
  • Lire des sujets complets avec chargement paresseux des messages, extraits compacts, messages sélectionnés développés et défilement responsive.
  • Cliquer sur la barre de progression d’un sujet pour sauter directement à ce point dans le flux de messages.
  • Créer des sujets, choisir des catégories, répondre à des sujets ou à des messages individuels, et aimer ou désaimer des messages.
  • Rechercher des messages et sauter directement au message correspondant dans le contexte de son sujet.
  • Parcourir et filtrer les notifications, y compris les badges non lus et messages privés.
  • Composer du contenu multiligne avec déplacement du curseur, insertion, retour à la ligne, prise en charge du collage et validation en direct.
  • Afficher du Markdown GFM y compris les liens, les listes, les citations, le code, les listes de tâches et les tableaux.
  • Afficher des images en ligne et en plein écran de haute qualité avec le protocole graphique Kitty, avec des symboles chafa colorés ou viu comme solutions de repli portables.
  • Recevoir des mises à jour en temps réel des listes de sujets, des sujets, des notifications et des messages privés lors de l’utilisation d’une session cookie.
  • Utiliser des identifiants par site depuis l’environnement ou credentials.yml, avec demande des champs de connexion manquants.
  • Choisir parmi les thèmes default, slate, fairground, rust et hacker, ajouter des thèmes YAML et changer de thème pendant l’exécution de l’application.
  • Utiliser une sortie en truecolor, 256 couleurs ou 16 couleurs avec détection automatique des capacités du terminal.
  • Exécuter l’interface en anglais, français, allemand ou espagnol.
  • Redimensionner librement le terminal : les mises en page, les couleurs, les listes de sujets et les images Kitty réagissent à l’espace disponible.
  • Voir le minutage de réessai fourni par le serveur lorsque Discourse limite un action par taux, avec diagnostics HTTP, UI et image optionnels.

Installation et exécution

Sur Linux ou macOS, l’installateur recommandé télécharge la version préconstruite pour le système d’exploitation et l’architecture actuels, vérifie son empreinte SHA-256 et sa version signalée, puis l’installe :

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

Termcourse demande un nom d’utilisateur et un mot de passe si les identifiants n’ont pas déjà été configurés. La saisie du mot de passe est masquée.

Utilisez termcourse --version pour afficher la version sémantique installée ; la même version apparaît dans l’en-tête large du terminal.

Pour une installation locale à l’utilisateur qui ne nécessite pas sudo :

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

Chaque Release GitHub fournit des empreintes SHA-256 et des archives préconstruites pour Linux, macOS et Windows sur AMD64 et ARM64. Linux/macOS utilisent .tar.gz ; Windows utilise .zip. Les versions préconstruites ne nécessitent pas Go.

Sur Windows, téléchargez et inspectez l’installateur, puis exécutez-le sans modifier la politique d’exécution globale de la machine :

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

Il s’installe par défaut dans %LOCALAPPDATA%\Programs\termcourse\bin et effectue la même vérification d’empreinte et de version. Les installateurs peuvent également épingler une version avec --version ou -Version. Go 1.26.6 ou plus récent n’est requis que lors de l’installation depuis le code source.

Pour construire un exécutable local depuis un checkout plutôt :

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

Pour un usage répété, placez les détails de connexion dans un .env local ou utilisez le credentials.yml par hôte décrit dans le README.

Connexion par nom d’utilisateur/mot de passe (recommandé)

La connexion par nom d’utilisateur/mot de passe active les mises à jour en temps réel :

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

Repli par clé API

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

Consultez le README le plus récent pour la configuration, les thèmes, les contrôles, les backends d’image et le dépannage.

Notes sur l’authentification

  • La connexion par nom d’utilisateur/mot de passe suit le flux CSRF et cookie de Discourse et active les mises à jour MessageBus en temps réel.
  • La MFA TOTP et les codes de secours sont pris en charge.
  • L’authentification par clé API conserve la fonctionnalité HTTP mais n’établit pas de session navigateur en temps réel.
  • Certains sites désactivent ou restreignent la connexion par nom d’utilisateur/mot de passe scriptée ; les identifiants API sont le repli pour ces sites.

Sécurité

  • Termcourse n’écrit pas les identifiants demandés ou les cookies de session sur le disque ; les cookies de session restent en mémoire.
  • La demande de mot de passe garde le mot de passe hors de l’historique du shell.
  • Les identifiants persistants sont optionnels et restent sous le contrôle de l’utilisateur dans des fichiers d’environnement ou YAML.
  • La journalisation de diagnostic est optionnelle, désactivée par défaut, et ne journalise pas les identifiants ou les corps de réponse.

Limites

  • Les sites qui interdisent les flux de connexion à distance peuvent nécessiter l’authentification par clé API.
  • Les mises à jour en temps réel nécessitent l’authentification par cookie avec nom d’utilisateur/mot de passe.
  • La qualité des images en ligne natives dépend de la prise en charge du terminal ; Kitty est préféré, avec un rendu de symboles disponible ailleurs.
  • Il vit dans le terminal. :slight_smile:

Crédits

Partiellement inspiré par Dumbcourse: old browser friendly UI at dumb/d-pad/small screens. :clap:

27 « J'aime »

Ainsi, vous pouvez vous connecter rapidement à plusieurs sites (une seule session à la fois par onglet, évidemment), j’ai apporté les améliorations suivantes :

Améliorations de l’authentification et de la configuration de termcourse

  • Le nom d’utilisateur/mot de passe est désormais le chemin de connexion par défaut.
  • Vous n’avez plus besoin d’inclure https:// - c’est facultatif.
  • Les champs de connexion manquants sont demandés de manière interactive (par exemple : nom d’utilisateur connu, mot de passe manquant).
  • L’aide de l’interface de ligne de commande (CLI) inclut les variables d’environnement principales et les emplacements des fichiers journaux de débogage.

Informations d’identification et comportement des variables d’environnement (ENV)

  • Prend en charge le fichier d’informations d’identification mappé à l’hôte avec l’ordre de recherche suivant :
    1. TERMCOURSE_CREDENTIALS_FILE (si défini)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Précedence de l’authentification :
    1. Indicateurs (flags) de la CLI
    2. Informations d’identification de l’hôte à partir du fichier YAML
    3. Variables d’environnement génériques DISCOURSE_*
    4. Invite interactive
  • Pour l’authentification : les valeurs manquantes de nom d’utilisateur/mot de passe lors de la connexion sont demandées.
  • Pour l’authentification API, le nom d’utilisateur API et la clé doivent tous deux aboutir à des valeurs non vides.

Débogage

  • Débogage HTTP/authentification : TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Débogage du rendu de l’interface utilisateur (UI) : TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Hygiène du dépôt (Repo hygiene)

  • Ajout de credentials.example.yml et .env.example avec des exemples alignés.
  • Ajout d’entrées .gitignore pour les fichiers secrets locaux :
    • .env
    • credentials.yml
3 « J'aime »

C’est assez rudimentaire mais ça fonctionne.

Vous devez avoir viu ou chafa installé - et cela peut être un projet en soi :slight_smile:

En mode haute qualité sur chafa ou avec viu, Windows Terminal est supérieur au terminal MacOS car il prend en charge beaucoup plus de couleurs (merci Microsoft !)

Notes de version : Rendu d’images (dans le terminal !)

Rendu d’images

  • Ajout d’aperçus d’images de publication intégrés avec sélection du backend :
    • essaie chafa en premier, puis viu automatiquement.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable : sortie conservatrice pour la stabilité du terminal.
    • quality : rendu de symboles avec plus de détails/couleurs.
  • Ajout du contrôle de la hauteur de l’aperçu :
    • TERMCOURSE_IMAGE_LINES (défaut : 14)
    • S’applique à la hauteur des lignes d’aperçu ; utile pour ajuster la densité visuelle.
  • Amélioration du comportement d’aspect de viu :
    • Passage au rendu ciblé par ligne (-h) pour mieux préserver le rapport d’aspect.
  • Ajout des contrôles de filtre de qualité d’aperçu :
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 filtre les aperçus bruyants composés uniquement de blocs.
    • Réglez sur 0 pour toujours afficher la sortie du moteur de rendu.
  • Ajout d’une limite de sécurité pour le téléchargement d’images :
    • TERMCOURSE_IMAGE_MAX_BYTES (défaut : 5242880)
    • Empêche les téléchargements d’images surdimensionnées d’affecter les performances.
  • Ajout de la prise en charge des liens d’image Discourse upload://… :
    • Résolution automatique vers /uploads/short-url/…
  • Amélioration de la désinfection/stabilité du terminal :
    • Conserve les codes de couleur SGR valides si nécessaire.
    • Supprime les séquences de contrôle/graphiques déstabilisantes.
    • Empêche l’affichage des fragments d’échappement ANSI sous forme de texte brut.

Une note : J’ai trouvé un site qui bloque le nom d’utilisateur/mot de passe à distance, donc ce client ne fonctionnera pas dans cette situation (à moins que vous ne le possédiez et que vous puissiez définir une clé d’API !) - suggestions bienvenues, mais aucun support actuellement dans ces cas.

Je ne suis pas sûr de l’utiliser dans le monde réel, je n’en vois pas l’utilité pour moi, mais je l’ai essayé et c’est délicieux. J’adore pouvoir interagir avec une plateforme de forum de nouvelle génération depuis une interface primitive, bare-metal.

D’une certaine manière, c’est très esthétiquement plaisant.

1 « J'aime »

Oui, je pense que cela pourrait être utile lorsque :

  • vous êtes sur une plateforme à faible fidélité
  • vous bricolez sur un Raspberry Pi (non encore testé, pour information)
  • depuis un serveur pour vérifier que vous êtes en ligne… ou si le code du front-end plante ! :smiley:
  • pour un site Discourse très basé sur le texte…
  • … et par curiosité technique :slight_smile:

J’ai l’intention de le tester sur mon téléphone avec Terminus…

3 « J'aime »

OK, probablement la dernière mise à jour pour aujourd’hui :

  • l’interface est maintenant réactive au redimensionnement de la fenêtre :tada:
  • améliorations du contenu dans les instructions de la barre supérieure
  • les touches 1 à (1)0 ouvrent maintenant le sujet correspondant dans la liste des sujets

N’oubliez pas de faire un git pull pour obtenir les mises à jour.

3 « J'aime »

Mec, maintenant je dois me mettre au travail sur mes œuvres d’art ASCII !!
¯\_(ツ)_/¯

3 « J'aime »

J’ai ajouté un système de thèmes entièrement personnalisable, voici « fairground » (fête foraine) :

… et voici « slate » (ardoise) :

détails dans le README :graduation_cap:

5 « J'aime »

ok, voici quelques mises à jour intéressantes les amis : :tangerine:

  • ajout de la prise en charge des messages privés - appuyez deux fois sur f :tada:
  • ajout de colonnes supplémentaires pour Catégorie, Utilisateurs, Vues, progressivement lorsque la largeur est étendue
  • ajustement du thème pour les séparateurs verticaux
  • README mis à jour

2 « J'aime »

J’ai fusionné ceci hier :

  • Si vous faites l’effort d’installer chafa ou viu, vous serez maintenant récompensé par une nouvelle fonctionnalité : l’option bascule « fenêtre complète » pour les images de publication. Sous Windows, c’est particulièrement bien en raison de la profondeur de couleur généreuse prise en charge par l’application Windows Terminal.

termcourse affiche désormais une notification de message privé non lu dans la barre d’état de la liste des sujets et, tout comme le client de navigateur, enverra des notifications de lecture message par message lorsque vous déplacez le curseur.

2 « J'aime »

J’ai fusionné des correctifs pour les thèmes sur macOS

2 « J'aime »

Sympa… Est-ce que ça fonctionne sur un Pip-Boy ?

3 « J'aime »

n’hésitez pas à soumettre une PR ou à partager les codes couleur et je les ajouterai aux thèmes d’exemple yml :slight_smile:

2 « J'aime »

J’adore ! Fusionné, merci !

2 « J'aime »

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

Le rendu était horriblement lent… donc je l’ai corrigé… l’interface utilisateur dispose maintenant d’un rendu par différences, ce qui la rend beaucoup plus rapide et fluide… elle ne repeint plus tout l’écran à chaque mouvement du curseur.

Je n’ai testé cela que sous Windows jusqu’à présent, veuillez donc signaler tout problème, mais cela devrait aider considérablement les systèmes plus lents.

J’ai également ajouté quelques tests et GitHub CI !

Dispose désormais d’un système de notification en temps réel basé sur MessageBus pour vous informer dans la barre de statut lorsque la liste des sujets a de nouvelles mises à jour (vous pouvez ainsi appuyer sur g pour rafraîchir) :

Probablement, je vais travailler ensuite sur les badges de lecture des sujets…

C’est super !

Pourquoi ne pas utiliser les mêmes raccourcis clavier que Discourse ? L’expérience serait ainsi plus transparente :slight_smile:

1 « J'aime »

Pas une mauvaise idée… cela vaut certainement la peine d’y jeter un œil à un moment donné pour voir si les choses peuvent être rapprochées de manière sensée :+1: … mais il existe bien sûr des différences importantes dans les supports, donc certaines choses pourraient rester différentes.

1 « J'aime »