> termcourse: leggi e pubblica su istanze Discourse da terminale

Questa è un’applicazione per terminale (TUI), solo un po’ di divertimento… e in questa fase è un po’ sperimentale!

:information_source: Panoramica Un’interfaccia a terminale per sfogliare e pubblicare su forum Discourse con elenchi di argomenti, viste complete degli argomenti, risposte, like, ricerca e un compositore integrato.
:hammer_and_wrench: Link al repository GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: Guida all’installazione README.md nel repository (sezione Quickstart)
:heart: Sponsorizzazione Si prega di considerare la possibilità di diventare uno sponsor continuativo del mio lavoro open source (Sponsor @merefield on GitHub Sponsors · GitHub) a un livello adatto alle risorse e alle esigenze tue o della tua organizzazione, per garantire che questo progetto riceva la manutenzione che merita e continui a funzionare per il tuo sito in futuro.

Stai apprezzando termcourse? Ti preghiamo di :star: su GitHub

Panoramica

termcourse è un client Discourse basato su terminale, ricostruito come un unico eseguibile Go. Può utilizzare una sessione cookie leggera in stile browser con nome utente/e-mail e password, inclusa la MFA con TOTP e codici di backup. L’autenticazione tramite chiave API è disponibile per i siti in cui il login interattivo non è appropriato.

L’interfaccia utilizza lo stack Charm attuale e funziona sia con la tastiera che con il mouse. La sua navigazione a cartelle, i filtri contestuali, i pannelli reattivi, i controlli tematici, il rendering Markdown e le immagini inline sono progettati per rendere la navigazione di un forum comoda senza uscire dal terminale.

Funzionalità

  • Sfoglia le liste degli argomenti Latest, Hot, New, Unread, Top e Private Message, con ciclaggio del periodo Top.
  • Naviga tra le cartelle persistenti Topics, Search, Notifications e Compose, con filtri di secondo livello contestuali.
  • Usa la tastiera in tutto l’applicazione, oppure fai clic su schede, righe degli argomenti, controlli nel piè di pagina e pulsanti evidenziati al passaggio del mouse.
  • Apri gli argomenti visibili con Invio o con i tasti numerici 10.
  • Leggi argomenti completi con caricamento pigro dei post, estratti compatti, post selezionati espansi e scorrimento reattivo.
  • Fai clic sulla barra di avanzamento di un argomento per saltare direttamente a quel punto nel flusso dei post.
  • Crea argomenti, scegli categorie, rispondi ad argomenti o singoli post, e metti like o toglie like ai post.
  • Cerca post e salta direttamente al post corrispondente nel contesto del suo argomento.
  • Sfoglia e filtra le notifiche, inclusi i badge per non lette e messaggi privati.
  • Componi contenuti multilinea con movimento del cursore, inserimento, a capo, supporto per incolla e convalida in tempo reale.
  • Renderizza Markdown GFM inclusi link, elenchi, citazioni, codice, elenchi di attività e tabelle.
  • Mostra immagini inline e a schermo intero di alta qualità con il protocollo grafico Kitty, con simboli chafa colorati o viu come alternative portatili.
  • Ricevi aggiornamenti in tempo reale delle liste degli argomenti, degli argomenti, delle notifiche e dei messaggi privati quando si utilizza una sessione cookie.
  • Usa credenziali per sito dall’ambiente o da credentials.yml, con prompt per i campi di accesso mancanti.
  • Scegli tra i temi default, slate, fairground, rust e hacker, aggiungi temi YAML e cambia tema mentre l’app è in esecuzione.
  • Usa output truecolor, a 256 colori o a 16 colori con rilevamento automatico delle capacità del terminale.
  • Esegui l’interfaccia in inglese, francese, tedesco o spagnolo.
  • Ridimensiona liberamente il terminale: layout, colori, liste degli argomenti e immagini Kitty rispondono allo spazio disponibile.
  • Vedi i tempi di重试 forniti dal server quando Discourse applica limiti di frequenza a un’azione, con diagnostica facoltativa HTTP, UI e immagini.

Installazione ed esecuzione

Su Linux o macOS, l’installer consigliato scarica la release precompilata per il sistema operativo e l’architettura correnti, ne verifica il checksum SHA-256 e la versione riportata, quindi la installa:

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

Termcourse chiede un nome utente e una password quando le credenziali non sono già state configurate. L’inserimento della password è nascosto.

Usa termcourse --version per mostrare la versione semantica installata; la stessa versione appare nell’intestazione larga del terminale.

Per un’installazione locale per l’utente che non richiede sudo:

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

Ogni GitHub Release fornisce checksum SHA-256 e archivi precompilati per Linux, macOS e Windows su AMD64 e ARM64. Linux/macOS usa .tar.gz; Windows usa .zip. Le release precompilate non richiedono Go.

Su Windows, scarica e ispeziona l’installer, quindi eseguilo senza modificare la policy di esecuzione di tutta la macchina:

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

Per impostazione predefinita viene installato in %LOCALAPPDATA%\Programs\termcourse\bin e esegue la stessa verifica di checksum e versione. Gli installer possono anche fissare una release con --version o -Version. Go 1.26.6 o superiore è richiesto solo quando si installa da sorgente.

Per costruire un eseguibile locale da un checkout invece:

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

Per un uso ripetuto, metti i dettagli di accesso in un file .env locale o usa il credentials.yml per host descritto nel README.

Login con nome utente/password (consigliato)

Il login con nome utente/password abilita gli aggiornamenti in tempo reale:

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

Fallback con chiave API

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

Consulta l’ultimo README per configurazione, temi, controlli, backend per immagini e risoluzione dei problemi.

Note sull’autenticazione

  • Il login con nome utente/password segue il flusso CSRF e cookie di Discourse e abilita gli aggiornamenti in tempo reale di MessageBus.
  • Sono supportate MFA con TOTP e codici di backup.
  • L’autenticazione tramite chiave API mantiene la funzionalità HTTP ma non stabilisce una sessione browser in tempo reale.
  • Alcuni siti disabilitano o limitano il login con nome utente/password scriptato; le credenziali API sono il fallback per quei siti.

Sicurezza

  • Termcourse non scrive su disco le credenziali richieste o i cookie di sessione; i cookie di sessione rimangono in memoria.
  • La richiesta della password mantiene la password fuori dalla cronologia del shell.
  • Le credenziali persistenti sono opzionali e rimangono sotto il controllo dell’utente in file di ambiente o YAML.
  • La registrazione diagnostica è opzionale, disabilitata per impostazione predefinita e non registra credenziali o corpi delle risposte.

Limitazioni

  • I siti che vietano i flussi di login remoti potrebbero richiedere l’autenticazione tramite chiave API.
  • Gli aggiornamenti in tempo reale richiedono l’autenticazione cookie con nome utente/password.
  • La qualità delle immagini inline native dipende dal supporto del terminale; Kitty è preferita, con rendering a simboli disponibile altrove.
  • Vive nel terminale. :slight_smile:

Crediti

Parzialmente ispirato a Dumbcourse: vecchia interfaccia amichevole per browser su schermi piccoli/d-pad. :clap:

27 Mi Piace

Così puoi accedere rapidamente a più siti (ovviamente una sessione alla volta per scheda) ho apportato i seguenti miglioramenti:

Miglioramenti all’autenticazione e alla configurazione di termcourse

  • Il percorso di accesso predefinito è ora nome utente/password.
  • Non è più necessario includere https:// - questo è facoltativo
  • I campi di accesso mancanti vengono richiesti in modo interattivo (ad esempio: nome utente noto, password mancante).
  • La guida della CLI include le variabili d’ambiente principali e le posizioni dei file di log di debug.

Credenziali e comportamento ENV

  • Supporta il file delle credenziali mappato all’host con ordine di ricerca:
    1. TERMCOURSE_CREDENTIALS_FILE (se impostato)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • Precedenza dell’autenticazione:
    1. Flag della CLI
    2. Credenziali host da YAML
    3. Variabili d’ambiente DISCOURSE_* generiche
    4. Richiesta interattiva
  • Per l’autenticazione: vengono richiesti i valori mancanti di nome utente/password per l’accesso.
  • Per l’autenticazione API, sia il nome utente API che la chiave devono risolversi in valori non vuoti.

Debug

  • Debug HTTP/autenticazione: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • Debug rendering UI: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

Igiene del repository

  • Aggiunti credentials.example.yml e .env.example con esempi allineati.
  • Aggiunte voci .gitignore per i file segreti locali:
    • .env
    • credentials.yml
3 Mi Piace

Questo è piuttosto rudimentale ma funziona.

Devi avere installato viu o chafa, e quello può essere un progetto a sé stante :slight_smile:

In modalità alta qualità su chafa o con viu, Windows Terminal è superiore al terminale MacOS perché supporta molti più colori (grazie Microsoft!)

Note di rilascio: Rendering di immagini (nel terminale!)

Rendering di immagini

  • Aggiunte anteprime di immagini post in linea con selezione del backend:
    • prova prima chafa automaticamente, poi viu.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: output conservativo per la stabilità del terminale.
    • quality: rendering di simboli con dettagli/colori più elevati.
  • Aggiunto controllo dell’altezza di anteprima:
    • TERMCOURSE_IMAGE_LINES (default: 14)
    • Si applica all’altezza delle righe di anteprima; utile per ottimizzare la densità visiva.
  • Migliorato il comportamento dell’aspetto di viu:
    • Passato al rendering mirato per riga (-h) per preservare meglio il rapporto d’aspetto.
  • Aggiunti controlli del filtro di qualità dell’anteprima:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1 filtra le anteprime rumorose composte solo da blocchi.
    • Impostato a 0 per mostrare sempre l’output del renderer.
  • Aggiunto limite di sicurezza per il download di immagini:
    • TERMCOURSE_IMAGE_MAX_BYTES (default: 5242880)
    • Impedisce che i download di immagini di dimensioni eccessive influiscano sulle prestazioni.
  • Aggiunto supporto per i link di immagini Discourse upload://…:
    • Risolve automaticamente in /uploads/short-url/…
  • Migliorata la sanificazione/stabilità del terminale:
    • Mantiene i codici colore SGR validi dove necessario.
    • Rimuove le sequenze di controllo/grafica destabilizzanti.
    • Impedisce che i frammenti di escape ANSI vengano visualizzati come testo semplice.

Nota: ho trovato un sito che blocca nome utente/password remoti, quindi questo client non funzionerà in quella situazione (a meno che non sia di tua proprietà e tu possa impostare una chiave API!) - suggerimenti benvenuti, ma attualmente nessun supporto in quelle istanze.

Non sono sicuro che lo userò nel mondo reale, non ne vedo l’utilità per me, ma l’ho provato ed è delizioso. Adoro poter interagire con una piattaforma di forum di nuova generazione da un’interfaccia primitiva e “bare-metal”.

In qualche modo, è molto esteticamente gradevole.

1 Mi Piace

Sì, penso che potrebbe essere utile quando:

  • sei su una piattaforma a bassa fedeltà
  • stai armeggiando con un Raspberry Pi (non ancora testato, per tua informazione)
  • da un server per controllare che tu sia attivo… o se il codice del front-end sta crashando! :smiley:
  • per un sito Discourse molto basato sul testo…
  • … e come curiosità tecnica :slight_smile:

Stavo pensando di testarlo sul mio telefono con Terminus…

3 Mi Piace

OK, probabilmente ultimo aggiornamento per oggi:

  • l’interfaccia ora è reattiva al ridimensionamento della finestra :tada:
  • miglioramenti al contenuto nelle istruzioni della barra superiore
  • i tasti da 1 a (1)0 ora aprono l’argomento corrispondente nell’elenco degli argomenti

Ricorda di eseguire git pull per ottenere gli aggiornamenti.

3 Mi Piace

Amico, ora devo mettermi al lavoro sulla mia opera d’arte ASCII!!
¯\_(ツ)_/¯

3 Mi Piace

Ho aggiunto un sistema di temi completamente personalizzabile, questo è “fairground” (fiera):

… e questo è “slate” (ardesia):

dettagli nel README :graduation_cap:

5 Mi Piace

ok, ecco a voi ragazzi, alcuni succosi :tangerine: aggiornamenti:

  • aggiungi supporto per i messaggi privati - tocca f due volte :tada:
  • aggiungi colonne aggiuntive per Categoria, Utenti, Visualizzazioni, progressivamente quando la larghezza è espansa
  • modifica il tema per i separatori verticali
  • README aggiornato

2 Mi Piace

Ho unito questo ieri:

  • Se ti prendi la briga di installare chafa o viu, ora sarai ricompensato con una nuova funzionalità: l’opzione “finestra intera” per le immagini dei post. Su Windows questo è particolarmente buono grazie alla generosa profondità di colore supportata nell’applicazione Windows Terminal.

termcourse ora ha un pop-up di stato PM non letto nella barra di stato dell’elenco degli argomenti e, proprio come il client del browser, invierà notifiche di lettura post per post man mano che si sposta il cursore

2 Mi Piace

Ho unito le correzioni per i temi su macOS

2 Mi Piace

Bello… Funziona su un Pip-Boy?

3 Mi Piace

sentiti libero di fare una PR a riguardo o di condividere i codici colore e li aggiungerò ai temi di esempio in yml :slight_smile:

2 Mi Piace

Adoro! Unito, grazie!

2 Mi Piace

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

Quindi il rendering faceva schifo… quindi l’ho sistemato… l’interfaccia utente ora ha il rendering delle differenze, quindi è molto più veloce e fluida… non dipinge più l’intero schermo a ogni movimento del cursore.

L’ho testato solo su Windows finora, quindi per favore segnalate eventuali problemi, ma dovrebbe aiutare significativamente i sistemi più lenti.

Ho anche aggiunto alcuni test e GitHub CI!

Ora dispone di un sistema di notifica in tempo reale basato su MessageBus per avvisarti nella barra di stato quando l’elenco degli argomenti ha nuovi aggiornamenti (in modo da poter premere g per aggiornare):

Probabilmente mi occuperò successivamente dei badge di lettura degli argomenti…

È fantastico!

Perché non usare le stesse scorciatoie da tastiera di Discourse? In modo che l’esperienza sia più fluida :slight_smile:

1 Mi Piace

Non è una cattiva idea… vale sicuramente la pena di dare un’occhiata a un certo punto per vedere se le cose possono essere avvicinate in modo sensato :+1: … ma ci sono ovviamente alcune differenze significative nei medium, quindi alcune cose potrebbero rimanere diverse.

1 Mi Piace