Best for
- Use when the user wants image generation or editing through the local fal.
moonlight-lupin/agent-skills/creative/image-studio/SKILL.md
Generate, edit and upscale AI images via fal.ai through a three-stage studio workflow — brainstorm a strong prompt with the user, prototype cheaply and iterate on feedback, then produce a finalised image. Use when the user wants image generation or editing through the local fal.ai helper workflow, including requests to "generate an image", "make an image/picture/illustration/graphic of…", "create an AI image", "edit/change this image", "make a variation", "upscale this", create a "production-rea
Decision brief
Turn an idea into a finished image through three deliberate stages — brainstorm → prototype cheaply → produce the final — using fal.ai. The point of the staging is cost and control: iterate cheaply on a fast model, lock the concept with the user, then spend on a quality model on…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/moonlight-lupin/agent-skills --skill "creative/image-studio"Inspect the Agent Skill "image-studio" from https://github.com/moonlight-lupin/agent-skills/blob/78aee69209dc94cb90d5bed4fa8e2f3bfbb993ee/creative/image-studio/SKILL.md at commit 78aee69209dc94cb90d5bed4fa8e2f3bfbb993ee. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Good output starts with a good prompt, so invest here before spending anything. Interview the user and build a structured prompt brief covering:
Generate with a cheap, fast text-to-image model so iteration is inexpensive, then refine on the user's feedback until they approve a prototype.
Once the user approves a prototype, confirm the go-ahead again. This is the main spend.
[ ] Scope is image generation/editing, not layout/chart/diagram/deck work.
Use this skill only when all of the following are true:
Permission review
The documentation asks the agent to run terminal commands or scripts.
python scripts/falgen.py generate \The documentation asks the agent to run terminal commands or scripts.
python scripts/falgen.py edit \The documentation asks the agent to create, modify, or delete local files.
Save the finished image at the work-folder root as `image_[slug]_final.png` or whatever exact filenameThe documentation includes network, browsing, or remote request actions.
download work for any endpoint.Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 93/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 16 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Turn an idea into a finished image through three deliberate stages — brainstorm → prototype cheaply → produce the final — using fal.ai. The point of the staging is cost and control: iterate cheaply on a fast model, lock the concept with the user, then spend on a quality model only once, on the agreed image.
This skill generates files locally for the user to review and use. It never posts, publishes, or sends anything as final brand collateral.
Use this skill only when all of the following are true:
Do not use this skill for:
The workflow depends on whether you are creating an image, changing an existing one, or cleaning up an existing one — they do not use the same steps:
fal-ai/nano-banana/edit (a faithful preview) rather than on Kontext dev. The "prototype" is the
agreed prompt, not an image.references/cleanup-checklist.md and
keep every real feature exactly. Works for any subject — interiors, portraits, products, food,
landscapes. One checklist-driven pass usually suffices. See the Clean-up section below.Stages 1–3 describe Path A in full; Paths B and C reuse Stage 1 (brainstorm/confirm) then go straight to Stage 3 (quality-edit the original), skipping the Stage-2 prototype.
Generating an image sends the prompt to fal.ai. Editing, upscaling, or background removal also sends the image you provide to fal.ai. fal.ai is a third-party US service, and result images are downloaded from its CDN. That is external data egress.
Before any API call:
scripts/falgen.py exists, dependencies are installed, FAL_KEY is set, and the working
directory is writable.falgen.py; do not infer filenames from examples.Never feed confidential or sensitive imagery or documents to fal.ai — e.g. a person's photo, confidential report, deal materials, financial documents, investor materials, tenant materials, valuation materials, or anything under NDA. If the user asks to edit something sensitive, stop and flag the egress issue rather than uploading it.
Brainstorming in Stage 1 is pure chat and has no egress, so you can always draft the prompt first and confirm the send afterwards.
Setup needed: a fal.ai account with billing, and the FAL_KEY — either the environment variable,
or just saved in a text file in the working folder (any filename, e.g. fal key.txt). The helper
finds the key automatically — env var first, then any small text file in the working folder (a
FAL_KEY=your-key line, or a raw key matching fal's id:secret shape), then the home dir (only
files whose name mentions fal/key/api/env, and only an explicit FAL_KEY=… line — bare tokens are
never taken from home, so other services' credentials can't be picked up). So don't ask the user
for a key before checking; only prompt if none is found. It uses the fal-client
package (pip install fal-client requests). If no key is found the helper fails with a clear message —
generation cannot proceed without it, but Stage 1 still works. (Keep any key file local; never commit it.)
Good output starts with a good prompt, so invest here before spending anything. Interview the user and build a structured prompt brief covering:
Offer two or three distinct prompt directions rather than one, so the user can react to options. Save
the agreed brief to _workings/ (for example, _workings/prompt-brief_[slug].md) so the run is
auditable. Keep prompts free of confidential detail.
For Paths B and C this is the step that replaces prototyping, so confirm the prompt with the user before the first paid call. When the subject is people or an overlay onto a real scene, two craft notes:
Generate with a cheap, fast text-to-image model so iteration is inexpensive, then refine on the user's feedback until they approve a prototype.
First render — text-to-image with FLUX schnell:
python scripts/falgen.py generate \
--prompt "[the agreed prompt]" \
--aspect 16:9 --num 2 \
--run-log _workings/run-log_[slug].md \
--out-dir _workings --name image_[slug]_v1
--num 2 gives the user a couple of variations to choose from. The helper may save multiple files
such as image_[slug]_v1_1.png and image_[slug]_v1_2.png; always use the exact saved paths printed
by the helper.
On feedback, choose the cheaper move:
generate as the next
version (--name image_[slug]_v2, etc.).edit.The Stage-2 default editor is FLUX Kontext [dev] (fal-ai/flux-kontext/dev). It is a cheap
instruction editor billed per compute-second; fal does not return exact runtime locally, so the helper
flags the cost as time-billed and the fal dashboard remains the source of truth. Kontext preserves the
input image's dimensions and changes only what you name.
python scripts/falgen.py edit \
--prompt "make the sky warmer and add negative space top-right" \
--image _workings/[actual_saved_prototype_path].png \
--run-log _workings/run-log_[slug].md \
--out-dir _workings --name image_[slug]_v3
Do not pass --aspect to Kontext edits; Kontext keeps the source dimensions. Kontext accepts a single
image. If multiple reference images are required, use a model that supports image_urls, such as
fal-ai/nano-banana/edit, and confirm the cost trade-off.
Save every iteration to _workings/ with an incrementing version so nothing is lost. Loop until the
user says "that's the one".
Why two paths: a prompt re-roll explores fresh compositions; an edit holds the composition the user already likes and changes only what they named. Pick the one that matches the feedback.
Once the user approves a prototype, confirm the go-ahead again. This is the main spend.
Render the agreed concept at quality and at the resolution the user actually needs. Usually, getting the final at target size removes the need for a separate upscale.
Confirm the resolution — 2K or 4K? It changes the price, so ask:
references/fal-models.md). Good for
large-format/close-viewed print (posters, banners, exhibition panels) or future-proofing a reusable
hero. Not worth it for screen/social, which downscale anyway.Pass it via --arg resolution=2K (or 4K); the helper reflects the 4K surcharge in the reported cost.
Quality render at target resolution — edit the approved prototype with Nano Banana Pro
(fal-ai/nano-banana-pro/edit, flat per image) to stay faithful to it, asking for the output size
up front via resolution (up to 4K):
python scripts/falgen.py edit \
--prompt "[full locked prompt]. Use the supplied prototype as the COMPOSITION reference only. Reproduce at high fidelity — keep the subject, framing, palette and mood — and CORRECT the prototype's generative flaws: render natural anatomy (fix malformed hands, fingers and limbs; no extra or missing fingers/limbs), fix distorted faces and eyes, straighten warped objects and lines, remove artefacts. Name the specific ones you see, e.g. 'the left hand has six fingers — render a natural five-fingered hand'. Crisp clean edges, photorealistic." \
--image _workings/[actual_approved_prototype_path].png \
--model fal-ai/nano-banana-pro/edit --aspect 16:9 \
--arg resolution=4K \
--run-log _workings/run-log_[slug].md \
--out-dir . --name image_[slug]_final
The final prompt must include the full locked prompt, not just a generic enhancement instruction — and it must name the flaws to fix. "Improve/upscale this" does not fix them: Nano Banana Pro won't correct a defect it isn't told about, and telling it to "preserve everything" locks the defect in. Preserve the concept (subject, framing, palette, mood); fix the execution (anatomy, warped objects, artefacts). Treat the prototype as a composition reference, not a substitute for the prompt brief. If a flaw survives, re-edit just that region, not the whole image.
Editing an existing photo (Path B/C)? Anchor on the ORIGINAL, not just a prototype. Cheap
prototype models drift on detail, so feed Nano Banana Pro the original photo (the source of
truth for the real scene) and, where you made one, the approved prototype — edit accepts
multiple --image (sent as image_urls). Pass the original first, then the prototype, and
say which is which in the prompt:
python scripts/falgen.py edit \
--prompt "Use the FIRST image as the true scene — keep its room, materials, lighting and layout exactly — and the SECOND as the intended change. Produce the change at high fidelity." \
--image _workings/[original_photo].jpg \
--image _workings/[approved_prototype].png \
--model fal-ai/nano-banana-pro/edit --arg resolution=2K \
--run-log _workings/run-log_[slug].md \
--out-dir . --name image_[slug]_final
Or, for a fresh high-quality render from the locked prompt, use:
python scripts/falgen.py generate \
--prompt "[full locked prompt]" \
--model fal-ai/nano-banana-pro \
--aspect 16:9 --arg resolution=4K \
--run-log _workings/run-log_[slug].md \
--out-dir . --name image_[slug]_final
Upscale only if needed — a separate upscale is optional, for when you must exceed 4K or enlarge
an external image. The default upscaler is Recraft Crisp (fal-ai/recraft/upscale/crisp), a
faithful flat-cost upscaler:
python scripts/falgen.py upscale \
--image _workings/[actual_image_to_upscale].png \
--run-log _workings/run-log_[slug].md \
--out-dir . --name image_[slug]_final
For a creative enlargement that adds detail and costs far more, opt in with
--model fal-ai/clarity-upscaler.
Save the finished image at the work-folder root as image_[slug]_final.png or whatever exact filename
the helper prints. Tell the user the file path and remind them it is a draft asset for their review,
not published material.
Turn an amateur / phone / messaging-app shot into a professional-looking image. It reuses Stage 3's
mechanics — quality-edit the original with nano-banana-pro/edit, no prototype — but the intent is
faithful correction, not change, and the method is a checklist, not iteration. It works for
any subject — interiors, portraits, products, food, landscapes — so first check the subject-types
table in references/cleanup-checklist.md to learn what "faithful" means for this photo.
references/cleanup-checklist.md — for each row, check the "tell-tale signs" against the
photo. Keep only rows where you can name the sign you see. Drop every issue the photo does not
have — including a fix for a problem that isn't there is an active transformation that changes a
correct image (see "What NOT to do" in the checklist).--aspect unless recropping).
Iterate only on a specific residual issue, not the whole image.Hold the line on honesty:
The helper always writes a machine-readable cost/session log to ./_falgen-costs.jsonl. Newer entries
include the command, model, redacted arguments, input image references, output paths, dimensions, seed,
cost basis, and estimated cost. Temporary uploaded/CDN image URLs are omitted from the log.
Pass --run-log _workings/run-log_[slug].md on generation/edit/upscale/removebg calls to append a
human-readable markdown audit log covering:
This makes the result auditable and easier to reproduce. If you do not pass --run-log, use
python scripts/falgen.py costs plus the JSONL file as the audit trail.
The helper defaults to sensible models per stage; override with --model [endpoint-id]. The current
verified endpoint IDs, their stage, and approximate cost live in references/fal-models.md. fal.ai's
catalogue changes — if a model ID errors, check that reference and the fal.ai model gallery rather
than guessing. Anything in that file marked (verify) has not been confirmed against the live gallery
in this build; confirm before relying on it.
Stick with the proven defaults unless the result is genuinely unsatisfactory. They are chosen deliberately: schnell for cheap prototyping, Kontext dev for cheap faithful edits, Nano Banana Pro for the quality final at up to 4K — a tested balance of quality, cost, and predictability. The first move when a result disappoints is usually a better prompt or a targeted edit, not a model hunt.
Only when the defaults still fall short — for example, a model genuinely cannot render the subject,
style, or required in-image text — switch models. Any stage takes --model; the registry lists the
verified alternatives.
--names
(cmp_schnell, cmp_fluxdev, etc.), show them side by side, and let the live per-model cost line
plus costs summary frame the quality-vs-cost trade-off for the user. Keep the bake-off small;
each call spends real money.--aspect → image_size
for FLUX / aspect_ratio for nano-banana / skipped for Kontext; edits send image_urls except the
Kontext family's single image_url). For an endpoint the helper does not know, check its API page
and pass anything the flags do not map via --arg key=value or --arg-json '{...}'. Live cost +
download work for any endpoint.Land back on a default once the experiment is done, unless the alternative is clearly and repeatably better for that use case.
scripts/falgen.pyOne script, five subcommands. It reads FAL_KEY from the environment, uploads any local --image to
fal storage automatically, calls the model via fal_client.subscribe, downloads the result image(s)
locally, and prints the saved paths plus an approximate cost. Run python scripts/falgen.py -h or
python scripts/falgen.py [subcommand] -h for all options.
Key flags:
generate — --prompt (required), --model, --aspect, --num, --seed, --out-dir, --name.edit — --prompt (required), --image (repeatable), --model, --aspect, --num, --seed,
--out-dir, --name.upscale — --image (required), --model, --factor, --out-dir, --name.removebg — --image (required), --model, --out-dir, --name. Cuts the subject out to a
transparent PNG. A utility for compositing into a deck/social tile, not part of the main
generate→edit→upscale flow.costs — print the running cost tally for the session, with --reset to clear it.recommend — the recommended default model per stage, with live pricing. Read-only, no spend.search "term" — search the live fal catalogue (--category, --limit); each hit shown with
its live price, category and licence. Read-only. Find a model the defaults don't cover — then still
prefer the default unless it genuinely falls short.--arg key=value — escape hatch on any generation/edit/upscale/removebg subcommand to pass a raw
model parameter the flags do not cover. Values may be JSON scalars, arrays, or objects, e.g.
--arg image_size='{"width":1200,"height":800}'.--arg-json '{...}' — pass several raw model parameters as one JSON object, useful for nested
options.--run-log path.md — append a human-readable markdown run log for auditability.--verbose — stream the model's own progress logs. Off by default.If a call fails because the fal balance is exhausted, the helper detects it and prints clear guidance rather than a raw stack trace.
A worked end-to-end run is in examples/example-run.md.
The generation response carries no cost field, so on every run falgen.py queries fal's live pricing
API and computes the cost from the actual output resolution or output count where possible, then prints
the step cost and a running session total (appended to ./_falgen-costs.jsonl). Run:
python scripts/falgen.py costs
to print the full breakdown at the end of a chain, and tell the user the total. Watch the units in
references/fal-models.md:
Balance is shown only if a fal Admin API key is set in FAL_ADMIN_KEY; the normal FAL_KEY cannot
read billing and may receive HTTP 403. Without an admin key, balance is skipped with a one-line note.
Give the user the estimated spend per step plus the session total; offer a live balance only if they
add an admin key.
_workings/;
superseded versions in _superseded/.Prompts and any reference images sent to fal.ai leave the user's control to a third-party tool, so follow a PII/data-egress rule: do not send confidential or sensitive content to fal.ai. Keep real source and output files on the local machine. When in doubt, do not egress; ask the user first.
falgen.py.--aspect
for Kontext edits.--num > 1 to a Kontext model.--arg-json.FAL_KEY is not enough for billing balance display._workings/._workings/.--run-log _workings/run-log_[slug].md used, or JSONL cost/session log reviewed.falgen.py costs.Frequently asked questions
Turn an idea into a finished image through three deliberate stages — brainstorm → prototype cheaply → produce the final — using fal.ai. The point of the staging is cost and control: iterate cheaply on a fast model, lock the concept with the user, then spend on a quality model on…
The source record exposes this install command: npx skills add https://github.com/moonlight-lupin/agent-skills --skill "creative/image-studio". Inspect the command and pinned source before running it.
Static rules flagged exec-script, write-files, network in the source; the page lists the matching lines and excerpts.
Alternatives
vellum-ai/vellum-assistant
Create images from a text description, or edit photos and graphics the user provides (remove backgrounds or watermarks, retouch, restyle, in-paint). Can produce multiple variants when the user wants options to choose from.
garrytan/gbrain
End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.
alirezarezvani/claude-skills
App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist
dotnet/skills
Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing