Self-hosted academic publication tracker. Track Google Scholar profiles, discover new papers automatically, resolve open-access PDFs, and stay on top of the literature you care about.
Find a file
Justin Visser 0c5b199b76 docs: rebuild documentation from scratch with clean IA
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 09:39:27 +01:00
.github ci: adopt python-semantic-release, fix hardcoded version strings 2026-02-27 00:07:25 +01:00
alembic ci: add ruff linting and mypy type checking 2026-02-26 22:11:41 +01:00
app ci: adopt python-semantic-release, fix hardcoded version strings 2026-02-27 00:07:25 +01:00
docs docs: rebuild documentation from scratch with clean IA 2026-02-27 09:39:27 +01:00
frontend ci: add ruff linting and mypy type checking 2026-02-26 22:11:41 +01:00
scripts ci: add ruff linting and mypy type checking 2026-02-26 22:11:41 +01:00
tests fix: resolve remaining ruff lint and mypy type errors 2026-02-26 22:58:55 +01:00
.dockerignore streamlined 2026-02-17 21:59:41 +01:00
.env.example Intermediate commit 2026-02-26 16:09:57 +01:00
.gitignore chore: remove stale build artifacts, fix gitignore, use npm ci in CI 2026-02-26 21:24:59 +01:00
.python-version First product 2026-02-17 14:51:25 +01:00
agents.md temp commit 2026-02-26 12:54:19 +01:00
alembic.ini First product 2026-02-17 14:51:25 +01:00
docker-compose.dev.yml test 2026-02-17 20:24:12 +01:00
docker-compose.yml arden scrape safety telemetry and polish run state UX 2026-02-19 21:59:36 +01:00
Dockerfile test 2026-02-17 20:24:12 +01:00
MODERNIZATION_PLAN.md ci: add ruff linting and mypy type checking 2026-02-26 22:11:41 +01:00
pyproject.toml ci: adopt python-semantic-release, fix hardcoded version strings 2026-02-27 00:07:25 +01:00
README.md temp commit 2026-02-26 12:54:19 +01:00
uv.lock ci: add ruff linting and mypy type checking 2026-02-26 22:11:41 +01:00

scholarr

Self-hosted scholar tracking with a single app image (API + frontend). It automates publication discovery, parses Google Scholar, gathers external metadata via Crossref & arXiv APIs, and autonomously downloads Open Access PDFs.

CI Docker Pulls Docker Image

Key Features

  • Automated Ingestion: Background tasks regularly scrape author profiles to pull the latest publications.
  • Resilient Parsing: Custom DOM parsing logic falls back heavily across changes, backed by a dynamic 429 Too Many Requests backoff cycle.
  • Identifier Subsystem: Isolates DOIs, PMIDs, and arXiv IDs independently of PDFs mapping fallback external APIs sequentially.
  • Unpaywall PDF Search: Leverages a fully automated resolution queue to grab public PDFs via the Unpaywall API on identified entries.
  • Beautiful UI: Polished Vue 3 frontend that ships natively inside the same Docker container as the FastAPI backend.

Architecture Data Flow

graph LR
    HTML(Google Scholar) --> |Scraper| Ingestion
    Ingestion --> |Extract DOI| DB[(Database)]
    Ingestion -.-> |Fallback API Search| Crossref/arXiv
    Crossref/arXiv --> DB
    
    DB --> |Identified DOIs| PDFQueue(Unpaywall/PDF Workers)
    PDFQueue --> |Download & Store File| Storage

Quick Start

  1. Copy env template:
cp .env.example .env
  1. Set required values in .env:
  • POSTGRES_PASSWORD
  • SESSION_SECRET_KEY
  1. Start stack:
docker compose pull
docker compose up -d

Open:

  • App/API: http://localhost:8000
  • Health: http://localhost:8000/healthz

Documentation

Complete documentation is published at:

You can also read the developer/architecture breakdowns directly within the repository under:

  • docs/developer/architecture.md
  • docs/developer/ingestion.md
  • docs/developer/api-contract.md

Quality Gates

Backend:

docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm app uv run pytest tests/unit
docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm app uv run pytest -m integration

Frontend:

# ALL tests/builds MUST be run within the docker container. Do not run raw npm commands on the host.
# For automated agents checking outputs, redirect stdout/stderr to files (e.g. > /tmp/npm_typecheck.log 2>&1) 
# The temp files /tmp/npm_test.log, /tmp/npm_lint.log, /tmp/npm_typecheck.log, and /tmp/pytest_eval.log are pre-authorized for overwrite.

docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm frontend npm install
docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm frontend npm run typecheck
docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm frontend npm run test:run
docker compose -f docker-compose.yml -f docker-compose.dev.yml run --rm frontend npm run build

Contract and env checks:

python3 scripts/check_frontend_api_contract.py
python3 scripts/check_env_contract.py
./scripts/check_no_generated_artifacts.sh

thanks arxiv