{"id":"bafedb8e-1ff0-4be0-8adc-ef154cec17ec","shortId":"WZ3TmN","kind":"skill","title":"image-gen","tagline":"Image generation, editing, and review via OpenRouter API. Five models from budget to premium.\nStyle presets for series consistency, JSON structured prompts, reference image anchoring,\nsystem message support, prompt upsampling. Vision-based quality review loop. Zero dependencies\nb","description":"# image-gen\n\nImage generation and editing via OpenRouter. Five models, three scripts, style presets, one JSON contract.\n\n**Scripts:** `./scripts/generate.py`, `./scripts/edit.py`, `./scripts/review.py`\n**Presets:** `./presets/*.json`\n**Output dir:** `./data/`\n\n## Setup\n\n```bash\nexport OPENROUTER_API_KEY_IMAGES='your-api-key-here'\n```\n\n- **Claude Code:** copy this skill folder into `.claude/skills/image-gen/`\n- **Codex CLI:** append this SKILL.md content to your project's root `AGENTS.md`\n\nFor the full installation walkthrough (prerequisites, API keys, verification, troubleshooting), see [references/installation-guide.md](references/installation-guide.md).\n\n### Credential management\n\nThree tiers for managing the `OPENROUTER_API_KEY_IMAGES` environment variable:\n\n1. **Vault skill (recommended):** If you have a vault or secret-management skill, store the key there and export it before running scripts. Example: `export OPENROUTER_API_KEY_IMAGES=$(vault get OPENROUTER_API_KEY_IMAGES)`\n2. **Custom secret manager:** Use your team's preferred secret manager (1Password CLI, AWS Secrets Manager, etc.)\n3. **Plain export:** `export OPENROUTER_API_KEY_IMAGES='your-api-key-here'` in your shell profile\n\nOptional keys for additional features:\n- `OPENAI_API_KEY` -- for mask-based inpainting via `edit.py --mode openai`\n- `ANTHROPIC_API_KEY` -- for auto-review via `review.py --auto`\n\n---\n\n## Model Selection\n\n```text\nWhat do you need?\n  |\n  +-- Fast + cheap + good enough?\n  |     --> nanobanana (~$0.0004/image)\n  |\n  +-- High quality, no text?\n  |     --> flux.2-pro (best visual quality)\n  |\n  +-- Text in the image?\n  |     --> gpt-5-image (best text rendering)\n  |\n  +-- Image editing?\n  |     +-- Describe changes in words --> gpt-5-image or nanobanana-pro\n  |     +-- Paint mask area to change --> edit.py --mode openai\n  |\n  +-- Budget generation at scale?\n  |     --> flux.2-klein (fastest, cheapest Flux)\n  |\n  +-- Quality + editing + reasoning?\n        --> nanobanana-pro (best balance)\n```\n\n| Alias | Type | Cost | Best For |\n|---|---|---|---|\n| `flux.2-pro` | Image-only | ~$0.03/MP | Default high-quality generation |\n| `flux.2-klein` | Image-only | ~$0.014/MP | Fast, budget generation |\n| `gpt-5-image` | Text+Image | ~$0.04/image | Text rendering, complex edits |\n| `nanobanana-pro` | Text+Image | ~$0.012/image | Balanced quality + editing |\n| `nanobanana` | Text+Image | ~$0.0004/image | Lowest-cost generation |\n\nFull comparison: `./references/model-card.md`\n\n---\n\n## Quick Reference\n\n```bash\n# Generate with default model (flux.2-pro)\npython ./scripts/generate.py \\\n  --prompt \"A red fox in snow\" \\\n  --output-dir ./data/\n\n# Generate with style preset\npython ./scripts/generate.py \\\n  --prompt \"A scene description for consistent series\" \\\n  --preset default \\\n  --output-dir ./data/\n\n# Generate with style reference image\npython ./scripts/generate.py \\\n  --prompt \"A new scene\" \\\n  --style-ref /path/to/golden-image.png \\\n  --output-dir ./data/\n\n# Generate with multiple style refs\npython ./scripts/generate.py \\\n  --prompt \"Scene desc\" \\\n  --style-ref /path/to/ref1.png \\\n  --style-ref /path/to/ref2.png\n\n# Generate with system message (GPT-5 / NanoBanana only)\npython ./scripts/generate.py \\\n  --prompt \"Scene desc\" \\\n  --model gpt-5-image \\\n  --system-prompt \"You generate muted watercolor illustrations...\"\n\n# Generate with prompt upsampling disabled\npython ./scripts/generate.py \\\n  --prompt \"Exact scene\" \\\n  --model flux.2-pro \\\n  --no-prompt-upsampling\n\n# Generate with options (model, aspect ratio, size)\npython ./scripts/generate.py \\\n  --prompt \"Tokyo skyline at sunset\" \\\n  --model nanobanana-pro \\\n  --aspect-ratio 16:9 \\\n  --size 2K \\\n  --output-dir ./data/\n\n# Generate with text (GPT-5 Image)\npython ./scripts/generate.py \\\n  --prompt 'Poster with text \"HELLO WORLD\" in bold sans-serif typography' \\\n  --model gpt-5-image \\\n  --output-dir ./data/\n\n# Edit image (chat-based)\npython ./scripts/edit.py \\\n  --mode openrouter \\\n  --input-image ./data/input.png \\\n  --prompt \"Change the background to a sunset beach\" \\\n  --model gpt-5-image \\\n  --output-dir ./data/\n\n# Edit image (mask-based)\npython ./scripts/edit.py \\\n  --mode openai \\\n  --input-image ./data/input.png \\\n  --mask ./data/mask.png \\\n  --prompt \"Replace masked area with a small bonsai tree\" \\\n  --openai-size 1024x1024 \\\n  --output-dir ./data/\n\n# Review quality (auto mode)\npython ./scripts/review.py \\\n  --image ./data/output.png \\\n  --original-prompt \"A red fox in snow\" \\\n  --auto\n```\n\n---\n\n## Style Presets\n\nPresets encode visual identity into reusable JSON files. A preset defines palette, composition, rendering style, model defaults, and system messages.\n\n### How Presets Work\n\n1. Pick a preset based on the project context\n2. `generate.py --preset <name>` loads the preset JSON\n3. The script applies the preset: enhances the prompt with style data, selects model defaults, injects system messages\n4. For Flux models: prompt is constructed as JSON (structured prompt, prevents concept bleeding)\n5. For GPT-5/NanoBanana: style block is prepended as natural language, system message is injected\n\n### Available Presets\n\n| Preset | File | Description |\n|--------|------|-------------|\n| `default` | `presets/default.json` | No style constraints. Quality-focused defaults. |\n\n### Preset Schema\n\n```json\n{\n  \"name\": \"preset-name\",\n  \"description\": \"What this preset is for\",\n  \"defaults\": {\n    \"model\": \"flux.2-pro\",\n    \"aspect_ratio\": \"3:2\",\n    \"size\": \"2K\"\n  },\n  \"style\": {\n    \"description\": \"Overall style description\",\n    \"color_palette\": [\"#hex1\", \"#hex2\", \"#hex3\"],\n    \"mood\": \"Emotional tone\",\n    \"lighting\": \"Lighting description\",\n    \"composition\": \"Composition rules\",\n    \"rendering\": \"Rendering constraints\",\n    \"camera\": {\"angle\": \"...\", \"framing\": \"...\"},\n    \"anti_patterns\": [\"thing to avoid\", \"another thing\"],\n    \"reference_images\": [\"/absolute/path/to/golden.png\"]\n  },\n  \"system_message\": \"System prompt for GPT-5/NanoBanana models\"\n}\n```\n\n### Priority Order (CLI > Preset > Hardcoded)\n\n- `--model` flag overrides `preset.defaults.model`\n- `--aspect-ratio` flag overrides `preset.defaults.aspect_ratio`\n- `--size` flag overrides `preset.defaults.size`\n- `--system-prompt` flag overrides `preset.system_message`\n- If no preset and no flag: hardcoded defaults (flux.2-pro, 1:1, 2K)\n\n### Creating a New Preset\n\n1. Copy `presets/default.json` as a template\n2. Set `name` and `description`\n3. Fill `defaults` with preferred model, aspect ratio, size\n4. Fill `style` with palette (HEX values), composition rules, rendering constraints\n5. Write `system_message` for GPT-5/NanoBanana (ignored by Flux)\n6. Optionally add `reference_images` paths for visual anchoring\n7. Test: `python generate.py --prompt \"test scene\" --preset your-preset`\n\n---\n\n## Style References\n\nUse `--style-ref` to pass reference images for visual anchoring. The script prepends a style transfer instruction automatically.\n\n```bash\n# Single reference (anchor to a \"golden\" image)\npython ./scripts/generate.py --prompt \"New scene\" \\\n  --style-ref /path/to/golden.png\n\n# Multiple references (combine style + content refs, up to 8)\npython ./scripts/generate.py --prompt \"New scene\" \\\n  --style-ref /path/to/style-ref.png \\\n  --style-ref /path/to/character-ref.png\n```\n\nReference images from presets (`style.reference_images`) are automatically loaded alongside CLI refs.\n\nFull workflow and per-model consistency techniques: `./references/style-consistency.md`\n\n---\n\n## System Messages\n\nUse `--system-prompt` to set persistent style context for GPT-5 Image and NanoBanana models. System messages are injected as the system role, keeping the user prompt focused on scene content only.\n\n```bash\npython ./scripts/generate.py \\\n  --prompt \"A quiet village at dawn\" \\\n  --model gpt-5-image \\\n  --system-prompt \"You generate muted watercolor illustrations with earth-tone palettes...\"\n```\n\nSystem messages can also be set in presets via the `system_message` field. CLI `--system-prompt` overrides preset system messages.\n\nFlux models do not support system messages (the flag is silently ignored).\n\n---\n\n## Prompt Upsampling\n\nFlux models support `prompt_upsampling` -- an API feature that auto-enhances basic prompts into richer descriptions before generation.\n\n- **Default:** ON for Flux models (flux.2-pro, flux.2-klein)\n- **Disable:** `--no-prompt-upsampling` when you want exact prompt control\n- **Enable:** `--prompt-upsampling` (explicit, same as default)\n- **Non-Flux models:** Flag is silently ignored\n\n```bash\n# Default: upsampling ON (good for short/simple prompts)\npython ./scripts/generate.py --prompt \"A cat\" --model flux.2-pro\n\n# Disable: exact prompt control (good for precise/pre-enhanced prompts)\npython ./scripts/generate.py --prompt \"Detailed exact scene...\" \\\n  --model flux.2-pro --no-prompt-upsampling\n```\n\n---\n\n## Prompt Engineering\n\n### Enhance-before-generate protocol\n\n1. Identify intent: photo, illustration, logo, diagram, etc.\n2. Select preset if this is series work.\n3. Fill missing details: subject, style, lighting, composition, camera/look.\n4. Tune prompt shape to model: concise for Flux, more explicit for GPT-5/NanoBanana family.\n5. Add quality boosters that match requested style.\n\n### Example: raw prompt -> enhanced prompt\n\n- Raw prompt: `a cat in space`\n- Enhanced prompt: `Orange tabby cat in a custom spacesuit floating in zero gravity, Earth visible in helmet reflection, dramatic rim lighting, cinematic framing, ultra-detailed, high contrast, clean background`\n\nTemplates, per-model formats, JSON structured prompts, and examples: `./references/prompt-templates.md`\n\n---\n\n## Generation Workflow\n\n### 1. Select Preset (if applicable)\n\nIf the image is part of a series or project with established visual identity, select the appropriate preset.\n\n### 2. Enhance Prompt\n\nTransform the raw prompt into a model-optimized prompt. Each model interprets prompts differently:\n\n- **Flux:** Concise, front-loaded, under 80 words. JSON for complex multi-element scenes. HEX colors for precision.\n- **GPT-5 Image:** Detailed natural language. System messages for series work. Text in quotes for rendering.\n- **NanoBanana:** Structured narrative. Constrain palette explicitly for muted styles (\"no neon, desaturated\").\n\n### 3. Generate\n\n```bash\npython ./scripts/generate.py \\\n  --prompt \"[enhanced prompt]\" \\\n  --model [chosen model] \\\n  --preset [preset if applicable] \\\n  --aspect-ratio [ratio] \\\n  --size [1K|2K|4K]\n```\n\nOutput: JSON to stdout with `path`, `model`, `cost_estimate`, `generation_time_ms`.\n\nWhen a preset is used, the script handles prompt enhancement internally. Enhance the scene description but do NOT manually add style parameters -- the preset handles that.\n\n### 4. Review (Optional)\n\nFor quality-critical work:\n\n```bash\npython ./scripts/review.py \\\n  --image /path/to/output.png \\\n  --original-prompt \"[the enhanced prompt]\" \\\n  --auto\n```\n\nOutput: JSON with `score`, `verdict` (accept/refine/reject), `critique`, `suggested_refinement`.\n\n- `accept` (score >= 7): Deliver to user\n- `refine` (score 4-6): Re-generate with `suggested_refinement` applied\n- `reject` (score < 4): Re-generate with different model or reworked prompt\n\n### 5. Deliver\n\nReturn the file path and a brief description.\n\n---\n\n## Editing Workflow\n\n### Chat-Based Editing (OpenRouter)\n\nFor natural language edits: \"make it darker\", \"change background to beach\", \"add a hat\".\n\n```bash\npython ./scripts/edit.py --mode openrouter \\\n  --input-image /path/to/original.png \\\n  --prompt \"Change the background to a sunset beach\" \\\n  --model nanobanana-pro\n```\n\nBest models for chat editing: `gpt-5-image`, `nanobanana-pro`.\n\n### Mask-Based Inpainting (OpenAI Direct)\n\nFor precise area editing with a mask image.\n\n```bash\npython ./scripts/edit.py --mode openai \\\n  --input-image /path/to/original.png \\\n  --mask /path/to/mask.png \\\n  --prompt \"A fluffy orange cat\" \\\n  --openai-size 1024x1024\n```\n\nRequires `OPENAI_API_KEY`. Mask: PNG with transparent areas where edits should happen.\n\n---\n\n## Script Output Contract\n\nAll scripts output JSON to stdout. Parse JSON, never text.\n\n### generate.py success\n\n```json\n{\n  \"success\": true,\n  \"path\": \"/abs/path/to/20260217-143052-flux-2-pro.png\",\n  \"all_paths\": [\"/abs/path/to/20260217-143052-flux-2-pro.png\"],\n  \"model\": \"black-forest-labs/flux.2-pro\",\n  \"prompt\": \"the user prompt\",\n  \"enhanced_prompt\": \"the preset-enhanced prompt (if different)\",\n  \"preset\": \"my-preset\",\n  \"aspect_ratio\": \"16:9\",\n  \"size\": \"2K\",\n  \"cost_estimate\": \"~$0.120\",\n  \"generation_time_ms\": 8500,\n  \"image_count\": 1,\n  \"style_refs\": [\"/path/to/ref.png\"],\n  \"system_message_used\": true\n}\n```\n\n### generate.py / edit.py error\n\n```json\n{\n  \"success\": false,\n  \"error\": \"HTTP 429: Too Many Requests\",\n  \"details\": \"Rate limit exceeded...\",\n  \"model\": \"black-forest-labs/flux.2-pro\",\n  \"generation_time_ms\": 150\n}\n```\n\n### review.py output (auto mode)\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"auto\",\n  \"score\": 8,\n  \"prompt_adherence\": 9,\n  \"technical_quality\": 8,\n  \"composition\": 7,\n  \"verdict\": \"accept\",\n  \"critique\": \"Strong prompt adherence with vivid colors. Minor composition issue with empty right third.\",\n  \"suggested_refinement\": \"\"\n}\n```\n\n---\n\n## CLI Flags Reference\n\n### generate.py\n\n| Flag | Default | Description |\n|---|---|---|\n| `--prompt` | required | Generation prompt |\n| `--model` | preset or `flux.2-pro` | Model alias or full OpenRouter ID |\n| `--aspect-ratio` | preset or `1:1` | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 |\n| `--size` | preset or `2K` | 1K, 2K, 4K |\n| `--output-dir` | `./data/` | Output directory |\n| `--output-file` | auto-named | Explicit output path |\n| `--seed` | none | Random seed (model-dependent) |\n| `--input-image` | none | Input image for editing |\n| `--preset` | none | Style preset name or path to JSON file |\n| `--style-ref` | none | Style reference image path (repeatable, up to 8) |\n| `--prompt-upsampling` | on for Flux | Enable Flux prompt_upsampling |\n| `--no-prompt-upsampling` | | Disable prompt_upsampling |\n| `--system-prompt` | preset or none | System message for GPT-5/NanoBanana |\n\n### edit.py\n\n| Flag | Default | Description |\n|---|---|---|\n| `--mode` | required | `openrouter` or `openai` |\n| `--input-image` | required | Image to edit |\n| `--prompt` | required | Edit instruction |\n| `--mask` | none | Mask PNG (openai mode) |\n| `--model` | `gpt-5-image` | Model for openrouter mode |\n| `--openai-model` | `gpt-image-1` | Model for openai mode |\n| `--openai-size` | none | Size for openai mode |\n| `--openai-quality` | none | Quality for openai mode |\n| `--output-dir` | `./data/` | Output directory |\n| `--output-file` | auto-named | Explicit output path |\n\n### review.py\n\n| Flag | Default | Description |\n|---|---|---|\n| `--image` | required | Image to review |\n| `--original-prompt` | required | Prompt used for generation |\n| `--auto` | false | Auto-review via Anthropic API |\n\n---\n\n## Cost Tracking\n\nReport cost after every generation. Use the `cost_estimate` field from script output.\n\n| Model | Typical Cost |\n|---|---|\n| NanoBanana | $0.0004 |\n| Flux 2 Klein | $0.01-0.03 |\n| NanoBanana Pro | $0.01-0.03 |\n| Flux 2 Pro | $0.03-0.12 |\n| GPT-5 Image | $0.03-0.10 |\n\nTip: for batch generation (5+ images), prefer NanoBanana or Flux 2 Klein to control spend.\n\n---\n\n## Error Handling\n\n| Error | Action |\n|---|---|\n| No API key | Script exits with JSON error. Check env vars. |\n| HTTP 429 (rate limit) | Wait 10s, retry. If persistent, switch model. |\n| HTTP 402 (no credits) | Top up OpenRouter account. |\n| No images in response | Check model supports image output. Try different model. |\n| Timeout (>180s) | Model may be overloaded. Try Klein or NanoBanana for speed. |\n| Image quality too low | Run review loop. Refine prompt or switch to higher-quality model. |\n| Preset not found | Check presets/ directory. Use preset name without .json extension. |\n\n---\n\n## Anti-Patterns\n\n| Do NOT | Do Instead |\n|---|---|\n| Send raw user prompts to models | Always enhance prompts first |\n| Use Flux for text in images | Use GPT-5 Image or NanoBanana Pro |\n| Use GPT-5 for bulk generation | Use NanoBanana or Flux Klein (10-100x cheaper) |\n| Skip cost reporting | Always report estimated cost |\n| Retry same prompt on failure | Rework prompt or switch model |\n| Use review loop for casual requests | Reserve for quality-critical work |\n| Forget to set API key before running | Export required keys before running scripts |\n| Use JSON prompts for GPT-5 Image | GPT-5 prefers natural language; JSON adds no benefit |\n| Use verbal color descriptions with Flux | Use HEX values in palette for precise control |\n| Generate series images without a preset | Create a preset for any 3+ image series |\n| Forget --style-ref for consistency | Use golden image as reference for series work |\n\n---\n\n## Bundled Resources Index\n\n| Path | What | When to Load |\n|---|---|---|\n| `./scripts/generate.py` | Core image generation script | Every generation task |\n| `./scripts/edit.py` | Chat-based and mask-based editing | Image modification requests |\n| `./scripts/review.py` | Vision-based quality review | Quality-critical workflows |\n| `./presets/default.json` | Default preset (no style constraints) | Reference for preset schema |\n| `./references/prompt-templates.md` | SOTA prompt engineering: per-model formats, JSON templates, style modifiers, enhancement protocol | Prompt engineering step |\n| `./references/style-consistency.md` | Reference image workflow, seed workflow, consistency technique stack | Generating image series requiring visual consistency |\n| `./references/model-card.md` | Model capabilities, tradeoffs, pricing context | Model selection and optimization |\n| `./references/installation-guide.md` | Detailed install walkthrough for Claude Code and Codex CLI | First-time setup or environment repair |\n| `./references/api-reference.md` | API payload and integration details | Debugging and advanced usage |\n| `./references/book-to-prompts-playbook.md` | Method for extracting visual prompts from literature | Book illustration projects |\n| `./examples/` | Example outputs by model | Visual quality and style calibration |\n| `./UPDATES.md` | Changelog for this skill | Checking new features/fixes |\n| `./UPDATE-GUIDE.md` | Agent-oriented update instructions | Applying updates safely |\n\n---\n\n## Staying Updated\n\nThis skill ships with an `UPDATES.md` changelog and `UPDATE-GUIDE.md` for your AI agent.\n\nAfter installing, tell your agent: \"Check `UPDATES.md` in the image-gen skill for any new features or changes.\"\n\nWhen updating, tell your agent: \"Read `UPDATE-GUIDE.md` and apply the latest changes from `UPDATES.md`.\"\n\nFollow `UPDATE-GUIDE.md` so customized local files are diffed before any overwrite.\n\nTo check upstream updates directly from GitHub:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/buildoak/fieldwork-skills/main/skills/image-gen/UPDATES.md | head -40\n```","tags":["image","gen","fieldwork","skills","buildoak","agent-skills","ai-agents","ai-tools","automation","browser-automation","claude-code","claude-skills"],"capabilities":["skill","source-buildoak","skill-image-gen","topic-agent-skills","topic-ai-agents","topic-ai-tools","topic-automation","topic-browser-automation","topic-claude-code","topic-claude-skills","topic-codex"],"categories":["fieldwork-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/buildoak/fieldwork-skills/image-gen","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add buildoak/fieldwork-skills","source_repo":"https://github.com/buildoak/fieldwork-skills","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (18,882 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T19:06:33.055Z","embedding":null,"createdAt":"2026-04-18T23:07:14.766Z","updatedAt":"2026-04-22T19:06:33.055Z","lastSeenAt":"2026-04-22T19:06:33.055Z","tsv":"'-0.03':1964,1968 '-0.10':1978 '-0.12':1973 '-100':2122 '-40':2453 '-5':253,265,321,434,444,503,521,550,681,771,854,973,1006,1189,1315,1519,1837,1867,1975,2105,2112,2172,2175 '-6':1441 '/abs/path/to/20260217-143052-flux-2-pro.png':1590,1593 '/absolute/path/to/golden.png':764 '/buildoak/fieldwork-skills/main/skills/image-gen/updates.md':2451 '/data':70,372,391,410,498,526,555,587,1761,1903 '/data/input.png':539,568 '/data/mask.png':570 '/data/output.png':595 '/examples':2353 '/flux.2-pro':1599,1661 '/image':239,326,337,345 '/mp':305,316 '/nanobanana':682,772,855,1190,1838 '/path/to/character-ref.png':938 '/path/to/golden-image.png':406 '/path/to/golden.png':916 '/path/to/mask.png':1548 '/path/to/original.png':1500,1546 '/path/to/output.png':1415 '/path/to/ref.png':1635 '/path/to/ref1.png':424 '/path/to/ref2.png':428 '/path/to/style-ref.png':934 '/presets':66 '/presets/default.json':2263 '/references/api-reference.md':2332 '/references/book-to-prompts-playbook.md':2342 '/references/installation-guide.md':2315 '/references/model-card.md':352,2305 '/references/prompt-templates.md':1251,2273 '/references/style-consistency.md':959,2290 '/scripts/edit.py':63,533,562,1494,1540,2241 '/scripts/generate.py':62,362,378,398,417,438,460,478,506,909,927,997,1118,1133,1346,2233 '/scripts/review.py':64,593,1413,2253 '/update-guide.md':2371 '/updates.md':2363 '0.0004':238,344,1959 '0.01':1963,1967 '0.012':336 '0.014':315 '0.03':304,1972,1977 '0.04':325 '0.120':1625 '1':129,630,810,811,817,1151,1254,1632,1729,1730,1731,1732,1879 '10':2121 '1024x1024':583,1557 '10s':2014 '150':1665 '16':491,1619,1746,1747 '180s':2041 '1k':1362,1755 '1password':176 '2':165,639,727,823,1159,1277,1733,1736,1961,1970,1989 '21':1749 '2k':494,729,812,1363,1622,1754,1756 '3':182,646,726,828,1167,1342,1734,1735,1737,1740,2208 '4':664,837,1176,1403,1440,1451,1738,1739,1741,1744 '402':2021 '429':1648,2010 '4k':1364,1757 '5':678,848,1192,1461,1742,1743,1983 '6':859 '7':868,1434,1684 '8':925,1676,1682,1809 '80':1301 '8500':1629 '9':492,1620,1679,1745,1748,1750 'accept':1432,1686 'accept/refine/reject':1428 'account':2027 'action':1997 'add':861,1193,1396,1489,2180 'addit':202 'adher':1678,1690 'advanc':2340 'agent':2373,2394,2399,2418 'agent-ori':2372 'agents.md':102 'ai':2393 'alia':295,1719 'alongsid':948 'also':1024 'alway':2093,2128 'anchor':28,867,891,903 'angl':753 'anoth':760 'anthrop':216,1938 'anti':755,2081 'anti-pattern':2080 'api':11,75,80,109,124,156,162,187,192,205,217,1062,1560,1939,1999,2157,2333 'append':93 'appli':649,1448,2377,2422 'applic':1258,1356 'appropri':1275 'area':273,574,1532,1566 'aspect':474,489,724,784,834,1358,1617,1725 'aspect-ratio':488,783,1357,1724 'auto':221,225,590,604,1066,1422,1668,1674,1768,1910,1932,1935 'auto-enh':1065 'auto-nam':1767,1909 'auto-review':220,1934 'automat':899,946 'avail':694 'avoid':759 'aw':178 'b':42 'background':543,1240,1486,1504 'balanc':294,338 'base':36,210,531,560,634,1475,1526,2244,2248,2256 'bash':72,355,900,995,1109,1344,1411,1492,1538,2446 'basic':1068 'batch':1981 'beach':547,1488,1508 'benefit':2182 'best':245,255,293,298,1513 'black':1596,1658 'black-forest-lab':1595,1657 'bleed':677 'block':684 'bold':514 'bonsai':578 'book':2350 'booster':1195 'brief':1469 'budget':15,279,318 'bulk':2114 'bundl':2225 'calibr':2362 'camera':752 'camera/look':1175 'capabl':2307 'casual':2146 'cat':1121,1208,1215,1553 'chang':261,275,541,1485,1502,2413,2425 'changelog':2364,2388 'chat':530,1474,1516,2243 'chat-bas':529,1473,2242 'cheap':234 'cheaper':2124 'cheapest':285 'check':2006,2032,2071,2368,2400,2440 'chosen':1351 'cinemat':1232 'claud':83,2320 'claude/skills/image-gen':90 'clean':1239 'cli':92,177,776,949,1034,1703,2324 'code':84,2321 'codex':91,2323 'color':735,1311,1693,2185 'combin':919 'comparison':351 'complex':329,1305 'composit':619,746,747,844,1174,1683,1695 'concept':676 'concis':1182,1296 'consist':22,384,957,2216,2296,2304 'constrain':1333 'constraint':703,751,847,2268 'construct':670 'content':96,921,993 'context':638,970,2310 'contract':60,1573 'contrast':1238 'control':1092,1127,1992,2196 'copi':85,818 'core':2234 'cost':297,348,1372,1623,1940,1943,1949,1957,2126,2131 'count':1631 'creat':813,2203 'credenti':116 'credit':2023 'critic':1409,2152,2261 'critiqu':1429,1687 'curl':2447 'custom':166,1218,2431 'darker':1484 'data':657 'dawn':1003 'debug':2338 'default':306,358,387,623,660,699,707,721,808,830,1075,1100,1110,1708,1841,1917,2264 'defin':617 'deliv':1435,1462 'depend':41,1779 'desatur':1341 'desc':420,441 'describ':260 'descript':382,698,715,731,734,745,827,1072,1391,1470,1709,1842,1918,2186 'detail':1135,1170,1236,1317,1652,2316,2337 'diagram':1157 'dif':2435 'differ':1294,1456,1612,2038 'dir':69,371,390,409,497,525,554,586,1760,1902 'direct':1529,2443 'directori':1763,1905,2073 'disabl':458,1082,1124,1824 'dramat':1229 'earth':1018,1224 'earth-ton':1017 'edit':6,49,259,288,330,340,527,556,1471,1476,1481,1517,1533,1568,1787,1854,1857,2249 'edit.py':213,276,1641,1839 'element':1308 'emot':741 'empti':1698 'enabl':1093,1816 'encod':608 'engin':1145,2276,2288 'enhanc':652,1067,1147,1203,1211,1278,1348,1386,1388,1420,1604,1609,2094,2285 'enhance-before-gener':1146 'enough':236 'env':2007 'environ':127,2330 'error':1642,1646,1994,1996,2005 'establish':1270 'estim':1373,1624,1950,2130 'etc':181,1158 'everi':1945,2238 'exact':462,1090,1125,1136 'exampl':153,1200,1250,2354 'exceed':1655 'exit':2002 'explicit':1097,1186,1335,1770,1912 'export':73,148,154,184,185,2161 'extens':2079 'extract':2345 'failur':2136 'fals':1645,1933 'famili':1191 'fast':233,317 'fastest':284 'featur':203,1063,2411 'features/fixes':2370 'field':1033,1951 'file':614,697,1465,1766,1797,1908,2433 'fill':829,838,1168 'first':2096,2326 'first-tim':2325 'five':12,52 'flag':780,786,791,797,806,1050,1105,1704,1707,1840,1916 'float':1220 'fluffi':1551 'flux':286,666,858,1042,1056,1078,1103,1184,1295,1815,1817,1960,1969,1988,2098,2119,2188 'flux.2-klein':283,311,1081 'flux.2-pro':244,300,360,465,723,809,1080,1123,1139,1717 'focus':706,990 'folder':88 'follow':2428 'forest':1597,1659 'forget':2154,2211 'format':1245,2280 'found':2070 'fox':366,601 'frame':754,1233 'front':1298 'front-load':1297 'fssl':2448 'full':105,350,951,1721 'gen':3,45,2406 'generat':5,47,280,310,319,349,356,373,392,411,429,450,454,470,499,1012,1074,1149,1252,1343,1374,1444,1454,1626,1662,1712,1931,1946,1982,2115,2197,2236,2239,2299 'generate.py':640,871,1584,1640,1706 'get':160 'github':2445 'golden':906,2218 'good':235,1113,1128 'gpt':252,264,320,433,443,502,520,549,680,770,853,972,1005,1188,1314,1518,1836,1866,1877,1974,2104,2111,2171,2174 'gpt-imag':1876 'graviti':1223 'handl':1384,1401,1995 'happen':1570 'hardcod':778,807 'hat':1491 'head':2452 'hello':511 'helmet':1227 'hex':842,1310,2190 'hex1':737 'hex2':738 'hex3':739 'high':240,308,1237 'high-qual':307 'higher':2065 'higher-qu':2064 'http':1647,2009,2020 'id':1723 'ident':610,1272 'identifi':1152 'ignor':856,1053,1108 'illustr':453,1015,1155,2351 'imag':2,4,27,44,46,77,126,158,164,189,251,254,258,266,302,313,322,324,335,343,396,445,504,522,528,538,551,557,567,594,763,863,888,907,940,944,974,1007,1261,1316,1414,1499,1520,1537,1545,1630,1782,1785,1804,1850,1852,1868,1878,1919,1921,1976,1984,2029,2035,2052,2102,2106,2173,2199,2209,2219,2235,2250,2292,2300,2405 'image-gen':1,43,2404 'image-on':301,312 'index':2227 'inject':661,693,981 'inpaint':211,1527 'input':537,566,1498,1544,1781,1784,1849 'input-imag':536,565,1497,1543,1780,1848 'instal':106,2317,2396 'instead':2086 'instruct':898,1858,2376 'integr':2336 'intent':1153 'intern':1387 'interpret':1292 'issu':1696 'json':23,59,67,613,645,672,710,1246,1303,1366,1424,1577,1581,1586,1643,1670,1796,2004,2078,2168,2179,2281 'keep':986 'key':76,81,110,125,145,157,163,188,193,200,206,218,1561,2000,2158,2163 'klein':1962,1990,2047,2120 'lab':1598,1660 'languag':689,1319,1480,2178 'latest':2424 'light':743,744,1173,1231 'limit':1654,2012 'literatur':2349 'load':642,947,1299,2232 'local':2432 'logo':1156 'loop':39,2058,2144 'low':2055 'lowest':347 'lowest-cost':346 'make':1482 'manag':117,121,141,168,175,180 'mani':1650 'manual':1395 'mask':209,272,559,569,573,1525,1536,1547,1562,1859,1861,2247 'mask-bas':208,558,1524,2246 'match':1197 'may':2043 'messag':30,432,626,663,691,766,800,851,961,979,1022,1032,1041,1048,1321,1637,1834 'method':2343 'minor':1694 'miss':1169 'mode':214,277,534,563,591,1495,1541,1669,1673,1843,1864,1872,1883,1891,1899 'model':13,53,226,359,442,464,473,484,519,548,622,659,667,722,773,779,833,956,977,1004,1043,1057,1079,1104,1122,1138,1181,1244,1287,1291,1350,1352,1371,1457,1509,1514,1594,1656,1714,1718,1778,1865,1869,1875,1880,1955,2019,2033,2039,2042,2067,2092,2141,2279,2306,2311,2357 'model-depend':1777 'model-optim':1286 'modif':2251 'modifi':2284 'mood':740 'ms':1376,1628,1664 'multi':1307 'multi-el':1306 'multipl':413,917 'mute':451,1013,1337 'my-preset':1614 'name':711,714,825,1769,1792,1911,2076 'nanobanana':237,269,291,332,341,435,486,976,1330,1511,1522,1958,1965,1986,2049,2108,2117 'nanobanana-pro':268,290,331,485,1510,1521 'narrat':1332 'natur':688,1318,1479,2177 'need':232 'neon':1340 'never':1582 'new':401,815,911,929,2369,2410 'no-prompt-upsampl':466,1083,1140,1820 'non':1102 'non-flux':1101 'none':1774,1783,1789,1801,1832,1860,1887,1895 'one':58 'openai':204,215,278,564,581,1528,1542,1555,1559,1847,1863,1874,1882,1885,1890,1893,1898 'openai-model':1873 'openai-qu':1892 'openai-s':580,1554,1884 'openrout':10,51,74,123,155,161,186,535,1477,1496,1722,1845,1871,2026 'optim':1288,2314 'option':199,472,860,1405 'orang':1213,1552 'order':775 'orient':2374 'origin':597,1417,1925 'original-prompt':596,1416,1924 'output':68,370,389,408,496,524,553,585,1365,1423,1572,1576,1667,1759,1762,1765,1771,1901,1904,1907,1913,1954,2036,2355 'output-dir':369,388,407,495,523,552,584,1758,1900 'output-fil':1764,1906 'overal':732 'overload':2045 'overrid':781,787,792,798,1038 'overwrit':2438 'paint':271 'palett':618,736,841,1020,1334,2193 'paramet':1398 'pars':1580 'part':1263 'pass':886 'path':864,1370,1466,1589,1592,1772,1794,1805,1914,2228 'pattern':756,2082 'payload':2334 'per':955,1243,2278 'per-model':954,1242,2277 'persist':968,2017 'photo':1154 'pick':631 'plain':183 'png':1563,1862 'poster':508 'precis':1313,1531,2195 'precise/pre-enhanced':1130 'prefer':173,832,1985,2176 'premium':17 'prepend':686,894 'prerequisit':108 'preset':19,57,65,376,386,606,607,616,628,633,641,644,651,695,696,708,713,718,777,803,816,875,878,942,1028,1039,1161,1256,1276,1353,1354,1379,1400,1608,1613,1616,1715,1727,1752,1788,1791,1830,2068,2072,2075,2202,2205,2265,2271 'preset-enhanc':1607 'preset-nam':712 'preset.defaults.aspect':788 'preset.defaults.model':782 'preset.defaults.size':793 'preset.system':799 'presets/default.json':700,819 'prevent':675 'price':2309 'prioriti':774 'pro':270,292,333,487,1512,1523,1966,1971,2109 'profil':198 'project':99,637,1268,2352 'prompt':25,32,363,379,399,418,439,448,456,461,468,479,507,540,571,598,654,668,674,768,796,872,910,928,965,989,998,1010,1037,1054,1059,1069,1085,1091,1095,1116,1119,1126,1131,1134,1142,1144,1178,1202,1204,1206,1212,1248,1279,1283,1289,1293,1347,1349,1385,1418,1421,1460,1501,1549,1600,1603,1605,1610,1677,1689,1710,1713,1811,1818,1822,1825,1829,1855,1926,1928,2060,2090,2095,2134,2138,2169,2275,2287,2347 'prompt-upsampl':1094,1810 'protocol':1150,2286 'python':361,377,397,416,437,459,477,505,532,561,592,870,908,926,996,1117,1132,1345,1412,1493,1539 'qualiti':37,241,247,287,309,339,589,705,1194,1408,1681,1894,1896,2053,2066,2151,2257,2260,2359 'quality-crit':1407,2150,2259 'quality-focus':704 'quick':353 'quiet':1000 'quot':1327 'random':1775 'rate':1653,2011 'ratio':475,490,725,785,789,835,1359,1360,1618,1726 'raw':1201,1205,1282,2088 'raw.githubusercontent.com':2450 'raw.githubusercontent.com/buildoak/fieldwork-skills/main/skills/image-gen/updates.md':2449 're':1443,1453 're-gener':1442,1452 'read':2419 'reason':289 'recommend':132 'red':365,600 'ref':405,415,423,427,884,915,922,933,937,950,1634,1800,2214 'refer':26,354,395,762,862,880,887,902,918,939,1705,1803,2221,2269,2291 'references/installation-guide.md':114,115 'refin':1431,1438,1447,1702,2059 'reflect':1228 'reject':1449 'render':257,328,620,749,750,846,1329 'repair':2331 'repeat':1806 'replac':572 'report':1942,2127,2129 'request':1198,1651,2147,2252 'requir':1558,1711,1844,1851,1856,1920,1927,2162,2302 'reserv':2148 'resourc':2226 'respons':2031 'retri':2015,2132 'return':1463 'reusabl':612 'review':8,38,222,588,1404,1923,1936,2057,2143,2258 'review.py':224,1666,1915 'rework':1459,2137 'richer':1071 'right':1699 'rim':1230 'role':985 'root':101 'rule':748,845 'run':151,2056,2160,2165 'safe':2379 'san':516 'sans-serif':515 'scale':282 'scene':381,402,419,440,463,874,912,930,992,1137,1309,1390 'schema':709,2272 'score':1426,1433,1439,1450,1675 'script':55,61,152,648,893,1383,1571,1575,1953,2001,2166,2237 'secret':140,167,174,179 'secret-manag':139 'see':113 'seed':1773,1776,2294 'select':227,658,1160,1255,1273,2312 'send':2087 'seri':21,385,1165,1266,1323,2198,2210,2223,2301 'serif':517 'set':824,967,1026,2156 'setup':71,2328 'shape':1179 'shell':197 'ship':2384 'short/simple':1115 'silent':1052,1107 'singl':901 'size':476,493,582,728,790,836,1361,1556,1621,1751,1886,1888 'skill':87,131,142,2367,2383,2407 'skill-image-gen' 'skill.md':95 'skip':2125 'skylin':481 'small':577 'snow':368,603 'sota':2274 'source-buildoak' 'space':1210 'spacesuit':1219 'speed':2051 'spend':1993 'stack':2298 'stay':2380 'stdout':1368,1579 'step':2289 'store':143 'strong':1688 'structur':24,673,1247,1331 'style':18,56,375,394,404,414,422,426,605,621,656,683,702,730,733,839,879,883,896,914,920,932,936,969,1172,1199,1338,1397,1633,1790,1799,1802,2213,2267,2283,2361 'style-ref':403,421,425,882,913,931,935,1798,2212 'style.reference':943 'subject':1171 'success':1585,1587,1644,1671 'suggest':1430,1446,1701 'sunset':483,546,1507 'support':31,1046,1058,2034 'switch':2018,2062,2140 'system':29,431,447,625,662,690,765,767,795,850,960,964,978,984,1009,1021,1031,1036,1040,1047,1320,1636,1828,1833 'system-prompt':446,794,963,1008,1035,1827 'tabbi':1214 'task':2240 'team':171 'technic':1680 'techniqu':958,2297 'tell':2397,2416 'templat':822,1241,2282 'test':869,873 'text':228,243,248,256,323,327,334,342,501,510,1325,1583,2100 'thing':757,761 'third':1700 'three':54,118 'tier':119 'time':1375,1627,1663,2327 'timeout':2040 'tip':1979 'tokyo':480 'tone':742,1019 'top':2024 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-tools' 'topic-automation' 'topic-browser-automation' 'topic-claude-code' 'topic-claude-skills' 'topic-codex' 'track':1941 'tradeoff':2308 'transfer':897 'transform':1280 'transpar':1565 'tree':579 'tri':2037,2046 'troubleshoot':112 'true':1588,1639,1672 'tune':1177 'type':296 'typic':1956 'typographi':518 'ultra':1235 'ultra-detail':1234 'updat':2375,2378,2381,2415,2442 'update-guide.md':2390,2420,2429 'updates.md':2387,2401,2427 'upsampl':33,457,469,1055,1060,1086,1096,1111,1143,1812,1819,1823,1826 'upstream':2441 'usag':2341 'use':169,881,962,1381,1638,1929,1947,2074,2097,2103,2110,2116,2142,2167,2183,2189,2217 'user':988,1437,1602,2089 'valu':843,2191 'var':2008 'variabl':128 'vault':130,137,159 'verbal':2184 'verdict':1427,1685 'verif':111 'via':9,50,212,223,1029,1937 'villag':1001 'visibl':1225 'vision':35,2255 'vision-bas':34,2254 'visual':246,609,866,890,1271,2303,2346,2358 'vivid':1692 'wait':2013 'walkthrough':107,2318 'want':1089 'watercolor':452,1014 'without':2077,2200 'word':263,1302 'work':629,1166,1324,1410,2153,2224 'workflow':952,1253,1472,2262,2293,2295 'world':512 'write':849 'x':2123 'your-api-key-her':78,190 'your-preset':876 'zero':40,1222","prices":[{"id":"c141a85b-e3a2-4740-aa71-e7c98049f4da","listingId":"bafedb8e-1ff0-4be0-8adc-ef154cec17ec","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"buildoak","category":"fieldwork-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:07:14.766Z"}],"sources":[{"listingId":"bafedb8e-1ff0-4be0-8adc-ef154cec17ec","source":"github","sourceId":"buildoak/fieldwork-skills/image-gen","sourceUrl":"https://github.com/buildoak/fieldwork-skills/tree/main/skills/image-gen","isPrimary":false,"firstSeenAt":"2026-04-18T23:07:14.766Z","lastSeenAt":"2026-04-22T19:06:33.055Z"}],"details":{"listingId":"bafedb8e-1ff0-4be0-8adc-ef154cec17ec","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"buildoak","slug":"image-gen","github":{"repo":"buildoak/fieldwork-skills","stars":15,"topics":["agent-skills","ai-agents","ai-tools","automation","browser-automation","claude-code","claude-skills","codex"],"license":"apache-2.0","html_url":"https://github.com/buildoak/fieldwork-skills","pushed_at":"2026-03-18T08:36:25Z","description":"Battle-tested skills for AI agents that do real work","skill_md_sha":"571ff7967ac9285909dc211f62ae1c2818821e2d","skill_md_path":"skills/image-gen/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/buildoak/fieldwork-skills/tree/main/skills/image-gen"},"layout":"multi","source":"github","category":"fieldwork-skills","frontmatter":{"name":"image-gen","description":"Image generation, editing, and review via OpenRouter API. Five models from budget to premium.\nStyle presets for series consistency, JSON structured prompts, reference image anchoring,\nsystem message support, prompt upsampling. Vision-based quality review loop. Zero dependencies\nbeyond Python stdlib. Use when: generate, create, draw, design, illustrate, edit,\nor modify images."},"skills_sh_url":"https://skills.sh/buildoak/fieldwork-skills/image-gen"},"updatedAt":"2026-04-22T19:06:33.055Z"}}