OCR, classify, and organize scanned PDFs into category subfolders using AI vision and language models. Processes medical, financial, insurance, tax, legal, personal, and household documents.
Installs into .claude/skills of the current project.
Are you the author of Scan Organizer?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/fdu-ins-scan-organizer)
---
name: scan-organizer
description: OCR, classify, and organize scanned PDFs into category subfolders using AI vision and language models. Processes medical, financial, insurance, tax, legal, personal, and household documents.
metadata: {"openclaw":{"emoji":"π","requires":{"bins":["uv"]},"install":[{"id":"uv-sync","kind":"uv","label":"Install scan-organizer dependencies"}]}}
---
# Scan Organizer
Processes scanned PDFs β extracts text (Docling + vision OCR), classifies by category using an LLM, and organizes into subfolders with markdown and metadata sidecars. Works with any OpenAI-compatible API (Ollama, OpenAI, OpenRouter, etc.).
## Categories
`medical`, `financial`, `insurance`, `tax`, `legal`, `personal`, `household`, `other`
## Commands
Run from the scan-organizer project directory.
### Process new scans
```bash
uv run scan-organizer process
```
### Dry run (classify without moving)
```bash
uv run scan-organizer process --dry-run
```
### Process a single file
```bash
uv run scan-organizer process --file /path/to/scan.pdf
```
### Force re-process all (including already processed)
```bash
uv run scan-organizer process --force
```
### Check inbox status
```bash
uv run scan-organizer status
```
### Undo a processed file (move back to inbox)
```bash
uv run scan-organizer undo <filename>
```
### Reclassify a file
```bash
uv run scan-organizer reclass <filename>
```
## Output Format
All commands output JSON to stdout. Progress messages go to stderr.
### Process output
```json
{"processed": 3, "skipped": 7, "errors": 0, "results": [{"file": "...", "category": "medical", "title": "...", "destination": "..."}]}
```
### Status output
```json
{"inbox_count": 10, "unprocessed": 3, "already_processed": 7, "categories": {"medical": 2, "financial": 3}}
```
## Architecture
1. **Extract** β Docling parses PDF structure and native text
2. **OCR** β Pages with sparse text are rendered to PNG and sent to a vision model
3. **Classify** β Merged text sent to a language model for categorization
4. **Organize** β PDF moved to `<scans_dir>/<category>/`, `.md` + `.meta.json` sidecars written
## File Organization
```
<scans_dir>/
medical/
2025-12-20_lab-results_0003.pdf
2025-12-20_lab-results_0003.md
2025-12-20_lab-results_0003.meta.json
financial/
...
.manifest.json <- tracks all moves for undo
```
## Tips
- Run `status` first to see how many unprocessed scans are in the inbox
- Use `--dry-run` to preview classifications before moving files
- The manifest tracks all moves for auditability
- If a classification is wrong, use `reclass` to undo and re-process