GitHub - daneb/papers: Papers is a minimal AI/ML research reader

4 min read Original article ↗

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 Reading Feed

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

Archive — read papers with search and favourites Archive


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 -d

This 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:8b

Configuration

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

  1. 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.
  2. Deduplicate — Every paper is tracked by arXiv ID in SQLite. Already-processed papers are never re-fetched.
  3. 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.
  4. 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