← Visual SandboxCONTENT HISTORY
WHAT CHANGED
Update to Visual Sandbox
Snapshot Nov 5, 2026 · 01:19 UTC · version 1.0.8
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Visual Sandbox and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Canonical prompt-craft skill for every image model in Visual Sandbox (`image/nano-banana*`, `image/gpt-image-2.5-flare`, `image/gpt-image-2`, `image/flux-2-klein-9b`, future slugs). Read before writing any `vsb run image/<slug>` prompt — text-to-image or edit-with-reference. Covers the universal rules, the prompt-anatomy slot list, the reference-image keep / ignore formula (what to take from the reference, what to ignore — watermarks, text overlays, original lighting, original background), and the \"enumerate models before picking cheapest\" rule. Model-specific quirks live in sibling skills (`vsb-nano-banana`, `vsb-ugc-people`).\n",
"included_files": [
{
"relative_path": "agents/openai.yaml",
"size_in_bytes": 280
}
],
"name": "vsb-image-prompting",
"skill_md_contents": "---\nname: vsb-image-prompting\nrenamed_from: image-prompting\ndescription: >\n Canonical prompt-craft skill for every image model in Visual Sandbox\n (`image/nano-banana*`, `image/gpt-image-2.5-flare`, `image/gpt-image-2`,\n `image/flux-2-klein-9b`, future\n slugs). Read before writing any `vsb run image/<slug>` prompt — text-to-image\n or edit-with-reference. Covers the universal rules, the prompt-anatomy slot\n list, the reference-image keep / ignore formula (what to take from the\n reference, what to ignore — watermarks, text overlays, original lighting,\n original background), and the \"enumerate models before picking cheapest\"\n rule. Model-specific quirks live in sibling skills (`vsb-nano-banana`,\n `vsb-ugc-people`).\nlicense: Proprietary. See LICENSE for the terms.\n---\n\n# Image prompting (model-agnostic)\n\n## Universal rules\n\n1. **Be specific.** Concrete subject, scene, light. Not \"dog in park\".\n2. **Positive framing.** Describe what's there, not what isn't. (\"Empty street\" ✓, \"street with no cars\" ✗.)\n3. **Use photography language.** `f/1.8 shallow DoF`, `golden hour`, `Rembrandt lighting` map to real transforms.\n4. **Iterate on the prompt, not on the pixels.** One change per turn — but\n grow the prompt and re-run from the original. Feeding your own last output\n back in as `image_input` compounds loss on every pass. See\n [`vsb-image-iteration`](../vsb-image-iteration/SKILL.md).\n\n## Prompt anatomy\n\nPick 5–9 slots. Concreteness > coverage.\n\n| Slot | Example |\n|------|---------|\n| Subject | 28yo brunette, shoulder-length wavy hair, faint freckles, pale skin |\n| Wardrobe | oversized cream cable-knit sweater, gold hoop earrings, no makeup |\n| Action | holding latte mug close to chest with both hands |\n| Location | sunlit Brooklyn apartment corner, exposed brick, fairy lights on window frame |\n| Composition | medium close-up selfie, 9:16, eyes upper third, shoulders cropped |\n| Camera | Shot on iPhone 17 Pro Max main lens (~26mm equiv) |\n| Lens / DoF | f/1.8 shallow DoF, slight motion blur on hand |\n| Lighting | warm late-morning window backlight, soft ambient room fill |\n| Color grade | neutral white balance, slightly muted, no Instagram filter |\n| Materiality | ribbed ceramic mug, cable-knit cotton, raw oak windowsill |\n| Mood | cozy, candid, unposed |\n| Anti-AI cues | sensor grain, lens flare, asymmetric framing, hair flyaway, faint pores |\n\n## Bad → good\n\n**Bad** (model fills every gap with AI-glossy defaults):\n> \"candid iPhone selfie of brunette in cozy apartment holding latte, UGC TikTok aesthetic\"\n\n**Good** (directed):\n> \"Candid iPhone selfie of 28yo brunette, shoulder-length wavy hair, faint freckles. Oversized cream cable-knit sweater, ribbed ceramic mug of latte at chest. Sunlit Brooklyn apartment corner, exposed brick, fairy lights on the window frame behind. Medium close-up, 9:16, eyes upper third. Shot on iPhone 17 Pro Max (~26mm), f/1.8, slight hand motion blur. Warm window backlight, soft ambient fill. Neutral white balance, sensor grain, asymmetric framing, single hair flyaway, no makeup. Cozy, candid, unposed.\"\n\n## Reference-image prompting (CRITICAL — fixes watermark/caption bleed)\n\nWhen `image_input` is set, the model uses the reference as *every* signal —\nsubject, watermarks, captions, UI bars, original lighting, original framing\nall bleed forward unless you tell it not to.\n\n**Formula** — paste at the top of every reference-anchored prompt:\n\n```\nUse the reference image as the IDENTITY source only.\nKeep: [face, hair color and length, skin tone, body proportions, age, distinctive features].\nIgnore everything else from the reference — including any watermarks, text overlays, captions, logos, UI bars, original lighting, original background, and original framing.\n\nNow place the same subject in: [fresh scene — full anatomy from above].\n```\n\nEnd with: `\"No logos, no captions, no watermarks, clean frame.\"`\n\n(Negative framing — \"don't add a watermark\" — doesn't work. Stating the desired clean state does.)\n\n**Multi-reference** — name each, give it a role:\n```\nUse Image A as the IDENTITY source — keep face, hair, skin.\nUse Image B as the STYLE source — match color grade, grain, lighting, but ignore its subject.\nUse Image C as the BACKGROUND source — match environment, ignore people / text.\n```\n\nPro tier of nano-banana takes up to 14 refs. Standard models: 1–3.\n\n## Picking the model — enumerate, never assume\n\n\"Cheapest\" / \"fastest\" / \"best for X\" are comparative claims. They need\n**data**, not memory. Prices change weekly. Memorized prices go stale.\n\n```bash\nvsb models --modality image --json \\\n | jq -r '.models[] | \"\\(.category)/\\(.slug)\"' \\\n | while read s; do\n printf \"%-50s \" \"$s\"\n vsb pricing \"$s\" --json 2>/dev/null \\\n | jq -r '.user_cost_estimate // \"tiered(\\(.tiers | length // 0))\"'\n done | sort -k2 -n\n```\n\nModels with `user_cost_estimate: null` are **tiered** (cost depends on\nquality/resolution input, e.g. `nano-banana-pro`, `gpt-image-2.5-flare`,\n`gpt-image-2`). Don't drop\nthem — inspect `vsb pricing <slug> --json` to read the tier table and pick\nthe cheapest tier you can live with.\n\nCheapest row wins **only when the user asked for cheapest and the task is\nsimple**. Detail-critical work — legible in-image text (signs, tattoos,\nposters, packaging), dense multi-element scenes, publishable ad creative,\nprecise multi-ref identity edits — skips the cheap rows entirely: go to\n`image/nano-banana-pro` or `image/gpt-image-2.5-flare` (Flare at `xhigh` or\n`max` when typography legibility is the single hardest constraint;\nnano-banana-pro for photoreal scenes containing text or fine detail). One\npremium run beats three cheap retries.\n\nThen verify the pick supports refs:\n\n```bash\nvsb schema image/<slug> --json | jq '.inputs.image_input'\n```\n\n`null` → no reference editing. Bump up the ladder until you find one.\n\n**CLI quirk — array inputs.** `image_input` is `array<string>`. Pass either\nas repeated flags (`--image_input a --image_input b`) or as a JSON-array\nstring (`--image_input '[\"a\",\"b\"]'`). The CLI auto-wraps a single bare\nstring, but mixed forms with other agents may emit a single bare value —\nuse `vsb run <slug> --help` to confirm the array shape before composing\nthe command.\n\n(Future: `vsb pricing --modality image --all` should ship as a built-in — see vsb CLI backlog.)\n\n## Vocabulary banks (one-liners)\n\n- **Cameras:** `Shot on iPhone 17 Pro Max` (UGC) · `Shot on Fujifilm X-T5, 35mm` (editorial) · `disposable film camera with flash` (raw nostalgic) · `RED cinema camera` (filmic) · `CCTV, fisheye` (found-footage)\n- **Lenses / DoF:** `f/1.8 shallow DoF` · `wide-angle 24mm` · `macro` · `tilt-shift` · `telephoto 85mm compression` · `phone main lens ~26mm` (UGC default)\n- **Lighting:** `three-point softbox` · `Rembrandt` · `rim-lit from behind, soft fill` · `golden hour backlight` · `blue hour ambient` · `neon magenta + cyan rim` · `harsh midday top-light` · `on-camera flash, slight overexposure` · `warm tungsten mixed with daylight window`\n- **Color grades:** `muted teal-and-orange Hollywood grade` · `bleach-bypass, low-sat high-contrast` · `kodachrome warm cast` · `cool monochrome` · `neutral white balance, no filter` (UGC default — say it explicitly)\n- **Materiality:** name fabrics + finishes. `chunky oatmeal wool scarf` > `scarf`. `brushed aluminum laptop` > `laptop`.\n- **Anti-AI cues** (use 3–4 for UGC, skip for studio/commercial): `sensor grain` · `minor lens flare` · `asymmetric framing` · `single hair flyaway` · `faint pore detail` · `micro motion blur on hand` (selfie = handheld) · `no makeup` · `slight jpeg compression` · `no Instagram filter`\n\n## Cross-links\n\n- Model picker → [`vsb-image`](../vsb-image/SKILL.md)\n- Nano Banana quirks (text rendering, 14-ref blend, known limits) → [`vsb-nano-banana`](../vsb-nano-banana/SKILL.md)\n- UGC format (selfie POV / talking-head) → [`vsb-ugc-people`](../vsb-ugc-people/SKILL.md)\n- Editing the same image twice or more → [`vsb-image-iteration`](../vsb-image-iteration/SKILL.md)\n- Selection-chain + sandbox patterns → `vsb`\n\n## Pre-flight checklist\n\nBefore `vsb run`:\n\n1. Subject named (age / hair / skin / build)?\n2. Camera + lens + light + grade picked?\n3. Reference attached → keep/ignore preamble + clean-frame end line?\n4. User said \"cheapest\"/\"fastest\" → enumerated, not assumed?\n\nAll four ✓ → run. Any ✗ → not ready.\n"
}SHA-256 of public snapshot: 085cd914e0d13969c8dbb78fe658d3d3182bcfb518fe71a30e7b0913c4f23d0f