Ceci est une application en interface texte (TUI), un peu pour le plaisir… et encore un peu expérimentale à ce stade !
| 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é. | |
| 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 | |
| Guide d’installation | README.md dans le dépôt (section Quickstart) | |
| 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
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
1–0. - 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
chafacolorés ouviucomme 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,rustethacker, 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.

Crédits
Partiellement inspiré par Dumbcourse: old browser friendly UI at dumb/d-pad/small screens. ![]()





