Skip to main content

An automated, LLM-powered research pipeline that discovers papers, summarises them, and delivers a daily tech digest to your phone.

Project description

Reportea

An automated, LLM-powered research pipeline that runs overnight — discovering papers, downloading PDFs, generating structured summaries, and producing a daily tech digest in newspaper style. Powered by the Claude CLI.


How It Works

python scr/timer.py
        │
        │  [waits until 01:00 AM]
        │
01:00   ├── Build keywords library
        │     base_papers/*.pdf → KeywordExtractor (Claude) → all_kws
        │
        ├── Init: process base papers
        │     DOIExtractor → base DOIs
        │     → get_pdf_links → download_pdf → summarize_and_save → summaries/*.md
        │     → clear pdf_cache/
        │
        ├── Init: first discovery round
        │     CitationExtractor (base_papers/) → citation DOIs (validated + cached)
        │     → fetch keywords per DOI (Claude web) → keywords_list.csv
        │     → compare_csv_with_library → top-10 related DOIs
        │     → delete keywords_list.csv
        │
        └── Loop  [repeats until 04:00]
              process_dois → summaries/*.md
              CitationExtractor (pdf_cache/) → citation DOIs
              → keywords_list.csv → compare → next top-10 DOIs
              → clear pdf_cache/ + delete keywords_list.csv
              repeat ──────────────────────────────────────────┘
        │
04:00   └── summarizer.py → summaries/{YYYY-MM-DD}report.md

Modules

File Role
scr/timer.py Orchestrator — waits for 01:00, runs init + loop, calls summarizer at 04:00
scr/extractor.py Three extraction classes: DOIExtractor, KeywordExtractor, CitationExtractor
scr/key_words_lib.py Builds keyword library; generates keywords_list.csv; compares against library to rank DOIs
scr/calling_llm_reader.py DOI → PDF search → download → text extraction → Claude summary → .md; also accepts a local PDF path directly via process_local_pdf()
scr/summarizer.py Reads all summary .md files, generates a newspaper-style daily tech digest; pushes it to your iPhone via Bark
scr/email_sender.py Bark push notification client — sends the daily report to your iPhone

Extractor Classes (scr/extractor.py)

Class What it does
DOIExtractor Scans base_papers/*.pdf, extracts each paper's own DOI from the first 3000 chars
KeywordExtractor Calls Claude (no web) on the full paper text; returns normalized keyword set
CitationExtractor Extracts cited DOIs from the references section, validates each via doi.org, caches to doi_cache/

Usage

Overnight mode (scheduled)

python scr/timer.py

Waits until 01:00 AM, then runs until 04:00 AM and generates the daily digest.

Immediate mode

python scr/timer.py --now        # start now, run for 1 hour
python scr/timer.py --now 2      # start now, run for 2 hours

Skips the 01:00 wait and runs for the specified number of hours, then generates the digest.

Local mode

python scr/timer.py --local

Skips all DOI lookup and citation discovery. Reads every PDF already in base_papers/ directly, generates a structured summary for each one, then produces the daily digest. Useful for quickly summarising a personal collection without running the full overnight pipeline.

Run individual modules manually

# Build keyword library + generate CSV + rank related papers
python scr/key_words_lib.py

# Summarize a single paper by DOI  (edit DOI = "..." at top of file)
python scr/calling_llm_reader.py

# Generate today's tech digest from existing summaries
python scr/summarizer.py

Setup

  1. Add your seed papers — place PDF files into base_papers/. The pipeline extracts their DOIs and keywords to build the library, and uses their citation lists as the starting point for discovery.

  2. Install dependencies:

    pip install requests pdfplumber
    
  3. iPhone notifications (optional) — install Bark from the App Store. Open it to get your device key, then set BARK_KEY in scr/email_sender.py. The daily report will be pushed automatically after each run and saved in Bark's history.

  4. Claude binary — requires the Claude Code VS Code extension. If you see FileNotFoundError:

    ls ~/.vscode/extensions/ | grep anthropic
    # Update CLAUDE_BIN in each scr/*.py with the current version number
    

Outputs

Path Content
summaries/{safe_doi}_summary.md Structured research summary per paper (Title, Authors, Abstract, Keywords, Methodology, Findings, etc.)
summaries/{YYYY-MM-DD}report.md Daily tech digest in newspaper format (≤1500 words)
doi_cache/*_cited_dois.json Validated citation DOIs per PDF — persists across runs to avoid re-validating
keywords_list.csv Transient — written and deleted each cycle; keywords (pipe-sep), doi
claude_responses.log Append-only log of every Claude interaction, separated by session

Daily Report Format

📰 Tech & Research Daily
### March 29, 2026

🔬 Today's Research Highlights
📌 Key Stories
💡 What This Means
🔭 On the Horizon

Known Issues

# Description Impact
1 Papers without author-defined keywords cannot be processed — KeywordExtractor returns an empty set, causing the paper to be skipped in library building and CSV comparison Base papers with no keyword section produce an empty library; citation papers with no keywords are excluded from ranking
2 Papers without a DOI cannot be processed — DOIExtractor relies on finding a DOI string in the PDF text; if none is present the paper yields no DOI and is skipped entirely Base papers without a DOI contribute no entry point into the discovery pipeline
3 DOIs in reference lists that span multiple lines are truncated at the line break during PDF text extraction — the partial DOI fails doi.org validation and is discarded Citation discovery rate can be very low for PDFs with wrapped reference formatting, reducing the number of related papers found per loop iteration

File Structure

Reportea/
├── base_papers/              # Seed PDFs (input — add your papers here)
├── pdf_cache/                # Downloaded PDFs (auto-cleared each cycle)
├── doi_cache/                # Validated citation DOIs per PDF (persistent cache)
├── summaries/                # Generated .md summaries + daily report
├── scr/
│   ├── timer.py              # Orchestrator
│   ├── extractor.py          # DOIExtractor, KeywordExtractor, CitationExtractor
│   ├── key_words_lib.py      # Keyword library + CSV generation + comparison
│   ├── calling_llm_reader.py # DOI → PDF → summary; or local PDF → summary
│   ├── summarizer.py         # Daily tech digest generator
│   └── email_sender.py       # Bark push notification client
├── keywords_list.csv         # Transient (created/deleted each cycle)
└── claude_responses.log      # Full interaction log

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

reportea-0.1.0.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

reportea-0.1.0-py3-none-any.whl (18.4 kB view details)

Uploaded Python 3

File details

Details for the file reportea-0.1.0.tar.gz.

File metadata

  • Download URL: reportea-0.1.0.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for reportea-0.1.0.tar.gz
Algorithm Hash digest
SHA256 6bc23e0202342af7a6f1e96ccee658f4abbd9018f6def06f912204f8b27e73d1
MD5 69159f8e50fd1201f5788919d187cfab
BLAKE2b-256 b474f915d33143913c012bfd5d00fc6731cc54371dce87c5bbec2ea3a58a9ab9

See more details on using hashes here.

File details

Details for the file reportea-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: reportea-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for reportea-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1660c50570fcd612ca9629d60001ed9ef791d0be9a5cb0557f13d911195a2a05
MD5 8f7ff49ae031cbf6f809176be0085631
BLAKE2b-256 c5990dc1bc6baedfb4fa329b6ddc2be5a46ce7f8cf9d666173bee37a3413d12f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page