scan-organizer
- Repo stars 49
- License Apache-2.0
- Author repo Insurance-Skills
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
uv run scan-organizer process
Dry run (classify without moving)
uv run scan-organizer process --dry-run
Process a single file
uv run scan-organizer process --file /path/to/scan.pdf
Force re-process all (including already processed)
uv run scan-organizer process --force
Check inbox status
uv run scan-organizer status
Undo a processed file (move back to inbox)
uv run scan-organizer undo <filename>
Reclassify a file
uv run scan-organizer reclass <filename>
Output Format
All commands output JSON to stdout. Progress messages go to stderr.
Process output
{"processed": 3, "skipped": 7, "errors": 0, "results": [{"file": "...", "category": "medical", "title": "...", "destination": "..."}]}
Status output
{"inbox_count": 10, "unprocessed": 3, "already_processed": 7, "categories": {"medical": 2, "financial": 3}}
Architecture
- Extract — Docling parses PDF structure and native text
- OCR — Pages with sparse text are rendered to PNG and sent to a vision model
- Classify — Merged text sent to a language model for categorization
- Organize — PDF moved to
<scans_dir>/<category>/,.md+.meta.jsonsidecars 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
statusfirst to see how many unprocessed scans are in the inbox - Use
--dry-runto preview classifications before moving files - The manifest tracks all moves for auditability
- If a classification is wrong, use
reclassto undo and re-process
- Fluxly category
- Other
- Author-declared agents
- No explicit declaration found; this is not inferred or tested compatibility
- Static check
- 94 / 100 · heuristic scan, not runtime safety proof
- Author / version / license
- @FDU-INS · Apache-2.0
- Fluxly token estimate
- Lean
- Fluxly setup estimate
- Plug-and-play
- External API key
- No requirement detected
- Detected OS requirements
- Unspecified
- Runtime requirements
- Unspecified
- Detected file/system behavior
-
- Read-only
- Detected network behavior
- Local-only
- Install commands
- None (reference only)
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
# Process output
{"processed": 3, "skipped": 7, "errors": 0, "results": [{"file": "...", "category": "medical", "title": "...", "destination": "..."}]} Process new scans
Process a single file
Force re-process all (including already processed)
Undo a processed file (move back to inbox)
# 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/
… Author text anchors workflow facts; Fluxly only indexes current sections, terms, files, and commands.
sections -> Categories → Commands → Process new scans → Dry run (classify without moving) → Process a single file → Force re-process all (including already processed)
terms -> Extract · OCR · Classify · Organize
files/cmd -> medical · financial · insurance · tax · legal · personal · household · other
body sha256 -> 8b457407f30f
Decide Fit First
Design Intent
How To Use It
Boundaries And Review