Kill the subscription, keep the models
You are paying a flat monthly fee for models that will take your money by the image. Here is the one command I use instead, and the four rules that stop it running up a bill.
Open the last invoice from whatever generation platform you pay for. Then open the folder where the work you actually kept is sitting, and count the files. Fee divided by files is what one usable image really cost you. It is almost never the number on the pricing page.
The bill nobody divides
Higgsfield, Freepik, Krea, Leonardo. They sell the same shape of deal: a monthly fee, a bucket of credits, a pleasant interface, and a set of models somebody else picked for you. It works, which is why people pay for it.
The trouble shows up in month two. Credits reset whether you spent them or not. The model you wanted turns out to sit one tier up. And the models themselves, the only part of the deal with real value in it, belong to nobody. Nano Banana, GPT Image, Kling, Veo, Seedance: the same weights sit behind public APIs that bill by the image or by the second.
Whether the platform is any good is a separate argument. This one is arithmetic. Does a flat fee beat what the same work costs per call? That depends on volume, and volume is the number nobody measures.
- $49 monthly plan
- Per call, at $0.03 a draft
What you pay
- 0
- 400
- 800
- 1,200
- 1,600
- 2,000
Images finished in a month
At three cents a draft, a $49 plan does not break even until roughly 1,600 images in a month. Put your own fee and your own average in and see where you land. Most people making brand assets and thumbnails are somewhere near forty.
Video moves the line a long way. Finished clips run twenty to thirty-five cents a second, so ten seconds costs two to three and a half dollars, and the same $49 buys you around twenty of them. If you ship a clip a day, a plan can genuinely be the cheaper option. If you ship one a week, it is not, and the guardrails further down this page matter more than any of the routing does.
Do the division once, before the next renewal date. It answers the question faster than anybody's opinion will.
What you build instead
One command. You type generate a thumbnail for Tuesday's video and your agent runs the same four steps every time.
- 01
Route
Pick the model for the job, then the cheapest provider that runs it properly. Open that model's recipe file.
- 02
Prep refs
Load the real reference files: logos, faces, style shots. A logo described in words comes back wrong every time.
- 03
Generate
Call the API the way the recipe says. Poll if the job is asynchronous. Download before the link expires.
- 04
Log
Drop a small JSON file next to the output with the prompt, the model and the settings that made it.
A skill is a folder of Markdown your agent reads before it acts, so all four steps above are written down in plain English rather than coded. It works in Claude Code and in anything else that reads skill files.
Everything on your disk fits in one screen:
- your-workspace/
- .claude/skills/generate/
- SKILL.mdthe brain: routing and rules
- models/
- image-model.mdone recipe per model
- video-model.md
- generations/every output lands here, flat
- refs/logos, faces, style shots
- .envthree API keys
Two decisions in that tree are worth defending. One folder for output, with no subfolders, means any gallery or script can read your whole library without setup, and there is no filing scheme you have to remember at two in the morning. One Markdown file per model means that when a better model ships next month you write one file and the skill has learned it. Nothing else changes.
Three keys, one sitting
You do not need an account with every lab. Aggregators host most of the catalogue behind one key and one bill, and three of them cover nearly every image and video model worth calling.
| Provider | Key in .env | Why it earns a slot |
|---|---|---|
| kie.ai | KIE_API_KEY | Usually the cheapest route for popular models. Also turns a local image into a public URL, which several APIs insist on. |
| fal.ai | FAL_KEY | Fast, a large catalogue, and documentation you can follow. First fallback. |
| wavespeed.ai | WAVESPEED_API_KEY | Broad catalogue. Earns its place when the other two are missing a model or refuse a job. |
KIE_API_KEY=your_key_here
FAL_KEY=your_key_here
WAVESPEED_API_KEY=your_key_hereRough prices, so you know what you are spending before you spend it. They move fast, so check the provider's own page before you lean on one.
| Job | Ballpark | What it is for |
|---|---|---|
| Draft image, cheap model | $0.01 to $0.03 | Your default. Iterate here without thinking about it. |
| Quality image, top model | $0.05 to $0.15 | Finals only, after you have picked a draft you like. |
| Video, per second | $0.20 to $0.35 | Ten seconds runs $2 to $3.50. This is why the cost gate exists. |
The brain: one Markdown file
Create .claude/skills/generate/SKILL.md. The frontmatter tells the agent when to reach for the skill. The body tells it how to behave once it has. Copy this, swap in your own models and your own folder path.
---
name: generate
description: Generate images and videos via AI model APIs. Triggers on
/generate, generate image, generate video, create image, thumbnail,
animate.
---
# /generate
## Models
| Task | Default model | Recipe |
|-----------------|-----------------------|-------------------------|
| Image (default) | your cheap image model| models/image-model.md |
| Image (quality) | your hero image model | models/image-model-pro.md |
| Video (default) | your video model | models/video-model.md |
Read the recipe file before every generation.
## Provider routing
1. Default to the LOWEST COST provider that runs the model well.
2. If the cheapest route lacks the model, fails auth, or errors,
fall back to the next provider.
3. Never hide a provider swap. Say which route ran and why.
## Output
- Save every file FLAT into my generations folder: [your path here]
- No subfolders. Reference images live in generations/refs/
- Naming: {project}_{description}_{timestamp}.{ext}
## Rules
- Quote the cost and wait for my explicit go before any paid
video run. One approval = one run.
- Draft on the cheap image model first. Only rerun on a quality
model when I pick a favourite.
- Never describe a logo or face in text. Pass the real image
file as a reference. If it is missing, stop and ask me for it.
- Run multiple generations one at a time to avoid rate limits.
- After every save, write the sidecar log.The description line decides whether any of this ever runs. It is how the agent works out that your sentence is a job for this skill, so list the phrases you type in real life, not the tidy ones. If you say make me a thumbnail out loud, put thumbnail in the line.
Fill in the folder path and then leave it alone. The path is different for everybody and it is the one value the gallery, the logs and the skill all have to agree on.
The Rules block is where the money is. Six lines of plain English that the agent reads on every single run. They do the job a config file would do in a normal tool, except you can read them out loud to somebody.
One file per model
Each model gets its own Markdown file in models/ holding everything needed to call it: endpoint, authentication, request shape, response handling. Open the provider's docs page for that model and fill this in. It takes about ten minutes, once, per model.
# Model Name
One line on what this model is best at and when to pick it.
| Field | Value |
|-----------|------------------------------------|
| Model ID | the-exact-model-id |
| Provider | Kie AI / fal.ai / WaveSpeed AI |
| Method | Sync (instant reply) or Async |
| Type | Image or Video |
| API key | .env -> KEY_NAME |
| Docs | link to the provider's model page |
| Cost | rough price per image / per second |
## Endpoint
POST https://...
## Request format
The exact JSON body from the docs: prompt, aspect ratio, resolution,
and the reference-image fields.
## Response handling
Where the file lives in the reply: a base64 field, or a URL to
download. For async jobs, the status endpoint and the field that
says it finished.
## Notes
Rate limits, maximum sizes, content rules, upload quirks.The field that trips people up is Method. Models answer in one of two ways, and they do not look alike at all.
Sync
GPT Image 2, Nano Banana, Seedance
- Send the request
- Wait
- Picture arrives in the reply
- Save it
Async
Kling, Veo
- Send the request
- Reply is a job ID
- Ask again every 10s
- Status says done, with a URL
- Download before it expires
- Save it
Write which one a model uses into its recipe. Getting it backwards is the usual reason a first attempt looks like it hung: the agent sits waiting for a picture in a reply that only ever held a job number. And download the moment the job finishes, because result URLs often stop working within hours.
Authentication is the other per-provider detail. Get it right once and every model on that provider follows the same pattern.
# Google AI Studio: the key goes in the URL
POST .../models/{model-id}:generateContent?key={GOOGLE_KEY}
# fal.ai: header, with the word Key
POST https://fal.run/{model-id}
Authorization: Key {FAL_KEY}
# Kie AI: header, with the word Bearer
POST https://api.kie.ai/api/v1/jobs/createTask
Authorization: Bearer {KIE_KEY}Five models worth wiring
Two for images, three for video. Between them they cover almost everything a working designer gets asked for.
| Model | Best at | ID and rough cost |
|---|---|---|
| Nano Banana 2 | Everyday images. Cheap, quick, very good with reference images. | gemini-3.1-flash-image-preview. Lite runs about $0.034 per 1K image. |
| GPT Image 2 | Text inside images: signs, posters, menus, packaging, UI mockups. | openai/gpt-image-2. Around $0.05 an image at medium. |
| Kling 3.0 | General video. A sensible default with good motion and fair pricing. | kling-3.0/video. 720p or 1080p, 3 to 15 seconds. |
| Veo 3.1 | Higher quality video from a start frame. Slower. | veo-3.1-generate-preview. 8-second clips at 720p. |
| Seedance 2.0 Fast | Reference to video. Feed it up to nine images and animate them. | bytedance/seedance-2.0/fast/reference-to-video. $0.24 a second at 720p, so five seconds is about $1.21. |
Do not wire all five today. Start with the cheap image model and one video model: they handle most of what you will ask for, and between them they teach you both call patterns.
Add GPT Image 2 the first time you need readable words inside a picture. Add Veo when Kling's motion is not good enough for a hero shot. Seedance is the one to reach for when the job is animating references you already have rather than starting from a sentence.
Always take the cheap door
The same model is often available on three providers at three prices. Left alone, an agent will call whichever one it read about most recently. Ten lines in the skill turn that into a rule.
Which provider runs this model for the least money?
- Kie AIUsually cheapest. Try it first.
- fal.aiMissing the model, bad auth, or an error? Go here.
- WaveSpeed AIStill stuck? Last stop before it tells you it failed.
The third line of that rule matters as much as the first two: never hide a swap. If the job ran somewhere other than where you expected, the agent says so and says why. Silent fallbacks are how a bill grows without anybody being able to explain it later.
Four rules that stop the bill
These live in the skill because the agent reads them on every run. Each one closes a failure that will otherwise happen to you at least once.
Quote before video
Video is the expensive lane by an order of magnitude. Before it spends anything, the agent states the model, the length, the resolution and the expected cost, then stops and waits. Quoting is not approval, and one approval covers exactly one run.
Draft cheap, finish pretty
Iterate on the one-cent model until you have a favourite. Only then does the same prompt run on the expensive one. Paying premium prices for images you were always going to throw away is the single biggest waste in this workflow.
Real references, never described
A logo described in words comes back with the wrong shape, the wrong colour and details nobody asked for. Keep the actual files in generations/refs/ and pass them into the call. If one is missing, the agent stops and asks rather than improvising.
One flat folder
Every output in the same place, no subfolders. Sorting feels tidy for a week and then becomes a filing scheme you have to remember, and it breaks every tool that wanted to read the library in one pass.
Never lose a prompt again
After every save, the agent writes a small JSON file beside the media, with the same basename. That matching basename is the whole contract. It is enough for any tool you build later, or for you and a folder search on a deadline, to work out exactly how a file was made.
{
"model": "your-image-model",
"prompt": "the full text prompt that was sent to the API",
"refs": ["refs/logo.png", "refs/headshot.jpg"],
"params": { "aspect": "16:9", "size": "2K" },
"created": "2026-07-30T09:41:00Z"
}The guide this came from marks logging as optional. It is the part I would keep if I had to throw the rest away. Six months in, the prompt that produced the one image a client keeps asking you to match is worth more than the image.
The wall
The flat folder pays off here. Because everything lands in one place, a gallery never needs updating and new work turns up on it by itself. Paste this at your agent and you get one HTML file you open by double-clicking.
build me a single web page that shows every image and video my ai generates, all in one place, like a bento wall.
- it reads one folder on my computer called generations and shows everything sitting in it, newest at the top
- lay it out as a masonry wall, tiles keep their own shape, nothing gets cropped or squashed, rounded cards with even gaps, 4 columns wide and fewer as the window gets smaller
- videos start playing quietly when i hover over them and stop when i move away, images just sit there
- click any tile and it opens up big in the middle of the screen, click outside to close
- no search, no filters, no tabs, no side panels, just the wall of everything
keep it to one file so it runs by opening it, and make it feel like a proper finished gallery, not a rough draft.
when the page is done, add a line to my CLAUDE md so that from now on anything the /generate skill makes gets saved straight into that same generations folder, so it turns up on this page automatically. don't make the page pop open every time, just save the file there.The last paragraph of that prompt is the important one. It writes the folder rule into the agent's memory file, so the skill and the wall stay pointed at the same place long after you have forgotten you set it up.
Your first twenty minutes
- Sign up at kie.ai and fal.ai. Put both keys in a
.envfile. Two minutes. - Create
.claude/skills/generate/SKILL.mdand paste the starter above. Put your real folder path in the Output section. Five minutes. - Write one recipe file for a cheap image model, from that model's docs page. Ten minutes, and it is the only slow part.
- Type
generate a thumbnail of a black cat on a red sofa. Watch which provider it picked and what it says the run cost. - Add a video model tomorrow, once the image lane has proved itself.
The good-looking picture was never the hard part. Any of these models will hand you one. What a subscription is actually selling you is the system around the picture, and that system is four steps, one Markdown file and six rules you can read in a minute.
Build it on a Sunday. Then go and cancel something.