A personal academic literature collection for research in industrial-organizational
psychology, psychometrics, and applied statistics. The repository tracks the search
infrastructure built around the collection; the PDFs, .txt files, and other
copyrighted documents are excluded from version control (see .gitignore) to comply
with publisher terms of service.
| File | Purpose |
|---|---|
build_catalog.py |
Extracts metadata and full text from PDFs; writes search artifacts |
references_catalog.parquet |
Structured metadata catalog (2,253 papers, 292 subdirectories, 1990-2026) |
CLAUDE.md |
Claude Code configuration for this directory |
.gitignore |
Excludes PDFs, .txt, .docx, .ppt, and other copyrighted content |
PDFs, extracted .txt files, Word documents, and slide decks are gitignored. These files are available locally for personal research use under standard academic licensing terms; redistribution would violate publisher agreements.
# Python version is pinned via pyenv; direnv loads the venv automatically
pyenv install # installs version from .python-version
python3 -m venv .venv
source .venv/bin/activate
pip install pymupdf pyarrowWalks the references directory recursively, extracts metadata from each PDF using
pymupdf, and writes references_catalog.parquet for fast DuckDB queries.
python3 build_catalog.py [--force] [--subdir SUBDIR] [--verbose]
[--extract-text] [--text-only]
--force Re-extract all PDFs, ignoring cached entries
--subdir SUBDIR Process only a specific subdirectory (e.g. stat-methods/glmm)
--verbose Print per-file status
--extract-text Also write full-text .txt files alongside each PDF
--text-only Write .txt files only; skip catalog build
Extraction is incremental: files are skipped when the cached entry is newer than
the PDF. --force bypasses this.
The catalog supports a two-stage retrieval pattern.
Stage 1 — abstract search (DuckDB): fast, returns papers that foreground a concept in their abstract.
duckdb -c "
SELECT file_path, title, authors, year
FROM read_parquet('references_catalog.parquet')
WHERE abstract ILIKE '%random slope%'
AND subdirectory LIKE 'stat-methods%'
ORDER BY year DESC;
"Stage 2 — full-text search (ripgrep): catches papers that apply a method
without naming it in the abstract. Requires --extract-text to have been run.
rg -l "random slope" stat-methods/glmm/Abstract search alone misses roughly 20% of the corpus (papers with no extractable abstract). Full-text search provides 7-10x higher recall on method-specific terms in core research subdirectories.
This project is the data backend for the /litreview Claude Code skill defined in
datasci-iopsy/.dotfiles at
claude/skills/litreview/SKILL.md.
The skill provides a structured five-step retrieval workflow:
- Catalog query (DuckDB) — filters by subdirectory, title, and abstract keywords; targets 8-15 candidates
- Abstract triage (in context) — ranks candidates without reading any PDFs; selects 3-5 for deep read
- Full-text search (ripgrep) — optional; uses the extracted
.txtfiles to confirm method or term presence in the paper body when abstracts are insufficient - Deep read (Read tool) — reads only the selected 3-5 PDFs; hard limit per pass
- Synthesis — produces thematic synthesis across papers; never a serial summary list
To invoke it from any Claude Code session in this directory:
/litreview glmm
/litreview "power analysis longitudinal"
/litreview burnout-engagement
The skill checks for references_catalog.parquet at startup. If the catalog is
missing, it halts and prompts you to run python3 build_catalog.py first. Full-text
search (Step 3) requires the .txt files produced by --extract-text; the skill
detects their presence automatically and skips Step 3 if they are absent.
| Column | Type | Notes |
|---|---|---|
file_path |
string | Relative path from repo root |
subdirectory |
string | Immediate parent directory |
filename |
string | PDF filename |
title |
string | Extracted from metadata or page text |
authors |
string | Extracted from metadata or page text |
year |
int64 | Publication year |
abstract |
string | Up to 500 words |
page_count |
int64 | |
quality_score |
float64 | Fraction of title/authors/year/abstract present (0-1) |
pdf_warnings |
string | MuPDF warnings, if any |
extracted_at |
string | UTC ISO timestamp |
For interactive exploration of the catalog outside the terminal,
Parquet Explorer is a good option.
Claude Code users may also find it useful to invoke the /duckdb skill for
query-assisted analysis directly in the chat session.