From lich-skills
Generates or edits images using Google's Nano Banana 2 (gemini-3.1-flash-image-preview). Supports text-to-image, image editing, and 512/1K/2K/4K resolutions via Python script.
npx claudepluginhub lichamnesia/lich-skills --plugin lich-skillsThis skill uses the workspace's default tool permissions.
Text-to-image and image edit via Google's **Nano Banana 2** model, aka `gemini-3.1-flash-image-preview`. Fast, cheap, high-quality. Returns PNG.
Generates images from text prompts and edits existing images using Google's Gemini 3 Pro Image API. Supports text-to-image, image-to-image editing, and 1K/2K/4K resolutions. Auto-activates on generate/edit image requests.
Generates or edits images using Google Gemini API via nanobanana.py Python script. Supports prompts, aspect ratios like 9:16, models such as gemini-3.1-flash, and resolutions up to 4K.
Generates images from text prompts or edits existing images using Nano Banana Pro (Gemini 3 Pro Image API) via Python scripts. Supports text-to-image, image-to-image at 1K/2K/4K resolutions; run with uv.
Share bugs, ideas, or general feedback.
Text-to-image and image edit via Google's Nano Banana 2 model, aka gemini-3.1-flash-image-preview. Fast, cheap, high-quality. Returns PNG.
Get a Gemini API key: https://aistudio.google.com/app/apikey
Export it:
export GEMINI_API_KEY="YOUR_KEY_HERE"
# or
export GOOGLE_API_KEY="YOUR_KEY_HERE"
Install uv if missing:
command -v uv || curl -LsSf https://astral.sh/uv/install.sh | sh
First run auto-installs google-genai and pillow via uv's inline script deps.
uv run ~/.claude/skills/lich-skills/skills/nano-banana/scripts/generate_image.py \
--prompt "A cinematic rainy Tokyo alley, neon reflections, 35mm, low angle" \
--filename "tokyo-alley.png" \
--resolution 1K
Output is saved to tokyo-alley.png in the current directory unless the filename is absolute.
Pass an input image with --input-image. The model sees the image + your instruction.
uv run .../generate_image.py \
--prompt "Remove the crowd behind the subject. Keep framing and grading unchanged." \
--filename "cleaned.png" \
--input-image "./portrait.png" \
--resolution 2K
When editing, the script auto-matches output resolution to the input's dimensions unless you explicitly pass --resolution.
| Flag | Default | Purpose |
|---|---|---|
--prompt, -p | required | Image description or edit instruction |
--filename, -f | required | Output path (PNG) |
--input-image, -i | — | Source image for editing |
--resolution, -r | 1K | One of 512, 1K, 2K, 4K |
--api-key, -k | env | Overrides GEMINI_API_KEY / GOOGLE_API_KEY |
--model, -m | gemini-3.1-flash-image-preview | Rarely needed |
Map loose user language to a resolution flag:
| User says | Use |
|---|---|
| (nothing) | 1K |
| "small", "thumbnail", "quick draft" | 512 |
| "normal", "medium" | 1K |
| "high quality", "large" | 2K |
| "4k", "print", "wallpaper" | 4K |
Subject: <subject>.
Style: <photo | illustration | 3D | painting | pixel art | ...>.
Composition: <shot type, angle>.
Lighting: <lighting description>.
Background: <background>.
Avoid: <what should NOT be in the image>.
Change only: <the specific edit>.
Keep subject, framing, lighting, palette, text, and overall style unchanged.
Being explicit about what to keep is the difference between a clean edit and a total re-render.
--api-key → GEMINI_API_KEY → GOOGLE_API_KEYcommand -v uv
test -n "$GEMINI_API_KEY" || test -n "$GOOGLE_API_KEY"
# If editing:
test -f ./input.png
| Error | Fix |
|---|---|
Error: No API key provided. | Export GEMINI_API_KEY or pass --api-key |
Error loading input image: | Bad path or unreadable file |
Error: No image was generated in the response. | Prompt too vague or unsafe — rewrite |
403 / quota | Wrong key, region-locked, or over quota |
$GEMINI_API_KEY or $GOOGLE_API_KEY set in env, not in filesgitleaks detect --source . clean