> termcourse: Lesen und Posten auf Discourse-Instanzen aus der Konsole

Dies ist eine Terminal-App (TUI), einfach ein bisschen Spaß … und in dieser Phase noch etwas experimentell!

:information_source: Zusammenfassung Eine Terminal-UI zum Durchsuchen und Posten in Discourse-Foren mit Themenlisten, vollständigen Themenansichten, Antworten, Likes, Suche und einem integrierten Composer.
:hammer_and_wrench: Repository-Link GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Installationsanleitung README.md im Repository (Abschnitt Quickstart)
:heart: Sponsoring Bitte erwäge, ein dauerhafter Sponsor meiner Open-Source-Arbeit zu werden (Sponsor @merefield on GitHub Sponsors · GitHub) – auf einer Ebene, die zu den Ressourcen und Bedürfnissen deiner Person oder deiner Organisation passt, um sicherzustellen, dass dieses Projekt die Wartung erhält, die es verdient, und in Zukunft weiterhin für deine Seite funktioniert.

Nimmst du gerne termcourse? Bitte gib ihm einen :star: auf GitHub

Übersicht

termcourse ist ein terminalbasierter Discourse-Client, der als einzelne Go-Executable neu aufgebaut wurde. Er kann eine leichte, browserähnliche Cookie-Session mit Benutzername/E-Mail und Passwort verwenden, einschließlich TOTP und Backup-Code-MFA. Die Authentifizierung per API-Schlüssel ist für Seiten verfügbar, für die ein interaktiver Login ungeeignet ist.

Die Oberfläche verwendet den aktuellen Charm-Stack und funktioniert sowohl mit Tastatur als auch mit Maus. Die ordnerbasierte Navigation, kontextabhängigen Filter, reaktiven Panels, thematisierten Steuerelemente, Markdown-Rendering und Inline-Bilder sind so konzipiert, dass das Durchsuchen eines Forums bequem möglich ist, ohne das Terminal zu verlassen.

Funktionen

  • Durchsuchen der Themenlisten Latest, Hot, New, Unread, Top und Private Message, mit Zyklieren der Top-Periode.
  • Navigieren in den persistenten Ordnern Topics, Search, Notifications und Compose, mit kontextabhängigen Zweitstufen-Filtern.
  • Durchgehend die Tastatur verwenden oder auf Tabs, Themenzeilen, Fußzeilen-Steuerelemente und hervorgehobene Buttons klicken.
  • Sichtbare Themen mit Enter oder den Zifferntasten 10 öffnen.
  • Vollständige Themen mit Lazy-Post-Loading, kompakten Auszügen, erweiterten ausgewählten Posts und reaktivem Scrolling lesen.
  • Auf den Fortschrittsbalken eines Themas klicken, um direkt zu diesem Punkt im Post-Stream zu springen.
  • Themen erstellen, Kategorien auswählen, auf Themen oder einzelne Posts antworten und Posts liken oder den Like entfernen.
  • Posts durchsuchen und direkt zum passenden Post in seinem Themenkontext springen.
  • Benachrichtigungen durchsuchen und filtern, einschließlich ungelesener und privater Nachrichten-Badges.
  • Mehrzeiligen Inhalt mit Cursorbewegung, Einfügen, Zeilenumbruch, Paste-Unterstützung und Live-Validierung erstellen.
  • GFM-Markdown rendern, einschließlich Links, Listen, Zitate, Code, Aufgabenlisten und Tabellen.
  • Hochwertige Inline- und Vollbildbilder mit dem Kitty-Grafikprotokoll anzeigen, mit farbigen chafa-Symbolen oder viu als portablen Fallbacks.
  • Echtzeit-Updates für Themenlisten, Themen, Benachrichtigungen und private Nachrichten erhalten, wenn eine Cookie-Session verwendet wird.
  • Seiten-spezifische Anmeldedaten aus der Umgebung oder credentials.yml verwenden, mit Eingabeaufforderungen für fehlende Login-Felder.
  • Aus den Themen default, slate, fairground, rust und hacker wählen, YAML-Themen hinzufügen und Themen während der Laufzeit der App wechseln.
  • Truecolor-, 256-Farb- oder 16-Farb-Ausgabe mit automatischer Erkennung der Terminalfähigkeiten verwenden.
  • Die Oberfläche auf Englisch, Französisch, Deutsch oder Spanisch ausführen.
  • Das Terminal frei vergrößern: Layouts, Farben, Themenlisten und Kitty-Bilder reagieren auf den verfügbaren Platz.
  • Vom Server bereitgestellte Wiederholungszeiten anzeigen, wenn Discourse eine Aktion rate-limitet, mit optionalen HTTP-, UI- und Bild-Diagnosen.

Installation und Ausführung

Auf Linux oder macOS lädt der empfohlene Installer die vorab gebaute Release-Version für das aktuelle Betriebssystem und die Architektur herunter, verifiziert dessen SHA-256-Prüfsumme und die gemeldete Version und installiert sie dann:

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

Termcourse fragt nach Benutzernamen und Passwort, wenn die Anmeldedaten noch nicht konfiguriert wurden. Die Passworteingabe wird ausgeblendet.

Verwende termcourse --version, um die installierte semantische Version anzuzeigen; dieselbe Version erscheint in der breiten Terminal-Kopfzeile.

Für eine benutzerlokale Installation, die kein sudo erfordert:

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

Jedes GitHub-Release bietet SHA-256-Prüfsummen und vorab gebaute Archive für Linux, macOS und Windows auf AMD64 und ARM64. Linux/macOS verwenden .tar.gz; Windows verwendet .zip. Vorab gebaute Releases erfordern kein Go.

Auf Windows den Installer herunterladen und inspizieren, dann ausführen, ohne die maschinenweite Ausführungspolitik zu ändern:

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

Standardmäßig wird in %LOCALAPPDATA%\Programs\termcourse\bin installiert und dieselbe Prüfsummen- und Versionsverifizierung durchgeführt. Die Installer können auch eine Release-Version mit --version oder -Version festlegen. Go 1.26.6 oder neuer ist nur erforderlich, wenn aus dem Quellcode installiert wird.

Um stattdessen eine lokale Executable aus einem Checkout zu erstellen:

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

Für wiederholte Verwendung die Anmeldeinformationen in einer lokalen .env ablegen oder die im README beschriebene host-spezifische credentials.yml verwenden.

Login mit Benutzername/Passwort (empfohlen)

Der Login mit Benutzername/Passwort aktiviert Echtzeit-Updates:

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

Fallback mit API-Schlüssel

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

Siehe das aktuelle README für Konfiguration, Themen, Steuerelemente, Bild-Backends und Fehlerbehebung.

Hinweise zur Authentifizierung

  • Der Login mit Benutzername/Passwort folgt dem CSRF- und Cookie-Flow von Discourse und aktiviert Echtzeit-MessageBus-Updates.
  • TOTP- und Backup-Code-MFA werden unterstützt.
  • Die Authentifizierung per API-Schlüssel behält die HTTP-Funktionalität bei, stellt aber keine Echtzeit-Browser-Session her.
  • Einige Seiten deaktivieren oder beschränken skriptbasierte Logins mit Benutzername/Passwort; API-Anmeldedaten sind der Fallback für diese Seiten.

Sicherheit

  • Termcourse schreibt abgefragte Anmeldedaten oder Session-Cookies nicht auf die Festplatte; Session-Cookies bleiben im Speicher.
  • Die Passworteingabe hält das Passwort aus der Shell-Verlaufshistorie heraus.
  • Persistente Anmeldedaten sind optional und bleiben unter der Kontrolle des Benutzers in Umgebungs- oder YAML-Dateien.
  • Diagnose-Logging ist optional, standardmäßig deaktiviert und protokolliert keine Anmeldedaten oder Antwortkörper.

Einschränkungen

  • Seiten, die Remote-Login-Flows verbieten, erfordern möglicherweise die Authentifizierung per API-Schlüssel.
  • Echtzeit-Updates erfordern die Cookie-Authentifizierung mit Benutzername/Passwort.
  • Die Qualität nativer Inline-Bilder hängt von der Terminal-Unterstützung ab; Kitty wird bevorzugt, mit Symbol-Rendering als Alternative.
  • Es lebt im Terminal. :slight_smile:

Credits

Teilweise inspiriert von Dumbcourse: alte browserfreundliche UI auf dummen/d-Pad/kleinen Bildschirmen. :clap:

27 „Gefällt mir“

Damit Sie sich schnell bei mehreren Websites anmelden können (natürlich jeweils eine Sitzung pro Tab), habe ich folgende Verbesserungen vorgenommen:

Verbesserungen bei termcourse-Authentifizierung und -Konfiguration

  • Der Standard-Anmeldepfad ist jetzt Benutzername/Passwort.
  • Sie müssen https:// nicht mehr angeben – dies ist optional.
  • Fehlende Anmeldefelder werden interaktiv abgefragt (z. B. Benutzername bekannt, Passwort fehlt).
  • Die CLI-Hilfe enthält die wichtigsten Umgebungsvariablen und Speicherorte der Debug-Protokolldateien.

Anmeldeinformationen und ENV-Verhalten

  • Unterstützt host-zugeordnete Anmeldeinformationsdatei mit Suchreihenfolge:
    1. TERMCOURSE_CREDENTIALS_FILE (falls gesetzt)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Authentifizierungs-Präzedenz:
    1. CLI-Flags
    2. Host-Anmeldeinformationen aus YAML
    3. Allgemeine DISCOURSE_* Umgebungsvariablen
    4. Interaktive Abfrage
  • Für die Authentifizierung: Fehlende Werte für Benutzername/Passwort werden abgefragt.
  • Für die API-Authentifizierung müssen sowohl der API-Benutzername als auch der Schlüssel zu nicht leeren Werten aufgelöst werden.

Debugging

  • HTTP/Auth-Debug: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • UI-Rendering-Debug: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Repository-Hygiene

  • credentials.example.yml und .env.example mit abgestimmten Beispielen hinzugefügt.
  • .gitignore-Einträge für lokale geheime Dateien hinzugefügt:
    • .env
    • credentials.yml
3 „Gefällt mir“

Das ist ziemlich Low-Fi, aber es funktioniert.

Sie müssen viu oder chafa installiert haben – was selbst schon ein Projekt sein kann :slight_smile:

Im High-Quality-Modus mit chafa oder mit viu ist das Windows Terminal dem MacOS Terminal überlegen, da es viel mehr Farben unterstützt (danke Microsoft!)

Versionshinweise: Bilddarstellung (im Terminal!)

Bilddarstellung

  • Inline-Vorschauen für Bilder mit Backend-Auswahl hinzugefügt:
    • Versucht zuerst chafa, dann viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: konservative Ausgabe für Terminal-Stabilität.
    • quality: detailliertere/farbige Symbol-Darstellung.
  • Steuerung der Vorschauhöhe hinzugefügt:
    • TERMCOURSE_IMAGE_LINES (Standard: 14)
    • Gilt für die Höhe der Vorschauzeilen; nützlich zur Anpassung der visuellen Dichte.
  • Verbessertes viu-Aspektverhalten:
    • Wechsel zu zeilenorientierter Darstellung (-h), um das Seitenverhältnis besser beizubehalten.
  • Steuerung für den Vorschauqualitätsfilter hinzugefügt:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 filtert verrauschte, nur aus Blöcken bestehende Vorschauen.
    • Auf 0 setzen, um immer die Ausgabe des Renderers anzuzeigen.
  • Sicherheitslimit für Bild-Downloads hinzugefügt:
    • TERMCOURSE_IMAGE_MAX_BYTES (Standard: 5242880)
    • Verhindert, dass das Herunterladen übergroßer Bilder die Leistung beeinträchtigt.
  • Unterstützung für Discourse upload://… Bild-Links hinzugefügt:
    • Wird automatisch zu /uploads/short-url/… aufgelöst.
  • Terminal-Bereinigung/Stabilität verbessert:
    • Behält gültige SGR-Farb-Codes bei, wo nötig.
    • Entfernt destabilisierende Steuer-/Grafiksequenzen.
    • Verhindert, dass ANSI-Escape-Fragmente als reiner Text angezeigt werden.

Eine Anmerkung: Ich habe eine Seite gefunden, die Benutzername/Passwort-Anmeldungen aus der Ferne blockiert. Dieser Client funktioniert in dieser Situation also nicht (es sei denn, Sie besitzen die Seite und können einen API-Schlüssel festlegen!) – Vorschläge sind willkommen, aber derzeit gibt es in diesen Fällen keine Unterstützung.

Ich bin mir nicht sicher, ob ich das in der Praxis verwenden werde, ich sehe keinen Nutzen für mich, aber ich habe es ausprobiert und es ist entzückend. Ich liebe es, mit einer Forum-Plattform der nächsten Generation von einer Bare-Metal-, primitiven Oberfläche aus interagieren zu können.

In gewisser Weise ist es sehr ästhetisch ansprechend.

1 „Gefällt mir“

Ja, ich denke, es könnte nützlich sein, wenn:

  • Sie auf einer Low-Fi-Plattform sind
  • Sie auf einem Raspberry Pi herumspielen (noch nicht getestet, nur zur Info)
  • von einem Server aus, um zu prüfen, ob Sie online sind … oder ob der Frontend-Code abstürzt! :smiley:
  • für eine Discourse-Seite, die sehr textbasiert ist …
  • … und als technische Spielerei :slight_smile:

Ich wollte es schon auf meinem Handy mit Terminus testen …

3 „Gefällt mir“

OK wahrscheinlich letztes Update für heute:

  • Die Benutzeroberfläche reagiert jetzt auf Fenstergrößenänderungen :tada:
  • Verbesserungen des Inhalts in den Anweisungen der oberen Leiste
  • Die Tasten 1 bis (1)0 öffnen das entsprechende Thema in der Themenliste

Denken Sie daran, git pull auszuführen, um Updates zu erhalten.

3 „Gefällt mir“

Mann, jetzt muss ich mit meiner ASCII-Kunst anfangen!!
¯\_(ツ)_/¯

3 „Gefällt mir“

Ich habe ein vollständig anpassbares Theming-System hinzugefügt, dies ist „fairground“:

… und dies ist „slate“:

Details in der README :graduation_cap:

5 „Gefällt mir“

ok hier geht’s los, ein paar saftige :tangerine: Updates:

  • Unterstützung für private Nachrichten hinzugefügt - zweimal auf f tippen :tada:
  • zusätzliche Spalten für Kategorie, Benutzer, Ansichten hinzugefügt, progressiv bei erweiterter Breite
  • Theming für vertikale Trennlinien angepasst
  • README aktualisiert

2 „Gefällt mir“

Ich habe dies gestern zusammengeführt:

  • Wenn Sie sich die Mühe machen, chafa oder viu zu installieren, werden Sie nun mit einer neuen Funktion belohnt: der Umschaltmöglichkeit „Ganzes Fenster“ für Beitragsbilder. Unter Windows ist dies besonders gut, da die Windows Terminal-App eine großzügige Farbtiefe unterstützt.

termcourse hat jetzt ein Pop-up für ungelesene PMs in der Statusleiste der Themenliste, und genau wie der Browser-Client sendet es gelesene Benachrichtigungen Beitrag für Beitrag zurück, während Sie den Cursor bewegen.

2 „Gefällt mir“

Ich habe Korrekturen für Themes unter macOS zusammengeführt

2 „Gefällt mir“

Schön… Läuft es auf einem Pip-Boy?

3 „Gefällt mir“

Fühlen Sie sich frei, das als PR einzureichen oder die Farb-Codes zu teilen, und ich werde sie zu den Beispiel-Themes in der yml hinzufügen :slight_smile:

2 „Gefällt mir“

Großartig! Zusammengeführt, danke!

2 „Gefällt mir“

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

Das Rendering war suuuuuuuper schlecht … also habe ich es behoben … die Benutzeroberfläche hat jetzt eine Diff-Darstellung, sodass sie viel schneller und flüssiger ist … sie malt nicht mehr den ganzen Bildschirm bei jeder Cursorbewegung.

Ich habe dies bisher nur unter Windows getestet, also meldet bitte alle Probleme zurück – aber es sollte langsamen Systemen erheblich helfen.

Ich habe auch einige Tests und GitHub CI hinzugefügt!

Hat jetzt ein Echtzeit-Benachrichtigungssystem, das auf MessageBus basiert, um Sie in der Statusleiste zu benachrichtigen, wenn die Themenliste neue Aktualisierungen hat (damit Sie g drücken können, um zu aktualisieren):

Werde wahrscheinlich als Nächstes an Themenlesezeichen arbeiten …

Das ist großartig!

Warum nicht dieselben Tastenkombinationen wie bei Discourse verwenden? Dann wäre die Erfahrung nahtloser :slight_smile:

1 „Gefällt mir“

Kein schlechter Gedanke … das ist definitiv wert, irgendwann einmal darauf zurückzukommen, um zu sehen, ob die Dinge sinnvoll näher zusammengeführt werden können :+1: … aber es gibt natürlich einige erhebliche Unterschiede im Medium, daher könnten einige Dinge unterschiedlich bleiben.

1 „Gefällt mir“