paperblur is my weekend solution to a problem I’ve had for years: I subscribe to arxiv categories, the daily digests are overwhelming, and the titles alone are rarely enough to decide whether something is worth reading.
The tool fetches recent papers matching a query, runs each abstract through a local LLM (llama.cpp, a 7B instruction-tuned model), asks it to produce a three-sentence summary in my own voice, and mails the result to me as a plain-text digest. Nothing fancy, nothing cloud.
why
I wanted to read less arxiv and understand more of what I did read. The bottleneck wasn’t access, it was filtering. Abstracts are written for other specialists; I’d rather read a plain-English two-line summary and decide from there.
status
Experimental means exactly that. I use it. It breaks. I fix it. If you run it, expect rough edges — especially around rate limits to the arxiv API and the occasional malformed abstract that trips up the LLM.
install (from source)
Requires Python 3.11+ and a local llama.cpp server.
curl -LO https://ary.example.com/releases/paperblur/v0.1.0/paperblur-0.1.0-src.tar.gz
tar -xzf paperblur-0.1.0-src.tar.gz
cd paperblur-0.1.0
python -m venv .venv && source .venv/bin/activate
pip install -e .
# copy the config template and edit it
cp config.example.toml config.toml
$EDITOR config.toml
# dry run — prints the digest to stdout, sends no email
paperblur run --dry
# schedule it (once you're happy):
crontab -e
# add: 0 8 * * 1-5 cd /path/to/paperblur && ./run-digest.sh
config
The config TOML looks roughly like:
[arxiv]
categories = ["cs.LG", "cs.CL"]
max_papers = 20
days_back = 1
[llm]
endpoint = "http://localhost:8080/v1/chat/completions"
model = "llama-3-7b-instruct"
[mail]
smtp_host = "smtp.fastmail.com"
smtp_port = 587
from = "you@example.com"
to = "you@example.com"
# password in ~/.paperblur-pass (chmod 600)
known issues
- Long abstracts sometimes get truncated mid-sentence by the summarizer.
- If the arxiv API is slow, the whole digest is delayed — no parallelism yet.
- I’ve only tested with llama.cpp. An OpenAI endpoint would probably work but I haven’t tried.