Show HN: 통합된 할 일/완료 추적 기능이 있는 네이티브 Hacker News 리더
요약
Hacker News의 콘텐츠를 소비하기 위한 네이티브 데스크톱 애플리케이션입니다. Rust와 egui로 구축되었으며, Hot Stories, Show HN 등 다양한 섹션을 탐색할 수 있습니다. 특히 읽은 기록 추적 및 스토리를 'todo'/'done'으로 표시하여 독서 진행 상황을 관리하는 기능이 특징입니다.
핵심 포인트
- Rust와 egui를 사용한 네이티브 데스크톱 앱
- Hacker News의 다양한 섹션(Hot, Show HN 등) 탐색 지원
- 읽은 기록 추적 및 'todo'/'done' 상태 표시 기능 제공
- 오프라인 기능을 위한 로컬 캐싱 및 다크/라이트 모드 지원
Hacker News Reader
깨끗하고 현대적인 인터페이스를 가진 Hacker News 브라우징용 네이티브 데스크톱 애플리케이션입니다. Rust와 egui로 구축되었습니다.
<p align="center"> <img src="logo/logo.png" alt="Hacker News Reader Logo" width="100" /> </p>스크린샷

기능
- 다양한 Hacker News 섹션의 인기 스토리 탐색:
- Hot Stories (메인 페이지)
- New Stories
- Show HN
- Ask HN
- Jobs
- Best Stories
- 자동 접기 및 조정 가능한 글꼴 크기를 가진 스레드형, Reddit과 유사한 형식으로 댓글 보기
- 기본 순서와 최신순 댓글 정렬 간 전환
- 제목, 도메인 또는 작성자로 스토리 검색 및 필터링
- 단일 클릭으로 소셜 미디어에 스토리 공유 또는 링크 복사
- 읽은 기록 자동 추적
- 하단까지 스크롤할 때 콘텐츠 자동 로드
- 점수에 따른 색상 코딩된 스토리
- 다크 모드 및 라이트 모드 지원
- 로컬 캐싱을 이용한 오프라인 기능
- 나중에 읽을 수 있도록 즐겨찾는 스토리
- 스토리를 'todo'와 'done'으로 표시하여 독서 진행 상황 추적
- 기사를 기본 브라우저에서 열기
설치
전제 조건
- Rust (1.70.0 이상)
- Cargo 패키지 관리자
소스 코드 빌드
- 저장소 클론:
git clone https://github.com/haojiang99/hacker_news_reader.git
cd hacker_news_reader
2. 애플리케이션 빌드:
```bash
cargo build --release
- 애플리케이션 실행:
cargo run --release
컴파일된 바이너리는 `target/release/hacker_news_reader`에서 사용할 수 있습니다.
## 사용법
### 탐색
## 사용법
### 탐색
* **탭(Tabs)**: 상단의 탭을 클릭하여 다른 Hacker News 섹션(Hot, New, Show, Ask, Jobs, Best) 간에 전환합니다.
* **스토리(Stories)**: 스토리 제목을 클릭하면 기본 웹 브라우저에서 해당 스토리를 열 수 있습니다.
* **댓글(Comments)**: 댓글 수를 클릭하면 특정 스토리에 대한 댓글을 볼 수 있습니다.
* **뒤로 가기(Back)**: 뒤로 가기 버튼을 사용하거나 Backspace 키를 눌러 댓글 보기 화면에서 스토리 목록으로 돌아갑니다.
* **새로고침(Refresh)**: 새로고침 버튼을 클릭하여 현재 섹션을 다시 로드합니다. Shift 키를 누른 상태로 클릭하면 캐시를 우회할 수 있습니다.
* **테마(Theme)**: 테마 버튼을 사용하여 다크 모드와 라이트 모드를 전환합니다.
* **즐겨찾기(Favorites)**: 햄버거 메뉴(☰)를 클릭하여 즐겨찾는 스토리를 표시하거나 숨길 수 있습니다.
### 키보드 단축키
* **화살표 키(Arrow Keys)**: 화살표 키를 사용하여 스토리 간을 탐색합니다.
* **스페이스/페이지 다운(Space / Page Down)**: 한 페이지 아래로 스크롤합니다.
* **페이지 업(Page Up)**: 한 페이지 위로 스크롤합니다.
* **홈(Home)**: 맨 위로 스크롤합니다.
* **엔드(End)**: 맨 아래로 스크롤합니다.
* **백스페이스(Backspace)**: 댓글 보기 화면에서 스토리 목록으로 돌아갑니다.
* **C**: 댓글을 볼 때, 모든 최상위 댓글을 접습니다(collapse).
* **Shift+C**: 댓글을 볼 때, 모든 댓글을 펼칩니다(expand).
* **+ (플러스)**: 댓글 보기 화면에서 글꼴 크기를 늘립니다.
* **- (마이너스)**: 댓글 보기 화면에서 글꼴 크기를 줄입니다.
* **Ctrl+S**: 사이드 패널(즐겨찾기)을 토글합니다.
* **Ctrl+F**: 스토리를 필터링하기 위한 검색 인터페이스를 표시합니다.
* **Ctrl+L**: 현재 기사의 링크를 클립보드에 복사합니다.
* **Ctrl+R**: 현재 보기를 새로고침하고 캐시를 우회합니다.
* **Escape**: 검색 인터페이스를 닫습니다.
* **1-6 숫자 키(Number Keys)**: 탭 간을 전환합니다 (1=Hot, 2=New, 3=Show, 4=Ask, 5=Jobs, 6=Best).
* **T**: 선택한 스토리를 할 일(Todo)로 표시합니다(나중에 읽기용).
* **D**: 선택한 스토리를 완료(Done)로 표시하거나 다시 미완료 상태로 토글합니다.
* **Ctrl+O**: 댓글을 볼 때, 브라우저에서 기사를 엽니다.
### 스토리 목록
스토리 목록은 섹션당 최대 150개의 스토리를 표시합니다(각 30개 스토리씩 총 5페이지). 각 스토리는 다음 정보를 보여줍니다:
* 스토리 번호
* 제목 (점수별로 색상 코딩됨)
* 출처 도메인
* 작성자
* 점수
* 게시 시간
* 댓글 수
### 댓글 보기
댓글 보기에서는 스레드 형식으로 댓글이 표시됩니다. 기능에는 다음이 포함됩니다:
- 처음 로드될 때 개요를 개선하기 위한 자동 접기(Auto-folding) 기능
- 접을 수 있는 댓글 스레드(Collapsible comment threads)
- 기본 순서와 최신순 간 토글 전환
- + 및 - 키 또는 버튼을 사용한 조정 가능한 글꼴 크기
- 작성자 강조 표시(Author highlighting)
- 중첩된 답글(Nested replies)
- 댓글 작성 시점 표시(Comment age display)
- 기사 공유 또는 링크 복사를 위한 공유 버튼(Share button)
- 원본 댓글에서 보존된 HTML 서식
### 즐겨찾기 (Favorites)
스토리를 즐겨찾기에 저장하려면:
1. 스토리에 있는 별 아이콘을 클릭합니다.
2. 왼쪽 상단에 있는 햄버거 메뉴(☰)를 클릭하여 즐겨찾기에 접속합니다.
즐겨찾기는 SQLite 데이터베이스에 로컬로 저장됩니다.
## 개발 (Development)
- 테스트 실행:
```bash
cargo test
-
빌드 없이 오류 확인:
cargo check -
코드 형식 지정(Format code):
cargo fmt -
린트 실행(Run lints):
cargo clippy
아키텍처 (Architecture)
이 애플리케이션은 세 가지 주요 구성 요소로 이루어진 간단한 아키텍처를 따릅니다:
-
UI 레이어 (
main.rs): 메인 애플리케이션 구조(HackerNewsReaderApp)를 포함하며 egui를 사용하여 렌더링을 처리합니다. -
데이터 모델 (
models.rs): 핵심 데이터 구조를 정의합니다:HackerNewsItem: 스토리/게시물을 나타냅니다.HackerNewsComment: 중첩된 자식(nested children)이 있는 댓글을 나타냅니다.
-
Hacker News 클라이언트 (
hn_client.rs): Hacker News 콘텐츠를 가져오기 위한 HTTP 요청을 처리하고 스크레이퍼 라이브러리(scraper library)를 사용하여 HTML 응답을 파싱합니다.
라이선스 (License)
MIT License - 자세한 내용은 LICENSE 파일을 참조하십시오.
감사의 글 (Acknowledgments)
- 콘텐츠: Hacker News
- UI 프레임워크: egui
- HTTP 요청: reqwest
- HTML 파싱: scraper
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Design Systems의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기