CLI tool to rename academic papers using AI-extracted metadata
Project description
namingpaper
A CLI tool that renames academic PDF papers using AI-extracted metadata.
Before: 1-s2.0-S0304405X13000044-main.pdf
After: Fama, French, (1993, JFE), Common risk factors in the returns....pdf
Features
- Extracts metadata (authors, year, journal, title) from PDFs using AI
- Supports multiple AI providers: Claude, OpenAI, Gemini, and Ollama (local)
- Batch processing - rename entire directories at once
- Custom templates - flexible filename formatting
- Dry-run mode by default for safety
- Copy to output directory (keeps original file)
- Handles filename collisions (skip, increment, or overwrite)
- Common journal abbreviations (JFE, AER, QJE, etc.)
Installation
# Using uv (recommended)
uv tool install namingpaper
# With optional providers
uv tool install "namingpaper[openai]" # OpenAI support
uv tool install "namingpaper[gemini]" # Gemini support
# Update to latest version
uv tool upgrade namingpaper
# Or install from source
git clone https://github.com/DanTsai0903/namingpaper.git
cd namingpaper
uv sync
Quick Start
The default provider is Ollama (local, no API key needed). Install it from ollama.com, then pull the required models:
ollama pull deepseek-ocr
ollama pull llama3.1:8b
# Preview the rename (dry run)
namingpaper rename paper.pdf
# Actually rename the file
namingpaper rename paper.pdf --execute
# Batch rename all PDFs in a directory
namingpaper batch ~/Downloads/papers --execute
Using Cloud Providers
If you want to use Claude, OpenAI, or Gemini instead of local Ollama:
# Option 1: Set environment variable (temporary, current session only)
export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx
namingpaper rename paper.pdf -p claude
# Option 2: Add to shell profile (permanent)
# For zsh (macOS default):
echo 'export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx' >> ~/.zshrc
source ~/.zshrc
# For bash:
echo 'export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-api03-xxxxx' >> ~/.bashrc
source ~/.bashrc
# Option 3: Use config file (~/.namingpaper/config.toml)
mkdir -p ~/.namingpaper
cat > ~/.namingpaper/config.toml << EOF
ai_provider = "claude"
anthropic_api_key = "sk-ant-api03-xxxxx"
EOF
Usage
Rename Command
Rename a single PDF file.
namingpaper rename <pdf_path> [OPTIONS]
Options:
-x, --execute Actually rename (default is dry-run)
-y, --yes Skip confirmation prompt
-p, --provider TEXT AI provider (claude, openai, gemini, ollama)
-o, --output-dir DIR Copy to directory (keeps original)
-c, --collision STRATEGY Handle collisions: skip, increment, overwrite
Batch Command
Rename multiple PDF files in a directory.
namingpaper batch <directory> [OPTIONS]
Options:
-x, --execute Actually rename (default is dry-run)
-y, --yes Skip confirmation prompt
-r, --recursive Scan subdirectories
-f, --filter PATTERN Only process files matching pattern (e.g., '2023*')
-p, --provider TEXT AI provider (claude, openai, gemini, ollama)
-t, --template TEXT Filename template or preset name
-o, --output-dir DIR Copy to directory (keeps originals)
-c, --collision STRATEGY Handle collisions: skip, increment, overwrite
--parallel N Concurrent extractions (default: 1)
--json Output results as JSON
Templates Command
Show available filename templates.
namingpaper templates
Examples
Single File
# Dry run with Ollama (default)
namingpaper rename paper.pdf
# Execute rename
namingpaper rename paper.pdf --execute
# Copy to a different folder (keeps original)
namingpaper rename paper.pdf -o ~/Papers --execute
# Use Claude
namingpaper rename paper.pdf -p claude --execute
# Use OpenAI
namingpaper rename paper.pdf -p openai --execute
# Auto-increment on collision
namingpaper rename paper.pdf -c increment --execute
# Skip confirmation
namingpaper rename paper.pdf -xy
Batch Processing
# Preview all renames in a directory
namingpaper batch ~/Downloads/papers
# Execute batch rename
namingpaper batch ~/Downloads/papers --execute
# Recursive scan with subdirectories
namingpaper batch ~/Downloads/papers -r --execute
# Filter by pattern (only 2023 papers)
namingpaper batch ~/Downloads/papers -f "2023*" --execute
# Use compact template
namingpaper batch ~/Downloads/papers -t compact --execute
# Custom template
namingpaper batch ~/Downloads/papers -t "{year} - {authors} - {title}" --execute
# Copy to organized folder
namingpaper batch ~/Downloads -o ~/Papers/Organized --execute
# Parallel processing (faster)
namingpaper batch ~/Downloads/papers --parallel 4 --execute
# Output as JSON (for scripting)
namingpaper batch ~/Downloads/papers --json
View Configuration
namingpaper config --show
Filename Templates
Templates control how the output filename is formatted.
Preset Templates
| Name | Pattern | Example |
|---|---|---|
default |
{authors}, ({year}, {journal}), {title} |
Fama, French, (1993, JFE), Common risk....pdf |
compact |
{authors} ({year}) {title} |
Fama, French (1993) Common risk....pdf |
full |
{authors}, ({year}, {journal_full}), {title} |
Fama, French, (1993, Journal of Financial Economics), Common....pdf |
simple |
{authors}_{year}_{title} |
Fama, French_1993_Common risk....pdf |
Template Placeholders
| Placeholder | Description |
|---|---|
{authors} |
Author surnames (comma-separated, "et al" if >3) |
{year} |
Publication year |
{journal} |
Journal abbreviation (or full name if no abbrev) |
{journal_abbrev} |
Journal abbreviation only |
{journal_full} |
Full journal name |
{title} |
Paper title (truncated) |
Custom Templates
# Year-first format
namingpaper batch ~/papers -t "{year} - {authors} - {title}"
# Minimal format
namingpaper batch ~/papers -t "{authors} {year}"
# Full journal name
namingpaper batch ~/papers -t "{authors}, ({year}, {journal_full}), {title}"
Configuration
Environment Variables
| Variable | Description |
|---|---|
NAMINGPAPER_ANTHROPIC_API_KEY |
Anthropic API key (for Claude) |
NAMINGPAPER_OPENAI_API_KEY |
OpenAI API key |
NAMINGPAPER_GEMINI_API_KEY |
Google Gemini API key |
NAMINGPAPER_AI_PROVIDER |
Provider: ollama (default), claude, openai, gemini |
NAMINGPAPER_MODEL_NAME |
Override default model for provider |
NAMINGPAPER_OLLAMA_BASE_URL |
Ollama API URL (default: http://localhost:11434) |
NAMINGPAPER_MAX_AUTHORS |
Max authors before "et al" (default: 3) |
NAMINGPAPER_MAX_FILENAME_LENGTH |
Max filename length (default: 200) |
Config File
Create ~/.namingpaper/config.toml:
# Default provider (ollama requires no API key)
ai_provider = "ollama"
ollama_base_url = "http://localhost:11434"
# Or use cloud providers
# ai_provider = "claude"
# anthropic_api_key = "sk-ant-..."
# Formatting options
max_authors = 3
max_filename_length = 200
AI Providers
Ollama (Default)
Local LLM, no API key needed. Just have Ollama running.
# Pull the default models
ollama pull deepseek-ocr # OCR model (extracts text from images)
ollama pull llama3.1:8b # Text model (parses metadata)
# Use it (default provider)
namingpaper rename paper.pdf
Claude (included by default)
export NAMINGPAPER_ANTHROPIC_API_KEY=sk-ant-...
namingpaper rename paper.pdf -p claude
OpenAI
uv add "namingpaper[openai]"
export NAMINGPAPER_OPENAI_API_KEY=sk-...
namingpaper rename paper.pdf -p openai
Gemini
uv add "namingpaper[gemini]"
export NAMINGPAPER_GEMINI_API_KEY=...
namingpaper rename paper.pdf -p gemini
Development
# Clone and setup
git clone https://github.com/DanTsai0903/namingpaper.git
cd namingpaper
uv sync --extra dev
# Run tests
uv run pytest -v
# Run a specific test
uv run pytest tests/test_formatter.py -v
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file namingpaper-0.1.2.tar.gz.
File metadata
- Download URL: namingpaper-0.1.2.tar.gz
- Upload date:
- Size: 84.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f603f58e6e27b6b736ad5b447962d59a84068029a8346c857f87e902a46cbbeb
|
|
| MD5 |
acf82ce9a168b3079442cedd85160d08
|
|
| BLAKE2b-256 |
e1a9ada224bde3ece259bf8ea6c5453bd798075f118a99048cbc01cb72240dd2
|
File details
Details for the file namingpaper-0.1.2-py3-none-any.whl.
File metadata
- Download URL: namingpaper-0.1.2-py3-none-any.whl
- Upload date:
- Size: 26.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.12 {"installer":{"name":"uv","version":"0.9.12"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be16b625f6c8b0840e13334828a34f2e4d8aa7279166e56622c6c002b198b9af
|
|
| MD5 |
28fbd987d2ed361d34200fd4dd4c9e52
|
|
| BLAKE2b-256 |
1b7f71e7412baf14582f27183de1ad405e889d7149325558665818e438af26ae
|