AI-Powered, Privacy-First HackerNews Digest
Stop drowning in links. Get the stories that matter to you, summarized and scored for relevance.
Features β’ Demo β’ Quick Start β’ Architecture β’ Documentation
- Tag-Based Interests β Select from curated categories (AI/ML, Web Dev, Security, etc.) or create custom tags
- Smart Scoring β Hybrid algorithm: 70% relevance to your interests + 30% HN community signals
- Disinterest Filtering β Actively exclude topics you don't want to see
- Concise Summaries β 2-3 sentence overview of each article
- Key Points β 3-5 actionable takeaways extracted from content
- Auto-Tagging β Technology tags identified from article content
- Batch Processing β Efficient LLM calls (5 articles per request) for cost optimization
- Zero Tracking β No analytics, no cookies, no behavior logging
- Local Storage Only β Your preferences never leave your browser
- No Account Required β Start using immediately
- Ephemeral Processing β Content processed in real-time, never stored
- SSE Streaming β Live pipeline progress updates as your digest generates
- Cancellable Requests β Abort long-running operations anytime
- Fun Facts β HN trivia while you wait
- Three Themes β HN Orange, Ocean Blue, Dark Mode
- Python 3.12+
- uv package manager
- Anthropic API key
# Clone the repository
git clone https://github.com/darth-dodo/hn-herald.git
cd hn-herald
# Install dependencies
make install
# Configure environment
cp .env.example .env
# Add your ANTHROPIC_API_KEY to .env
# Start the server
make devOpen http://localhost:8000 and generate your first digest.
graph TB
subgraph Browser["Browser"]
UI[Vanilla JS + Tailwind]
LS[(localStorage)]
end
subgraph FastAPI["FastAPI Backend"]
Routes[API Routes]
Pipeline[LangGraph Pipeline]
end
subgraph External["External Services"]
HN[HN Firebase API]
Claude[Anthropic Claude]
end
UI <-->|SSE Stream| Routes
UI --> LS
Routes --> Pipeline
Pipeline --> HN
Pipeline --> Claude
The digest generation uses a 7-stage LangGraph pipeline with parallel execution:
graph LR
A[fetch_hn] --> B[fetch_article]
B --> C[filter]
C --> D[summarize]
D --> E[score]
E --> F[rank]
F --> G[format]
style B fill:#e1f5fe
| Stage | Node | Description |
|---|---|---|
| 1 | fetch_hn |
Fetch stories from HN API (top/new/best/ask/show) |
| 2 | fetch_article |
Parallel content extraction via Send pattern |
| 3 | filter |
Remove articles without extractable content |
| 4 | summarize |
Claude 3.5 Haiku batch summarization |
| 5 | score |
Hybrid relevance + popularity scoring |
| 6 | rank |
Sort by final score, apply limits |
| 7 | format |
Assemble digest with statistics |
| Layer | Technology | Purpose |
|---|---|---|
| Backend | FastAPI | Async REST API with SSE streaming |
| AI Orchestration | LangGraph | Pipeline management with parallel execution |
| LLM | Claude 3.5 Haiku | Cost-efficient summarization |
| Frontend | Vanilla JS + Jinja2 | Lightweight, no build step |
| Styling | Tailwind CSS | Utility-first responsive design |
| Observability | LangSmith | Pipeline tracing and debugging |
| Document | Description |
|---|---|
| Architecture | System design, data models, API contracts |
| Product Requirements | Features, user stories, roadmap |
| Design Specs | Implementation details for each component |
| ADRs | Architecture Decision Records |
| ADR | Decision | Rationale |
|---|---|---|
| 001 | LangGraph for orchestration | Parallel execution, error handling, observability |
| 002 | SSE over HTMX | Real-time progress for 30-60s operations |
| 003 | Privacy-first architecture | localStorage only, no server-side user data |
| 004 | Tag-based scoring | Simple, fast, explainable personalization |
| 005 | Claude Haiku | 10x cost savings with batch processing |
make install # Install dependencies with uv
make dev # Start dev server (hot reload)
make test # Run test suite (469 tests)
make test-cov # Run with coverage report
make lint # Code style (ruff)
make typecheck # Type checking (mypy)
make check # All quality gateshn-herald/
βββ src/hn_herald/
β βββ api/ # FastAPI routes, rate limiting
β βββ graph/ # LangGraph pipeline (7 nodes)
β βββ models/ # Pydantic models
β βββ services/ # Business logic (HN client, loader, LLM, scoring)
β βββ templates/ # Jinja2 HTML templates
β βββ static/ # CSS, JS assets
βββ tests/ # 469 tests (unit, integration, API)
βββ docs/ # Architecture, design specs, ADRs
βββ Makefile # Development commands
| Metric | Value |
|---|---|
| Test Count | 469 |
| Coverage | 70%+ |
| Type Coverage | Strict (mypy) |
| Linting | ruff |
Contributions welcome! Please:
- Read the Architecture docs
- Check existing ADRs for context
- Ensure
make checkpasses - Include tests for new functionality
MIT License - see LICENSE for details.




