Hacker News Filter
Filter top 100 Hacker News posts based on user interests with AI-powered semantic matching.
When to Use This Skill
Use this skill when the user:
- •Wants to see filtered/personalized Hacker News content
- •Asks about interesting tech news or articles
- •Wants a curated HN digest
- •Mentions "hacker news", "HN", or tech news filtering
Workflow
Step 1: Get User Interests (Interactive)
Ask the user what topics they're interested in and what they want to exclude:
What topics interest you today? (Press Enter to use saved defaults) Examples: - Interested in: AI, systems programming, developer tools, startups - Exclude: crypto, blockchain, politics
If user presses Enter or says "use defaults", load from config file.
Step 2: Load/Save Config
Config file location: ~/.claude/hacknews-interest.json
Expected format:
{
"interests": ["AI", "machine learning", "systems programming", "developer tools", "open source"],
"blacklist": ["crypto", "blockchain", "NFT", "web3", "politics"]
}
If config doesn't exist, create it with user's input. If user provides interests interactively, optionally ask if they want to save as new defaults.
Step 3: Fetch Top 100 HN Stories
Use the Hacker News API:
# Fetch top story IDs
curl -s "https://hacker-news.firebaseio.com/v0/topstories.json" | jq '.[0:100]'
# Fetch individual story details
curl -s "https://hacker-news.firebaseio.com/v0/item/{id}.json"
For each story, extract:
- •
id: Story ID - •
title: Story title - •
url: Link to article (may be missing for Ask HN, Show HN) - •
score: Upvotes - •
descendants: Comment count - •
by: Author username
Step 4: Fetch Article Content (with Caching)
For each story with a URL:
- •Check cache first: Look in
~/.cache/hn-filter/articles/{story_id}.txt - •If not cached, fetch article:
- •Use
curlor web fetch to get the article content - •Extract main text content (strip HTML, ads, navigation)
- •Cache the result for future runs
- •Use
- •Fallback: If fetching fails (paywall, blocked, etc.), use title + URL domain for analysis
Cache structure:
~/.cache/hn-filter/
├── articles/
│ ├── 12345.txt
│ ├── 12346.txt
│ └── ...
└── comments/
├── 12345.json
└── ...
Step 5: Fetch and Summarize Comments
For each story:
- •Fetch top-level comments (limit to first 10-20 for performance)
- •For each comment, fetch its content
- •Look for substantive discussion points, not meta-commentary
# Story item includes 'kids' array of comment IDs
curl -s "https://hacker-news.firebaseio.com/v0/item/{comment_id}.json"
Step 6: Semantic Filtering
For each story, analyze:
- •Title - Quick keyword + semantic match
- •Article content - Deep semantic analysis of full text
- •URL domain - Source credibility/relevance (github.com, arxiv.org, etc.)
Filtering Logic:
- •First, check blacklist - if ANY blacklist term matches semantically, EXCLUDE the story
- •Then, check interests - if ANY interest matches semantically, INCLUDE the story
- •Blacklist takes priority over interests
Semantic matching means:
- •Not just exact keyword match
- •Understanding context (e.g., "LLM" matches "AI" interest)
- •Understanding negation (article criticizing crypto still matches crypto blacklist)
- •Understanding related concepts (e.g., "Rust compiler" matches "systems programming")
Step 7: Generate Output
For each matching story, output:
## [Story Title](URL) Score: X | Comments: Y **Why this matched:** [1-line AI explanation of why this matches user interests] **Key discussion points:** - [Balanced point 1 - present both perspectives if debated] - [Balanced point 2] - [Balanced point 3] ---
Discussion point guidelines:
- •Extract substantive insights, not meta-commentary ("great article!")
- •When there's debate, present BOTH sides neutrally
- •Focus on technical insights, lessons learned, contrarian views
- •Ignore flame wars, personal attacks, off-topic tangents
- •Limit to 3-5 key points per story
Output Example
# Hacker News Digest - Filtered for: AI, systems programming Excluding: crypto, blockchain Found 12 matching stories from top 100 --- ## [Anthropic releases Claude 3.5 with improved reasoning](https://example.com/article) Score: 542 | Comments: 231 **Why this matched:** Directly relevant to AI/ML interests - covers new LLM capabilities and benchmarks. **Key discussion points:** - Performance comparison shows 2x improvement on coding tasks vs previous version - Debate on benchmark validity: some argue real-world performance differs from synthetic tests - Several commenters report success using it for complex refactoring tasks - Discussion of API pricing changes and impact on indie developers --- ## [Building a Modern Text Editor in Rust](https://example.com/rust-editor) Score: 312 | Comments: 89 **Why this matched:** Combines systems programming (Rust) with developer tools (text editor). **Key discussion points:** - Author shares performance metrics: <5ms latency for 100k line files - Debate on using GPU rendering: proponents cite smoothness, critics cite battery drain - Several suggestions for async architecture patterns for plugin systems ---
Error Handling
- •No config file: Create default with empty interests/blacklist, ask user to configure
- •API rate limiting: Add delays between requests, inform user of progress
- •Article fetch failures: Log which articles couldn't be fetched, continue with title-only analysis
- •No matches found: Report this to user, suggest broadening interests or narrowing blacklist
Performance Tips
- •Fetch stories in parallel (batch of 10-20 at a time)
- •Cache aggressively - articles don't change
- •For repeat runs on same day, skip re-fetching if cache is <24 hours old
- •Show progress to user: "Fetching stories... 50/100"