| name | claude-davinci |
| description | Make Claude create actual images, including photorealistic ones. Use whenever the user wants any image, picture, photo, art, illustration, logo, icon, wallpaper, poster, banner, avatar, pixel art, generative art, texture, or asks to "draw" / "paint" / "generate an image" — even though Claude "can't generate images". Photo mode drives a real image model (Gemini/OpenAI/free fallback); vector mode paints with SVG/Pillow/numpy. |
Claude DaVinci
Never say "I can't create images". Two modes: photo mode (Claude as art director driving a real image model) and vector mode (Claude as painter, SVG/code).
Pick the mode
| Request | Mode |
|---|
| Realistic/detailed/painterly: scenes, photos, characters, wallpapers, concept art | PHOTO (default for anything meant to look "real" or rich) |
| Logo, icon, flat illustration, UI art — anything the user must edit afterwards | VECTOR (SVG) |
| Pixel art, procedural textures | Pillow (Python) |
| Generative art: flow fields, fractals, noise | numpy + Pillow → references/recipes.md |
| Charts/diagrams | dedicated chart tooling, not this skill |
PHOTO mode
python scripts/imagine.py "prompt" out.png [WxH] — auto-picks backend: GEMINI_API_KEY → Gemini image gen; OPENAI_API_KEY → gpt-image-1; no key → Pollinations flux (free, zero signup). Never tell the user to get a key first — the free fallback always works.
- Prompt like an art director, one dense paragraph: subject + setting + time-of-day/lighting ("golden hour", "cinematic lighting") + camera/style ("photorealistic", "oil painting", "35mm") + mood + 2-3 concrete details worth featuring. Vague prompt = generic slop; details are the craft.
- LOOK at the result (Read the PNG). Wrong composition/artifacts/missed details → refine the prompt and regenerate. 1-2 retries is normal.
- User asked for edits ("same but at night") → rewrite the full prompt with the change baked in, regenerate.
VECTOR mode workflow
- Decide palette + composition BEFORE writing code (see rules below).
- Write the SVG/script to a file in the working or scratchpad dir.
- Render to PNG:
python scripts/render.py in.svg out.png [width] (tries cairosvg → resvg → inkscape → headless Chrome/Edge; at least one exists on any dev machine).
- LOOK at the result — Read the PNG. You have eyes; use them. Bad proportions, muddy colors, floating shadows → fix and re-render. 2-3 iterations minimum for anything artistic.
- Send the user the final file (PNG + source SVG). The source IS the .psd — say so.
Art rules (this is what separates art from clipart)
Palette first. 4-6 cohesive colors + 1 accent, written down before drawing. Steal from nature or a film still, not from #FF0000.
Never flat-fill. Every large shape gets a gradient (2 close hues beats 1). Background gets a subtle radial vignette. Flat fill = programmer art.
One light source. Decide direction; ALL highlights, shadows, gradients obey it. Inconsistent lighting is the #1 tell.
Layer like a painter. Background → midground → subject → highlights/glow/atmosphere. Depth = farther things smaller, bluer, blurrier, lower contrast.
Curves, not polygons. Organic shapes use bezier paths (C/Q), never straight-edged polygons. Nothing alive has corners.
SVG power tools (<defs> them once, reuse):
feGaussianBlur — glow, soft shadows, atmosphere
feTurbulence + feDisplacementMap — clouds, water, rock, paper texture, hand-drawn wobble
feDropShadow — grounded objects (match light direction!)
<radialGradient> — light falloff, skies, orbs
<use>/<pattern> — repetition (stars, leaves, crowds) without bloat
opacity + mix-blend-mode (multiply/screen) — shading and light overlays
Composition. Focal point off-center (thirds). Big/medium/small size rhythm. Leave breathing room — emptiness is a feature.
Detail budget. 30-120 elements for a scene. Fewer = flat; more = noise. Add detail only at the focal point.
Traps
- Text in images: only when asked;
font-family="Georgia, serif" + fallbacks, or skip text entirely.
- viewBox always (
0 0 1024 1024 typical); no fixed px width/height on root.
- Headless-browser rendering ignores external files — inline everything, no
<image href="file...">.
- Don't claim ✅ without having rendered AND looked at the PNG.