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:

  1. See progress — how many images processed, how many reviewed, approval rate
  2. Review descriptions — image on one side, AI-generated description on the other
  3. Approve or reject — one click to approve, or flag what's wrong
  4. 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:

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:

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)

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)

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)

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)

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.


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.

2. Color & Region

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?

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.