A minimal, focused reader for the latest AI/ML research papers. Fetches from arXiv daily, summarises with a local LLM, and presents them in a calm reading UI designed for ~1 hour per week.
Stack: Astro · SQLite · Tailwind CSS · Ollama
Screenshots
Reading Feed — new papers with AI-generated summaries

Paper Detail — full abstract, AI summary, and direct links

Archive — read papers with search and favourites

Privacy & network calls
This app makes exactly two types of outbound network calls. There is no telemetry, no analytics, no accounts, and no API keys required.
| Destination | What & why | When |
|---|---|---|
export.arxiv.org/api/query |
Fetches paper metadata (titles, authors, abstracts) from arXiv's public, read-only API. No authentication. The same data you'd get visiting arxiv.org in a browser. | Only when you click Fetch Papers, or automatically every 12 hours |
localhost:11434 (Ollama) |
Sends each paper's title + abstract to your local Ollama instance for summarisation. Never leaves your machine. | During a fetch, once per unsummarised paper |
Everything else — the web UI, the SQLite database, read-state, favourites — is entirely local.
Quick start with Docker (recommended)
Docker is the easiest and safest way to run Papers. Everything is self-contained; nothing is installed on your system outside of Docker volumes.
Prerequisites
- Docker Desktop
- Ollama installed and running on your machine (
ollama serve) - ~5 GB free disk space (for the LLM model weights)
1. Clone and start
git clone https://github.com/YOUR_USERNAME/papers.git
cd papers
docker compose up -dThis starts the app container:
| Container | What it does |
|---|---|
papers |
The reader app — available at localhost:4321 |
2. Pull a model (first run only)
Downloads ~5 GB of model weights. Only needed once — they persist locally.
3. Open the app
Visit http://localhost:4321 and click Fetch Papers.
Papers are also fetched automatically whenever you visit and it has been more than 12 hours since the last fetch.
Running Ollama inside Docker too
If you'd rather have everything in Docker with no local Ollama install, replace docker-compose.yml with:
services: papers: build: . ports: - "4321:4321" volumes: - papers_data:/app/data environment: OLLAMA_BASE_URL: http://ollama:11434 OLLAMA_MODEL: ${OLLAMA_MODEL:-llama3.1:8b} depends_on: - ollama restart: unless-stopped ollama: image: ollama/ollama volumes: - ollama_models:/root/.ollama restart: unless-stopped volumes: papers_data: ollama_models:
Then pull a model into the container on first run:
docker compose exec ollama ollama pull llama3.1:8bConfiguration
Create a .env file next to docker-compose.yml to override defaults:
# Any model you have pulled locally (see: ollama list) OLLAMA_MODEL=llama3.1:8b # Point at a different Ollama instance OLLAMA_BASE_URL=http://localhost:11434
Useful Docker commands
# Start in background docker compose up -d # Stop docker compose down # View logs docker compose logs -f papers # Rebuild after a code change docker compose up -d --build # Open a shell inside the app container docker compose exec papers sh # Wipe all data and start fresh docker compose down -v
Running without Docker (local dev)
# Install dependencies npm install # Start dev server (hot-reload) npm run dev # Or build + run production npm run build npm start
Requires Ollama running locally (ollama serve).
macOS LaunchAgent (auto-start on login)
npm run setup # build + install LaunchAgent npm run uninstall # remove LaunchAgent
How it works
- Fetch — Queries arXiv's public API for recent papers across
cs.AI,cs.LG,cs.CL,cs.SE,cs.IR. If you've already seen everything recent, it automatically steps back in 3-day windows to find papers you haven't processed yet. - Deduplicate — Every paper is tracked by arXiv ID in SQLite. Already-processed papers are never re-fetched.
- Summarise — Each new paper's abstract is sent to your local Ollama instance with an engineering-focused prompt producing a 3–5 sentence summary ending with a "Why it matters" takeaway for practicing AI engineers. The top 30 most relevant papers (scored by keyword matching) are summarised per run.
- Read — Browse summaries in the feed, open a paper's detail view for the full abstract and download links, mark papers as read to move them to the archive, and star favourites.
Data & storage
| What | Where |
|---|---|
| SQLite database (papers, read status, favourites) | papers_data Docker volume → /app/data/papers.db |
| Ollama model weights (if running Ollama in Docker) | ollama_models Docker volume → /root/.ollama |
Both volumes survive docker compose down. Only docker compose down -v removes them.
Tech
- Astro (SSR via
@astrojs/node) — server-rendered pages and API routes - better-sqlite3 — synchronous SQLite, no separate DB process
- Tailwind CSS — utility-first styling
- Ollama — run any open-weight LLM locally; default is
llama3.1:8b - fast-xml-parser — parses arXiv Atom feed responses