01 — The Problem
Eight hours of manual work, one product at a time
At Shoe Carnival, every product sample that arrives needs a full product description page before it goes live — a Customer Friendly Name, a 2-4 sentence description, feature bullets, and applicable feature tags. This work was done manually, one product at a time.
The process: photograph the label, photograph the product, transfer files, read the label, look up the style on the brand's site, open Claude.ai, upload photos, write a prompt, review the output, then copy-paste each field individually into the production system. Repeat for the next product.
Timed precisely: 3 minutes and 49 seconds per product. A batch of 139 samples would require 8.8 hours of uninterrupted, focused attention. Products with multiple colorways needed separate sessions even though their descriptions are identical.
02 — The Solution
A governed vision pipeline launched from a desktop shortcut
A local Python automation pipeline that processes a folder of iPhone photos and outputs a formatted Excel workbook with extracted label data, embedded product thumbnails, and complete AI-generated PDP copy for every style. Launches from a desktop shortcut — no terminal, no code, no configuration at run time.
01
Smart Photo PairingImages sorted by iOS timestamp. A detection layer reads each photo and swaps the order automatically if the label and product are reversed — handling the natural variation across multi-session shoots.
02
Label Extraction via Vision APIClaude reads each label photo and returns structured JSON: brand code (BGRP), brand name, style name, ecom style number, and ecom color number. Labels downsampled to 1536px before upload, keeping text legible while cutting payload by ~85%.
03
Governed PDP GenerationThe product photo and extracted label data are sent to Claude with the company SKILL.md as the governing system prompt. The model returns a Customer Friendly Name, product description, feature bullets, and applicable feature tags — consistent every run.
04
Style-Level DeduplicationResults grouped by ecom style number after processing. Multiple colorways under the same style collapse into one PDP row with all color numbers listed. 139 pairs became 117 unique descriptions automatically.
05
Excel Output with ThumbnailsTimestamped Excel workbook with all columns populated — Style Name, Ecom numbers, embedded product thumbnail, Customer Friendly Name, Description, Features, Applicable Features, and Status. Error rows highlighted for manual review.
03 — Before vs. After
The same output. The attention freed.
The runtime is comparable. The difference is where your attention goes during those 40 minutes.
Before — Manual
- 3m 49s per product — ~8.8 hours for 139 styles
- Full attention required throughout
- One product at a time, no parallelism
- Duplicate descriptions for every colorway
- No log, no audit trail, no error tracking
- Output quality varies session to session
After — Pipeline
- 40 minutes for 117 unique styles
- Zero attention required after clicking Run
- Full batch runs while you do something else
- Automatic colorway deduplication
- Timestamped log file for every run
- Governed output via SKILL.md — consistent every time
04 — Results
First full batch — May 13, 2026
278Images processed
139 label + product pairs
117Unique styles
22 colorways deduplicated
40m 13sRuntime
Fully unattended
3 rowsErrors flagged
Highlighted for review
76Auto-corrections
Reversed pairs swapped
19Style groups merged
2–4 colorways each
$4.59Total API cost
Claude Sonnet
~$0.03Per description
vs. $5–15 freelance
Spreadsheet output — first full batch
05 — In the Wild
The pipeline self-correcting in real time
Desktop app — Pair 139/139 complete, 117 unique styles output
Pair 3 from the first run — photo order was reversed. The pipeline detected it, swapped, and continued without stopping.
14:35:40 [INFO] OK: None / None / None
14:35:40 [WARNING] photo_a gave no label data — trying photo_b as label.
14:35:43 [INFO] OK: ADIDA / STEEL MTL BTL HANDLE / 187479_418929
14:35:43 [INFO] Swapped: 135112349 is the label, 135055172 is the product.
14:35:50 [INFO] Pair 3 -> OK
End-of-run deduplication summary:
[INFO] Style 191391: 4 colors merged into one row (430547, 430549, 430543, 430545)
[INFO] Style 191396: 3 colors merged into one row (430550, 430554, 430552)
[INFO] After deduplication: 117 unique style(s).
[INFO] Complete. 114/117 OK.
06 — Design Decisions
Why it works the way it does
Governed output via SKILL.md
Rather than prompting the model with free-form instructions, all PDP generation is governed by the company SKILL.md — a structured document encoding writing standards, formatting rules, and quality checks. It becomes the system prompt on every run. Output is consistent regardless of batch size or product category.
Image resizing before API upload
iPhone photos are ~4032×3024px and 3-4MB each. Sending full-resolution files was causing each pair to take over 2 minutes. Downsampling labels to 1536px and products to 1024px before upload reduced per-pair time to 15-25 seconds with no loss in output quality.
Smart label detection, not brittle ordering
The pipeline tries label extraction on the first photo. If it returns no style name and no ecom number, it swaps and retries. In the first full run, 76 of 139 pairs required this correction — a naive ordering assumption would have failed more than half the batch.
Built for a non-developer daily user
Custom tkinter GUI with a live log, pair-limit control for test runs, a Stop button, and a cost estimate before any API calls are made. Launches from a Windows desktop shortcut. No terminal, no command line needed after initial setup.
The real value is not time saved — it is attention freed. 45 minutes of repetitive focused work became a single button click and a result waiting when you come back.
07 — Stack
What it's built on
Python 3
Anthropic Claude Sonnet
httpx
openpyxl
Pillow
tkinter GUI
GitHub
iOS timestamp pairing
Windows VBS launcher
08 — What's Next
Version 2 is already scoped
Color language prohibition in PDP output so shared descriptions hold across all colorways
Strict mismatch detection — flag label/product conflicts rather than best-guess pairings
Windows Task Scheduler integration for fully unattended overnight runs
Completion notification via email or Teams when a batch finishes
Cross-reference against the Master Sample List to validate ecom numbers before output