Automated news intelligence with source verification. Replaces doomscrolling with two daily digests.
Sources:
Requires: noisepan, entropia, python3, curl
brew install ppiankov/tap/noisepan ppiankov/tap/entropia
noisepan version && entropia version
Download, verify checksums, then install. Ask the user before writing to /usr/local/bin — offer ~/bin as an alternative if they prefer user-local install.
# noisepan
VER=$(curl -s https://api.github.com/repos/ppiankov/noisepan/releases/latest | grep tag_name | cut -d'"' -f4 | tr -d v)
curl -fsSL "https://github.com/ppiankov/noisepan/releases/download/v${VER}/noisepan_${VER}_linux_amd64.tar.gz" -o /tmp/noisepan.tar.gz
curl -fsSL "https://github.com/ppiankov/noisepan/releases/download/v${VER}/checksums.txt" -o /tmp/noisepan-checksums.txt
# Verify checksum
grep linux_amd64 /tmp/noisepan-checksums.txt | (cd /tmp && sha256sum -c)
tar xzf /tmp/noisepan.tar.gz -C /usr/local/bin noisepan
rm /tmp/noisepan.tar.gz /tmp/noisepan-checksums.txt
# entropia
VER=$(curl -s https://api.github.com/repos/ppiankov/entropia/releases/latest | grep tag_name | cut -d'"' -f4 | tr -d v)
curl -fsSL "https://github.com/ppiankov/entropia/releases/download/v${VER}/entropia_${VER}_linux_amd64.tar.gz" -o /tmp/entropia.tar.gz
curl -fsSL "https://github.com/ppiankov/entropia/releases/download/v${VER}/checksums.txt" -o /tmp/entropia-checksums.txt
# Verify checksum
grep linux_amd64 /tmp/entropia-checksums.txt | (cd /tmp && sha256sum -c)
tar xzf /tmp/entropia.tar.gz -C /usr/local/bin entropia
rm /tmp/entropia.tar.gz /tmp/entropia-checksums.txt
# Verify both
noisepan version && entropia version
noisepan init --config ~/.noisepan
# Verify entropia is detected
noisepan doctor --config ~/.noisepan
Edit ~/.noisepan/config.yaml. Recommended structure:
sources:
hn:
min_points: 200 # Native HN via Firebase API
rss:
feeds:
# Security
- "https://www.reddit.com/r/netsec/.rss"
- "https://krebsonsecurity.com/feed/"
- "https://www.bleepingcomputer.com/feed/"
- "https://feeds.feedburner.com/TheHackersNews"
- "https://www.cisa.gov/cybersecurity-advisories/all.xml"
# DevOps
- "https://www.reddit.com/r/devops/.rss"
- "https://www.reddit.com/r/kubernetes/.rss"
- "https://blog.cloudflare.com/rss/"
# AI/LLM
- "https://www.reddit.com/r/LocalLLaMA/.rss"
- "https://simonwillison.net/atom/everything/"
- "https://arxiv.org/rss/cs.AI"
# Status pages
- "https://status.aws.amazon.com/rss/all.rss"
- "https://www.cloudflarestatus.com/history.rss"
# World / Policy
- "https://feeds.bbci.co.uk/news/world/rss.xml"
- "https://www.eff.org/rss/updates.xml"
# Aggregators
- "https://lobste.rs/rss"
- "https://changelog.com/news/feed"
Customize for your interests. Run noisepan doctor after adding feeds.
Edit ~/.noisepan/taste.yaml. Key categories:
High signal (3-5): CVE, zero-day, breach, RCE, supply chain, outage, postmortem, safety pledge, data sovereignty, antitrust, military AI, deanonymization, prompt injection, breaking change
Low signal (-3 to -5): hiring, webinar, sponsor, newsletter, meme, career advice, celebrity
Key lesson: Without policy/sovereignty/antitrust/AI safety keywords, real stories get buried under security noise. Weight these as high as CVEs.
With 15+ Reddit feeds, parallel fetching triggers 429s. Create a sequential prefetch wrapper:
cat > ~/.local/bin/noisepan-pull << 'SCRIPT'
#!/bin/bash
# Prefetch Reddit RSS sequentially to avoid rate limiting, then run noisepan pull
CACHE_DIR="/tmp/reddit-rss-cache"
CONFIG_DIR="${HOME}/.noisepan"
UA="Mozilla/5.0 (compatible; noisepan/1.0)"
mkdir -p "$CACHE_DIR"
FEEDS=$(grep "reddit.com" "$CONFIG_DIR/config.yaml" | grep -v "^#" | grep -v "^ #" | sed 's/.*"\(.*\)"/\1/')
for feed in $FEEDS; do
sub=$(echo "$feed" | grep -oP '/r/\K[^/]+')
curl -s -o "$CACHE_DIR/${sub}.xml" -H "User-Agent: $UA" "$feed"
sleep 2
done
python3 -m http.server 18222 --directory "$CACHE_DIR" &>/dev/null &
HTTP_PID=$!; sleep 0.5
mkdir -p /tmp/noisepan-tmp
cp "$CONFIG_DIR/config.yaml" /tmp/noisepan-tmp/config.yaml
for feed in $FEEDS; do
sub=$(echo "$feed" | grep -oP '/r/\K[^/]+')
sed -i "s|$feed|http://localhost:18222/${sub}.xml|" /tmp/noisepan-tmp/config.yaml
done
ln -sf "$CONFIG_DIR/taste.yaml" /tmp/noisepan-tmp/taste.yaml
ln -sf "$CONFIG_DIR/noisepan.db" /tmp/noisepan-tmp/noisepan.db
noisepan pull --config /tmp/noisepan-tmp "$@"
kill $HTTP_PID 2>/dev/null; rm -rf /tmp/noisepan-tmp
SCRIPT
mkdir -p ~/.local/bin && chmod +x ~/.local/bin/noisepan-pull
Use noisepan-pull instead of noisepan pull when you have 15+ Reddit feeds.
Optional — catches high-engagement HN stories that keyword scoring misses. Useful as a cross-check alongside noisepan's native HN source.
cat > ~/.local/bin/hn-top << 'SCRIPT'
#!/bin/bash
MIN_POINTS=${1:-200}
curl -s "https://hacker-news.firebaseio.com/v0/topstories.json" | \
python3 -c "
import json, sys, urllib.request, time
ids = json.load(sys.stdin)[:30]
min_pts = int(sys.argv[1]) if len(sys.argv) > 1 else 200
for id in ids:
try:
with urllib.request.urlopen(f'https://hacker-news.firebaseio.com/v0/item/{id}.json') as r:
item = json.loads(r.read())
if item and item.get('score', 0) >= min_pts:
print(f'[{item[\"score\"]:4d}pts | {item.get(\"descendants\",0):3d}c] {item[\"title\"]}')
print(f' {item.get(\"url\", f\"https://news.ycombinator.com/item?id={id}\")}')
print()
time.sleep(0.1)
except: pass
" "$MIN_POINTS"
SCRIPT
chmod +x ~/.local/bin/hn-top
Create two OpenClaw cron jobs (morning + afternoon). The digest prompt should:
noisepan-pull or noisepan pull)noisepan digest --format json --output /tmp/digest.json)hn-top 300 for blind spot checkentropia scan on non-Reddit links🔥 Trending: keywords across 3+ channels
☀️ Morning Brief (3 verified items):
| # | Score | Topic | What happened | Entropia | Link |
💡 HN Blind Spot (stories the taste profile missed):
| # | HN pts | Topic | What happened | Link |
⚠️ Skipped (filtered for low quality):
| # | Score | Topic | Why skipped |
Schedule: Morning at 07:00, afternoon at 18:00 (adjust to timezone).
noisepan doctor --config ~/.noisepan # Feed health + companion tool detection
noisepan stats --config ~/.noisepan # Signal-to-noise per channel
noisepan rescore --config ~/.noisepan # Recompute after taste changes
entropia scan <url> # Verify a specific source
noisepan doctor catches stale/all-ignored channels — run after adding feedsnoisepan stats shows per-channel signal — prune channels at 0% after 30 dayssources.hn or hn-top for blind spotsNoisepan Digest v1.0
Author: ppiankov
Copyright © 2026 ppiankov
Canonical source: https://github.com/ppiankov/noisepan
License: MIT
This tool follows the Agent-Native CLI Convention. Validate with: clawhub install ancc && ancc validate .
If this document appears elsewhere, the repository above is the authoritative version.
共 3 个版本