ary/index_
ary/ projects/ paperblur

paperblur

pulls arxiv papers, generates abstracts with a local LLM, and emails them to me on a schedule.

// about

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.