KJP AI Description Tool — Detailed Plan
Client: Kurt Johnson Photography Date: 2026-02-11 Related: KJP Website Updates Working Doc (Item 7)
The Problem
Kurt Johnson Photography has 8,372 published photography posts. Of those: - 6,124 (73%) have no description — just a photo and a numeric title like "2566" - 3,416 (41%) are missing a color classification - 4,630 (55%) are missing a region classification
Tags and type are well-covered (99%+), so the real gaps are descriptions, color, and region.
These descriptions matter for SEO, for clients browsing the catalog, and for search — a photo with no description is invisible to keyword search.
The Solution
A custom web application that uses AI vision to analyze each photograph and generate: 1. A 2-3 sentence description 2. A color classification (from KJP's existing color categories) 3. A region classification (where determinable)
The key feature: The system learns from client feedback. KJP reviews generated descriptions, marks them good or bad, and the AI gets better with each round.
Why Custom (Not a Plugin)
KJP's images are stored as flat files via WP All Import (/wp-content/uploads/wpallimport/files/), not in the WordPress Media Library. Off-the-shelf AI plugins (ClassifAI, AI Engine) hook into the Media Library — they literally can't see KJP's images.
Beyond that: - 6,000+ images can't be batch-processed through WP admin without timeouts - KJP needs descriptions that match their voice, not generic alt text - Taxonomy terms need to map to their exact existing categories - The QA/review workflow doesn't exist in any plugin
How It Works — The Client Experience
What KJP Sees
A web dashboard (something like kjp-descriptions.vercel.app) where they can:
- See progress — how many images processed, how many reviewed, approval rate
- Review descriptions — image on one side, AI-generated description on the other
- Approve or reject — one click to approve, or flag what's wrong
- Watch the system improve — each round of feedback makes the next batch better
The Review Screen
For each image, the client sees:
┌─────────────────────────────────────────────────────────┐
│ │
│ ┌──────────────────┐ Generated Description: │
│ │ │ │
│ │ [ PHOTO ] │ "Delicate purple coneflowers │
│ │ │ reach toward a soft summer sky, │
│ │ │ their petals catching the warm │
│ │ │ afternoon light." │
│ │ │ │
│ └──────────────────┘ Color: Purple │
│ Region: Midwest │
│ │
│ [ ✓ Approve ] [ ✗ Reject ] │
│ │
└─────────────────────────────────────────────────────────┘
If they approve: Done. One click. Move to the next image.
If they reject: A panel opens asking what's wrong:
- Too generic / vague
- Too flowery / over-written
- Too clinical / dry
- Missed the main subject
- Inaccurate details
- Wrong color
- Wrong region
- Too long / too short
Plus an optional free-text box: "What would be better?"
If it's close but not perfect: They can edit the description directly, then approve. The system saves both versions — the AI's attempt and the client's corrected version — and uses that to improve future descriptions.
How the System Learns
This is the part that makes this different from a one-shot script.
The AI prompt isn't written once and locked in. It evolves based on KJP's feedback through three layers:
Layer 1: Base Prompt (we write this)
The foundation: who KJP is, what tone to use, what format to follow. This rarely changes after the initial setup.
Layer 2: Learned Rules (generated from feedback patterns)
As KJP reviews descriptions, rejection patterns emerge. The system turns those patterns into rules:
| What KJP flags | What the system learns |
|---|---|
| 5+ descriptions flagged "too generic" | "Be specific: name plant species, describe the composition, mention unique visual features." |
| 3+ flagged "too flowery" | "Keep descriptions straightforward and warm. Avoid poetic metaphors." |
| 3+ flagged "missed the main subject" | "Start by identifying the primary subject before describing mood or atmosphere." |
| Free text: "stop mentioning healthcare" (2+ times) | "Do not reference healthcare settings in the description. Let the image speak for itself." |
Rules accumulate automatically. We review them before they go live to make sure they make sense.
Layer 3: Examples (from KJP's own reviews)
The best teaching material is KJP's actual preferences:
- Approved descriptions become positive examples: "This is what good looks like"
- Edited descriptions are gold: "The AI wrote X, but KJP wanted Y" — shows the model exactly where to adjust
- Rejected descriptions with feedback become negative examples: "Don't write like this"
Each time the system processes a new batch, it includes a handful of these examples in the prompt. The AI effectively learns KJP's voice.
What This Looks Like in Practice
Round 1 (50 images): Prompt = Base only → 60% approved
Round 2 (50 images): Prompt = Base + 2 rules → 80% approved
Round 3 (50 images): Prompt = Base + 3 rules + examples → 92% approved
Round 4+ (bulk): System is dialed in → 90%+ approved
The dashboard tracks this progression so KJP can see the improvement in real-time.
The Prompt Evolution View
KJP (and we) can see exactly how the system has improved over time:
Version 1 — Base prompt only
50 images → 30 approved (60%)
Top issue: "Too generic" (12 rejections)
→ Added rule: "Be specific about plant species..."
Version 2 — Added specificity rule
50 images → 40 approved (80%)
Top issue: "References healthcare" (6 rejections)
→ Added rule: "Don't mention healthcare settings..."
Version 3 — Added healthcare rule
50 images → 46 approved (92%)
No strong rejection patterns.
→ Ready for bulk processing ✓
Full transparency. No black box.
Phased Rollout
Phase 0: Build the Tool
We build and deploy the web application. KJP doesn't need to do anything yet.
Deliverable: Live dashboard at a URL KJP can access.
Phase 1: Calibration (50 images at a time)
- We process the first 50 images
- KJP logs into the dashboard, reviews each one
- Approve what's good, reject what's not, tell us why
- We review the feedback, adjust the prompt
- Process another 50 with the improved prompt
- Repeat until approval rate hits 85-90%+
- This is where the prompt gets dialed in
What we need from KJP: - ~30 minutes per review round (50 images at ~30 seconds each) - Honest, specific feedback — the more detail, the faster the system learns - 2-3 review rounds, spread over 1-2 weeks
Deliverable: A tuned prompt that consistently produces descriptions KJP likes.
Phase 2: Expanded Test (500 images)
- System processes 500 images in the background (~2 hours)
- KJP spot-checks 50-100 in the review UI
- First batch of approved descriptions published to WordPress
- KJP sees descriptions go live on the site
What we need from KJP: - ~30-60 minutes to spot-check - Confirmation that live descriptions look good on the actual site
Deliverable: 500 descriptions live on the website.
Phase 3: Full Backfill (remaining ~5,500 images)
- System processes overnight (~18 hours, unattended)
- KJP spot-checks a random sample of ~100
- Bulk approve → bulk publish to WordPress
What we need from KJP: - ~30-60 minutes for final spot-check - Green light to publish
Deliverable: All 6,124 posts have descriptions. Color and region gaps filled where possible.
Phase 4: Ongoing (optional)
- When KJP imports new photography via WP All Import, the system automatically picks them up
- New images land in the review queue within a day
- KJP approves (or the system auto-publishes once trust is high enough)
What we need from KJP: - Nothing — it runs on its own. Occasional spot-checks if they want.
Deliverable: No more description backlog, ever.
What the AI Generates Per Image
For each photograph, the system produces:
Description (2-3 sentences)
Written to match KJP's voice (tuned through the feedback loop). Example:
Bright sunflowers stand tall against a deep blue sky, their golden petals radiating warmth and energy. A close-up perspective highlights the intricate spiral pattern at the flower's center, drawing the viewer into the natural detail.
Color Classification
Selected from KJP's existing color taxonomy: Blue, Brown, Green, Orange, Pink, Purple, Red, White, Yellow, Black/White
Region Classification (where determinable)
Selected from KJP's existing region taxonomy: East, Midwest, Pacific, Rocky Mountains, Southeast, Southwest, Noncontiguous
Note on Region: Many nature photographs don't have identifiable regional markers — a close-up of a flower could be from anywhere. The system will classify when confident and mark "Unknown" when it can't determine region. Those can be filled in manually by KJP if they know the location.
Taxonomy Cleanup (Recommended First Step)
During our investigation, we found some data quality issues in the existing taxonomies:
Color terms with typos/duplicates: | Term | Posts | Issue | |------|-------|-------| | Pruple | 0 | Typo of "Purple" | | Yelllow | 0 | Typo of "Yellow" | | Gold | 0 | Unused | | Grasses | 0 | Unused / not a color | | Gray | 0 | Unused | | Black | 0 | Unused (separate from "Black / White") |
Region terms with zero posts: | Term | Posts | |------|-------| | East Coast | 0 | | Great Lakes | 0 | | Mid-Atlantic | 0 | | Northeast | 0 |
Recommendation: Clean these up before the AI backfill so the system works with a tight, accurate set of terms. Quick task — delete the unused/duplicate terms. ~30 minutes.
Cost Breakdown
API Costs (passed through to client)
The Vision API charges per image analyzed. Costs depend on the model:
| Model | Per Image | 6,124 Images | Quality |
|---|---|---|---|
| Claude Sonnet 4.5 | ~$0.01 | ~$60 | Good |
| GPT-4o | ~$0.01 | ~$60 | Good |
| Claude Opus 4.6 | ~$0.03 | ~$180 | Best |
Recommendation: Start calibration with the best model (Opus), then compare with Sonnet for the bulk run. If quality is comparable, use Sonnet for the full backfill to keep costs down.
Calibration rounds (Phases 1-2, ~650 images) add ~$6-20 in API costs. Full backfill (Phase 3, ~5,500 images) adds ~$55-165. Total API cost: ~$60-180.
Infrastructure Costs
| Item | Cost | Notes |
|---|---|---|
| Vercel Pro | $20/mo | Needed for function timeouts + cron |
| Vercel Postgres | Included | With Pro plan |
| Domain (optional) | — | Can use .vercel.app subdomain |
Vercel Pro is a cost we absorb as part of our tooling — not a client expense. The app can be decommissioned (or repurposed) after the backfill is complete.
Questions for KJP
Before we build, we need to align on a few things:
1. Voice & Tone
The system will learn KJP's preferences through the feedback loop, but having a starting point helps.
- Do the existing descriptions (on the 2,248 posts that have them) represent the gold standard? Or would you want something different?
- Clinical vs. evocative? "A photograph of yellow trees at the base of a mountain" vs. "Golden autumn foliage cascades down the mountainside, evoking a sense of peaceful solitude."
- Should descriptions mention the medium/format? (e.g., "This acrylic print captures...")
- Any words or phrases to always avoid?
2. Color & Region
- Should the AI fill in missing color classifications? 3,416 posts (41%) are missing color.
- Should it attempt region? 4,630 posts (55%) are missing region. Many nature photos don't have identifiable regional markers — the AI will say "Unknown" when it can't tell. Is that useful, or would you rather leave region for manual assignment?
3. Review Commitment
The feedback loop only works if KJP reviews the early batches. Phase 1 requires: - 3 review sessions - ~30 minutes each - Spread over 1-2 weeks
Is the KJP team able to commit to that? The more thorough their feedback in Phase 1, the less work in Phase 3.
4. One-Time or Ongoing?
- One-time backfill only? Process the 6,124 missing descriptions and done.
- Ongoing? When new images are imported via WP All Import, automatically generate descriptions and queue for review. Adds a small amount of build time but means descriptions never fall behind again.
5. Auto-Publish Threshold
Once the system hits high approval rates, does KJP want to: - Always review before publish? Every description goes through the review queue. - Auto-publish with spot-checks? Once approval rate exceeds 90%, new descriptions go live automatically. KJP can spot-check in the dashboard and flag any issues after the fact.
Timeline
| Phase | Duration | Who's Involved |
|---|---|---|
| Phase 0: Build | 2-3 weeks | G&M (dev) |
| Phase 1: Calibration | 1-2 weeks | G&M + KJP (review sessions) |
| Phase 2: Expanded Test | 1 week | G&M + KJP (spot-check) |
| Phase 3: Full Backfill | 1 week | Mostly automated, KJP spot-check |
| Phase 4: Ongoing | Set and forget | Automated |
Total: ~5-7 weeks from kickoff to full backfill complete. Most of that is elapsed time waiting for review rounds, not active dev work.