Show HN: Papernews – self-hosted daily newspaper PDF for your reMarkable A developer released Papernews, a self-hosted tool that aggregates RSS feeds and Hacker News content into a single daily PDF designed for e-ink readers like the reMarkable. The script uses Anthropic's Claude to rewrite full article text into a consistent LaTeX typeset format with quiet typography and no ads or visual noise. The project requires Docker and an Anthropic API key, generating offline-readable PDFs that users can push to their devices manually or via cron jobs. Every news site looks different. Hacker News, MacRumors, Quanta, my favourite ML blog, my favourite math blog β€” each one its own layout, fonts, colors, ads. To read anything I had to wade through somebody's design choices first and focus past the visual noise. I much prefer reading the way a LaTeX paper or an old magazine looks: quiet typography, generous margins, no color, nothing competing for attention. papernews is the fix. A script pulls all those feeds, has Claude clean up, translate to English, and rewrite the article bodies β€” the full text , not just summaries β€” and renders the result into one consistently typeset LaTeX PDF. Every article is in the PDF; you read entirely offline, no clicking through, no opening tabs. A side benefit I didn't expect to like but very much do: one place to read the day's news instead of five tabs being refreshed all day. One or two issues per day, no more. Designed for an e-ink reader like the reMarkable, but it works just as well in any browser's PDF viewer. πŸ‘‰ See sample-2026-06-04.pdf for a real day's output.Hobby project; works. Things will move. Expect rough edges. You need: a machine that can run Docker your laptop, a NAS, a $5/mo VPS, anything , an Anthropic API key https://console.anthropic.com/settings/keys , and ~2 GB of disk for the image. 1 Pull git clone https://github.com/marcj/papernews cd papernews 2 Configure your key cp .env.example .env $EDITOR .env paste ANTHROPIC API KEY=sk-ant-... 3 Pick your sources $EDITOR sources.toml add/remove RSS/HN entries, set per-source limits 4 Optional Tweak the look $EDITOR papernews/template.tex.j2 5 Build + run docker compose up --build -d Open http://localhost:8000 First PDF builds on demand and is cached. Background ingest runs every 4h. Everything you'd normally want to change is in two files : β€” which feeds, how many items per feed, in what order. Two source kinds today: sources.toml kind = "hn" Hacker News, top-by-points via the Algolia API and kind = "rss" any Atom/RSS feed via feedparser .β€” the LaTeX template. Page size, fonts, colors, layout, what goes on the cover, everything. Edit, restart the container, refresh papernews/template.tex.j2 /digest.pdf . Optional but useful: + papernews/summarize.py β€” the Claude system prompts. Change papernews/rewrite.py MODEL to claude-sonnet-4-6 for fancier rewrites at ~10Γ— the cost; adjust SYSTEM to change the editorial voice e.g. disable the auto-translate-to-English rule .β€” what goes into the World news block and the Quote-of-the-day source. papernews/wiki.py A few different ways, no special script needed: Manual β€” open http://your-machine:8000/digest.pdf in a browser on your phone/laptop and upload it to your reMarkable from there drag-and- drop on my.remarkable.com , or the reMarkable mobile app, or the USB Web Interface at http://10.11.99.1 while connected by USB .β€” a third-party CLI that pushes files to your reMarkable cloud account. Pair once, then: rmapi Stick that two-liner in cron on the host and the device picks it up on next sync automatically. curl -s http://your-machine:8000/digest.pdf -o today.pdf rmapi put today.pdf /Papernews β€” a third-party email-to-reMarkable bridge Remailable https://github.com/remailable/remailable remailable.getneutrality.org https://remailable.getneutrality.org . You email the PDF as an attachment to your assigned address and it appears on the device. Useful if your papernews host can mail / mutt but can't reach the reMarkable directly. reMarkable has no first-party email-to-device; do not believe earlier versions of this README that implied otherwise. No native push is built-in because everyone's setup is different and you probably don't want me poking your reMarkable cloud account with your token. git clone https://github.com/yourname/papernews cd papernews cp .env.example .env paste your ANTHROPIC API KEY into .env get one at https://console.anthropic.com/settings/keys docker compose up --build Then visit http://localhost:8000 β€” landing page with a preview image and a link to /digest.pdf . The first PDF builds on demand, takes ~1–2 minutes the first time and is then cached until new content arrives. State lives in ./data/state.db bind-mounted from the host so it survives container restarts. A 100–200 page PDF with: Cover page : title + date + article count, quote of the day from Wikiquote, a "World news" block 5 tech headlines + 2 Western items from Wikipedia's Current Events portal, each compressed to a single sentence . Contents : every article grouped by source, with dot-leaders to its publication date. "Did you know…" trivia nuggets from Wikipedia's Main Page. The articles themselves , set in two-column Latin Modern with proper paragraph indents, hyphenation, microtypography. Math $x = y$ , $$\int f$$ , \ ...\ , \ ...\ is rendered as real LaTeX math. Code blocks fenced or inline come through in monospace.- All non-English source content heise, etc. is translated to English during the rewrite step. You can disable that in the prompt if you don't want it. sources.toml β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ gather β”‚ β”‚ wiki/ β”‚ β”‚ HN + β”‚ β”‚ news + β”‚ β”‚ RSS β”‚ β”‚ QOTD β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β–Ό β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚extract β”‚ β”‚ β”‚ traf- β”‚ β”‚ β”‚ ilatura β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β”‚ β–Ό β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚summarizeβ”‚ ─── Claude β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ rewrite β”‚ ─── Claude β”‚ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β–Ό SQLite store state.db in-memory β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ render β”‚ ── xelatex β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β–Ό archive/cache/