> termcourse: 터미널에서 Discourse 인스턴스를 읽고 게시하기

이것은 터미널 앱(TUI)으로, 그저 재미로 만든 것이자 현재로서는 다소 실험적인 단계입니다!

:information_source: 요약 토픽 목록, 전체 토픽 보기, 답글, 좋아요, 검색 및 내장된 작성기를 갖춘 Discourse 포럼을 탐색하고 게시하기 위한 터미널 UI입니다.
:hammer_and_wrench: 저장소 링크 GitHub - merefield/termcourse: A terminal based client to access Discourse instances, supporting API keys, username/password (and with MFA token) · GitHub
:open_book: 설치 가이드 저장소의 README.md (Quickstart 섹션)
:heart: 스폰서십 이 프로젝트가 마땅히 받아야 할 유지보수를 받고 미래에도 여러분의 사이트에서 계속 작동할 수 있도록, 여러분의 자원과 필요에 맞는 수준으로 제 오픈소스 작업의 지속적 스폰서가 되어 주십시오 (Sponsor @merefield on GitHub Sponsors · GitHub).

termcourse를 즐기고 계신가요? GitHub에서 :star: 해주세요.

개요

termcourse는 단일 Go 실행 파일로 재구성된 터미널 기반 Discourse 클라이언트입니다. 사용자명/이메일과 비밀번호를 사용한 경량 브라우저 스타일 쿠키 세션을 사용할 수 있으며, TOTP 및 백업 코드 MFA를 포함합니다. 인터랙티브 로그인이 적합하지 않은 사이트에는 API 키 인증이 가능합니다.

인터페이스는 현재 Charm 스택을 사용하며 키보드와 마우스 모두로 작동합니다. 폴더 스타일 내비게이션, 컨텍스트 필터, 반응형 패널, 테마화된 컨트롤, 마크다운 렌더링 및 인라인 이미지는 터미널을 벗어나지 않고도 포럼을 편안하게 탐색할 수 있도록 설계되었습니다.

기능

  • 최신, 인기, 새 글, 안 읽음, 최고, 개인 메시지 토픽 목록을 탐색하며, 최고 기간을 순환 선택할 수 있습니다.
  • 영구적인 토픽, 검색, 알림, 작성 폴더를 탐색하며, 컨텍스트 기반 2차 필터를 사용할 수 있습니다.
  • 전체적으로 키보드를 사용하거나 탭, 토픽 행, 푸터 컨트롤 및 호버 하이라이트된 버튼을 클릭할 수 있습니다.
  • Enter 키 또는 숫자 키 1~0으로 표시된 토픽을 엽니다.
  • 지연 게시 로드, 컴팩트 발췌문, 확장된 선택 게시글 및 반응형 스크롤링을 통해 완전한 토픽을 읽습니다.
  • 토픽의 진행 트랙을 클릭하여 게시글 스트림의 해당 위치로 직접 이동합니다.
  • 토픽을 생성하고, 카테고리를 선택하며, 토픽이나 개별 게시글에 답글을 달고, 게시글에 좋아요를 누르거나 취소합니다.
  • 게시글을 검색하고 해당 토픽 컨텍스트 내에서 일치하는 게시글로 직접 이동합니다.
  • 안 읽음 및 개인 메시지 배지를 포함한 알림을 탐색하고 필터링합니다.
  • 커서 이동, 삽입, 줄바꿈, 붙여넣기 지원 및 실시간 검증을 사용하여 여러 줄의 내용을 작성합니다.
  • 링크, 목록, 인용, 코드, 작업 목록 및 테이블을 포함한 GFM 마크다운을 렌더링합니다.
  • Kitty 그래픽 프로토콜을 사용하여 고품질 인라인 및 전체 화면 이미지를 표시하며, 포터블 폴백으로 색상 chafa 심볼 또는 viu를 사용합니다.
  • 쿠키 세션을 사용할 때 실시간 토픽 목록, 토픽, 알림 및 개인 메시지 업데이트를 수신합니다.
  • 환경 변수 또는 credentials.yml에서 사이트별 자격 증명을 사용하며, 누락된 로그인 필드에 대해 프롬프트를 표시합니다.
  • default, slate, fairground, rust, hacker 테마에서 선택하고, YAML 테마를 추가하며, 앱 실행 중 테마를 순환 선택할 수 있습니다.
  • 터미널 기능 자동 감지를 통해 truecolor, 256색 또는 16색 출력을 사용합니다.
  • 인터페이스를 영어, 프랑스어, 독일어 또는 스페인어로 실행합니다.
  • 터미널을 자유롭게 리사이즈할 수 있습니다: 레이아웃, 색상, 토픽 목록 및 Kitty 이미지가 사용 가능한 공간에 반응합니다.
  • Discourse가 작업을 레이트 리밋할 때 서버가 제공하는 재시도 타이밍을 확인하며, 선택적 HTTP, UI 및 이미지 진단 기능을 제공합니다.

설치 및 실행

Linux 또는 macOS에서 권장되는 설치 프로그램은 현재 운영 체제와 아키텍처에 맞는 사전 구축된 릴리스를 다운로드하고, SHA-256 체크섬과 보고된 버전을 검증한 후 설치합니다:

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

Termcourse는 자격 증명이 아직 구성되지 않은 경우 사용자명과 비밀번호를 프롬프트로 요청합니다. 비밀번호 입력은 숨겨집니다.

termcourse --version을 사용하여 설치된 시맨틱 버전을 표시합니다. 동일한 버전은 넓은 터미널 마스트헤드에도 표시됩니다.

sudo가 필요 없는 사용자 로컬 설정의 경우:

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

GitHub 릴리스는 AMD64 및 ARM64에서 Linux, macOS, Windows용 SHA-256 체크섬과 사전 구축된 아카이브를 제공합니다. Linux/macOS는 .tar.gz를, Windows는 .zip을 사용합니다. 사전 구축된 릴리스에는 Go가 필요하지 않습니다.

Windows에서는 설치 프로그램을 다운로드하고 검사한 후, 기계 전체 실행 정책을 변경하지 않고 실행합니다:

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

기본적으로 %LOCALAPPDATA%\Programs\termcourse\bin에 설치되며 동일한 체크섬 및 버전 검증을 수행합니다. 설치 프로그램은 --version 또는 -Version을 사용하여 릴리스를 고정할 수도 있습니다. 소스에서 설치할 때만 Go 1.26.6 이상이 필요합니다.

대신 체크아웃에서 로컬 실행 파일을 빌드하려면:

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

반복 사용을 위해 로그인 정보를 로컬 .env에 넣거나 README에 설명된 호스트별 credentials.yml을 사용하십시오.

사용자명/비밀번호 로그인 (권장)

사용자명/비밀번호 로그인은 실시간 업데이트를 활성화합니다:

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

API 키 폴백

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

구성, 테마, 컨트롤, 이미지 백엔드 및 문제 해결에 대해서는 최신 README를 참조하십시오.

인증 참고 사항

  • 사용자명/비밀번호 로그인은 Discourse의 CSRF 및 쿠키 플로우를 따르며 실시간 MessageBus 업데이트를 활성화합니다.
  • TOTP 및 백업 코드 MFA를 지원합니다.
  • API 키 인증은 HTTP 기능을 유지하지만 실시간 브라우저 세션을 확립하지는 않습니다.
  • 일부 사이트는 스크립트 기반 사용자명/비밀번호 로그인을 비활성화하거나 제한합니다. 이러한 사이트의 폴백은 API 자격 증명입니다.

보안

  • Termcourse는 프롬프트로 입력된 자격 증명이나 세션 쿠키를 디스크에 기록하지 않으며, 세션 쿠키는 메모리에 유지됩니다.
  • 비밀번호 프롬프트는 비밀번호가 셸 히스토리에 남지 않도록 합니다.
  • 영구 자격 증명은 선택 사항이며, 환경 변수 또는 YAML 파일 내에서 사용자의 통제 하에 유지됩니다.
  • 진단 로깅은 옵트인 방식이며 기본값은 비활성화되어 있고, 자격 증명이나 응답 본문을 기록하지 않습니다.

제한 사항

  • 원격 로그인 플로우를 금지하는 사이트에서는 API 키 인증이 필요할 수 있습니다.
  • 실시간 업데이트에는 사용자명/비밀번호 쿠키 인증이 필요합니다.
  • 네이티브 인라인 이미지 품질은 터미널 지원에 따라 다르며, Kitty가 권장되고 다른 곳에서는 심볼 렌더링이 가능합니다.
  • 터미널 안에서 작동합니다. :slight_smile:

크레딧

Dumbcourse: old browser friendly UI at dumb/d-pad/small screens에서 부분적으로 영감을 받았습니다. :clap:

27개의 좋아요

여러 사이트에 빠르게 로그인할 수 있도록(물론 탭당 한 세션씩) 다음과 같은 개선 사항을 적용했습니다:

termcourse 인증 및 설정 개선

  • 사용자 이름/비밀번호가 이제 기본 로그인 경로가 되었습니다.
  • 더 이상 https://를 포함할 필요가 없습니다 - 선택 사항입니다.
  • 누락된 로그인 필드는 대화형으로 입력을 요청합니다 (예: 사용자 이름은 알고 있지만 비밀번호가 없는 경우).
  • CLI 도움말에 핵심 환경 변수 및 디버그 로그 파일 위치가 포함되었습니다.

자격 증명 및 ENV 동작

  • 조회 순서가 있는 호스트 매핑 자격 증명 파일을 지원합니다:
    1. TERMCOURSE_CREDENTIALS_FILE (설정된 경우)
    2. ./credentials.yml
    3. ~/.config/termcourse/credentials.yml
  • 인증 우선순위:
    1. CLI 플래그
    2. YAML에서 가져온 호스트 자격 증명
    3. 일반 DISCOURSE_* 환경 변수
    4. 대화형 프롬프트
  • 인증: 로그인 시, 누락된 사용자 이름/비밀번호 값에 대해 입력을 요청합니다.
  • API 인증의 경우, API 사용자 이름과 키 모두 비어 있지 않은 값으로 해석되어야 합니다.

디버깅

  • HTTP/인증 디버깅: TERMCOURSE_HTTP_DEBUG=1 → /tmp/termcourse_http_debug.txt
  • UI 렌더링 디버깅: TERMCOURSE_DEBUG=1 → /tmp/termcourse_debug.txt

저장소 위생 관리

  • 정렬된 예제가 포함된 credentials.example.yml과 .env.example을 추가했습니다.
  • 로컬 시크릿 파일용 .gitignore 항목을 추가했습니다:
    • .env
    • credentials.yml
3개의 좋아요

비록 저화질이지만 작동합니다.

viu 또는 chafa가 설치되어 있어야 합니다 - 이 과정 자체가 하나의 프로젝트가 될 수도 있죠 :slight_smile:

chafa의 고품질 모드 또는 viu를 사용할 경우, Windows 터미널은 더 많은 색상을 지원하기 때문에 MacOS 터미널보다 우월합니다 (마이크로소프트 감사합니다!)

릴리스 노트: 이미지 렌더링 (터미널에서!)

이미지 렌더링

  • 백엔드 선택이 포함된 인라인 게시글 이미지 미리보기 추가:
    • auto는 chafa를 먼저 시도한 뒤 viu를 사용합니다.
    • TERMCOURSE_CHAFA_MODE=stable|quality
    • stable: 터미널 안정성을 위한 보수적인 출력.
    • quality: 더 높은 해상도/색상 심볼 렌더링.
  • 미리보기 높이 제어 추가:
    • TERMCOURSE_IMAGE_LINES (기본값: 14)
    • 미리보기 줄 높이에 적용되며, 시각적 밀도를 조정하는 데 유용합니다.
  • viu의 종횡비 동작 개선:
    • 종횡비를 더 잘 유지하기 위해 줄 대상 렌더링(-h)으로 전환.
  • 미리보기 품질 필터 제어 추가:
    • TERMCOURSE_IMAGE_QUALITY_FILTER=1은 노이즈가 있는 블록 전용 미리보기를 필터링합니다.
    • 렌더러 출력을 항상 표시하려면 0으로 설정하세요.
  • 이미지 다운로드 안전 한계 추가:
    • TERMCOURSE_IMAGE_MAX_BYTES (기본값: 5242880)
    • 과도하게 큰 이미지 다운로드가 성능에 영향을 미치는 것을 방지합니다.
  • Discourse upload://… 이미지 링크 지원 추가:
    • 자동으로 /uploads/short-url/…으로 해석됩니다.
  • 터미널 정제/안정성 개선:
    • 필요한 곳에 유효한 SGR 색상 코드를 유지합니다.
    • 안정성을 해치는 제어/그래픽 시퀀스를 제거합니다.
    • ANSI 이스케이프 조각이 원시 텍스트로 표시되는 것을 방지합니다.

참고: 원격 사용자 이름/비밀번호를 차단하는 사이트 하나를 발견했습니다. 이 경우 해당 클라이언트는 작동하지 않습니다(사이트 소유자로서 API 키를 설정할 수 있는 경우를 제외하고). 제안은 환영하지만, 현재는 이러한 상황에 대한 지원이 없습니다.

실제 세계에서 이걸 쓸지 확신은 없어요. 제게 쓸모가 뭔지 잘 모르겠거든요. 그래도 직접 써봤는데 정말 마음에 들어요. 맨메탈의 원시적인 인터페이스에서 차세대 포럼 플랫폼을 조작할 수 있다는 점이 정말 좋아요.

어떤 면에서는 정말 아름답다고 느껴지기도 해요.

1개의 좋아요

감사합니다!

네, 다음 같은 상황에서 도움이 될 것 같습니다:

  • 저사양(low-fi) 플랫폼을 사용 중일 때
  • 라즈베리 파이에서 실험할 때 (참고로 아직 테스트는 안 해봤습니다)
  • 서버에서 시스템이 정상적으로 실행 중인지 확인할 때 …
  • … 또는 프론트엔드 코드가 크래시 날 때! :smiley:
  • 텍스트 위주의 Discourse 사이트에서 …
  • … 그리고 기술적 호기심으로 :nerd_face:

내 폰에서 Terminus로 테스트해보려던 참이었습니다 …

3개의 좋아요

오늘 마지막 업데이트일 것 같습니다:

  • 인터페이스가 이제 창 크기 변경에 반응합니다 :tada:
  • 상단 바 설명의 콘텐츠 개선
  • 1부터 (1)0까지의 키를 누르면 토픽 목록에서 해당 번호의 토픽이 열립니다

업데이트를 받으려면 git pull을 실행하세요.

3개의 좋아요

야, 이제 내 ASCII 아트를 작업해야 하는데!!
¯(ツ)

3개의 좋아요

완전히 커스터마이즈 가능한 테마 시스템을 추가했습니다. 이것이 "fairground"입니다:

… 그리고 이것이 "slate"입니다:

… 그리고 이것이 "rust"입니다:

상세 내용은 README를 참고하세요 :graduation_cap:

5개의 좋아요

자, 시작합니다 여러분, 꽤 흥미로운 :tangerine: 업데이트 소식입니다:

  • 개인 메시지 지원 추가 - f 키를 두 번 누르면 됩니다 :tada: (현재는 목록 보기, 내용 열람, 답장 기능만 지원되며 새 PM 작성 기능은 없음)
  • 카테고리, 사용자, 조회수 추가 열을 폭이 넓어질 때 점진적으로 표시하도록 변경
  • 세로 구분선 테마 조정
  • README 업데이트

2개의 좋아요

어제 이 내용을 병합했습니다:

  • chafa 또는 viu를 설치하는 수고를 들인다면, 이제 새로운 기능으로 보답합니다: 게시물 이미지에 대한 “전체 창” 토글 기능입니다. Windows의 경우 Windows Terminal 앱에서 지원되는 풍부한 색상 깊이 때문에 특히 좋습니다.

termcourse에는 이제 토픽 목록 상태 표시줄에 읽지 않은 개인 메시지 상태 팝업이 표시되며, 브라우저 클라이언트와 마찬가지로 커서를 이동할 때마다 읽음 알림을 게시물별로 순차적으로 게시합니다.

2개의 좋아요

macOS의 테마 관련 수정 사항을 병합했습니다.

2개의 좋아요

좋네요… 피프보이에서 구동되나요?

3개의 좋아요

PR을 올리거나 색상 코드를 공유해 주세요. 예제 테마 yml에 추가하겠습니다. :slight_smile:

2개의 좋아요

좋아요! 병합했습니다. 감사합니다!

2개의 좋아요

렌더링이 별로 좋지 않아서 … 고쳤습니다 … 이제 UI에 "diff 렌더링"이 추가되어 훨씬 빠르고 부드러워졌습니다 … 더 이상 커서 이동 시 전체 화면을 다시 그리지 않습니다. :sweat_smile:

아직 Windows에서만 테스트해 보았으니 문제가 있으면 피드백을 주세요 - 하지만 느린 시스템에는 상당한 도움이 될 것입니다.

또한 몇 가지 테스트와 GitHub CI도 추가했습니다! (minitest를 사용하므로 매우 빠릅니다)

이제 MessageBus를 기반으로 한 실시간 알림 시스템을 추가하여, 토픽 목록에 새로운 업데이트가 있을 때 상태 막대에서 알려줍니다(이렇게 하면 g 키를 눌러 새로고침할 수 있습니다):

다음으로 읽지 않은 토픽 배지 기능을 작업할 예정입니다 …

정말 좋습니다!

Discourse와 동일한 키보드 단축키를 사용하는 건 어떨까요? 그러면 경험이 더 매끄러워질 거예요 :slight_smile:

1개의 좋아요

나쁜 아이디어는 아니네요 … 어떤 시점에서 한 번 시도해볼 가치가 있습니다. 합리적으로 더 가깝게 가져갈 수 있는지 확인해볼 수 있으니까요 :+1: … 물론 매체에 따라 상당한 차이가 있으니, 일부는 여전히 다르게 남을 수도 있겠네요.

1개의 좋아요