Daily AI-curated newspaper PDF — fetches RSS, summarizes with Claude, compiles to PDF, delivers via Telegram
Daily AI-curated newspaper PDF delivered via Telegram. Fetches RSS feeds, summarizes top stories with Claude, compiles a LaTeX PDF in newspaper layout. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| LICENSE | ||
| papernews.py | ||
| README.md | ||
| requirements.txt | ||
Papernews
A self-hosted daily newspaper delivered to your Telegram. Fetches RSS feeds from your chosen news sources, summarizes the top stories with Claude AI, and compiles everything into a clean newspaper-style PDF — once a day, no feeds to scroll, no algorithm pulling you back.
Inspired by a Reddit post on r/RemarkableTablet.
How it works
- RSS feeds are fetched from configured news sources
- Claude picks and summarizes the 4–6 most newsworthy stories per section
- A LaTeX PDF is compiled in newspaper layout (two-column, masthead header)
- The PDF is delivered to your Telegram chat
- PDFs older than 5 days are automatically pruned
Requirements
- Docker + Docker Compose
- A Telegram bot token (create one via @BotFather)
- An Anthropic API key
Setup
1. Clone the repo
git clone https://github.com/yourusername/papernews.git
cd papernews
2. Configure
cp .env.example .env
Edit .env and fill in:
TELEGRAM_BOT_TOKEN— from @BotFatherTELEGRAM_CHAT_ID— your Telegram user ID (send/startto @userinfobot to find it)ANTHROPIC_API_KEY— from console.anthropic.comLOCATION— shown in the masthead (e.g.Kansas City, Missouri)
3. Build and run
docker compose up -d --build
The container will start and wait for the scheduled time. To test immediately:
docker compose run --rm -e RUN_NOW=true papernews
Configuration
All configuration is via environment variables in .env:
| Variable | Default | Description |
|---|---|---|
TELEGRAM_BOT_TOKEN |
required | Bot token from @BotFather |
TELEGRAM_CHAT_ID |
required | Your Telegram chat ID |
ANTHROPIC_API_KEY |
required | Anthropic API key |
LOCATION |
Your City |
City/region shown in the masthead |
SCHEDULE_HOUR |
7 |
Hour to deliver (24-hour) |
SCHEDULE_MINUTE |
0 |
Minute to deliver |
TIMEZONE |
America/Chicago |
Any IANA timezone name |
RETENTION_DAYS |
5 |
Days to keep PDFs before pruning |
RUN_NOW |
false |
Set true to run immediately on start |
Customizing news sources
Edit the SECTIONS list in papernews.py. Each section has a title and a list of RSS feed URLs:
SECTIONS = [
{
"title": "Local --- My City",
"feeds": [
("Local Paper", "https://localpaper.com/feed"),
("Local TV", "https://localtv.com/rss"),
],
},
{
"title": "National",
"feeds": [
("AP News", "https://feeds.apnews.com/rss/apf-topnews"),
("NPR", "https://feeds.npr.org/1001/rss.xml"),
],
},
# add as many sections as you like
]
The --- in section titles renders as an em dash in the PDF.
Checking logs
docker logs papernews
Notes
- The Docker image is ~700MB due to the LaTeX install. This is a one-time cost.
- PDFs are saved to
./output/and pruned automatically. - The bot token is only used to send outbound documents — the container does not poll for incoming messages.
License
MIT — see LICENSE.
