Same frame
Skill sjh9714/same-frame
Re-render an image the user already has under new light, a new palette, or a new medium, while the composition stays exactly where it was. Use when asked to relight a photo, recolour an illustration, or convert something to gouache, cyanotype, blueprint, or another medium without changing its contents. Also use when asked to remove or add an object in an image, or to put the same character in a new scene — both are measured failures and this skill refuses them with evidence rather than burning the user's money.From its SKILL.md
npx -y skills add sjh9714/same-frameAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 19 days oldThe repository was created 19 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.5 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
same-frame
Geometry is locked. Material is not.
Krea 2 image-to-image holds composition, position and spacing very reliably, and will not add or remove objects. What it does not hold is what things are made of. Anything that forces the model to re-derive how a surface behaves — hard light, a medium that needs different marks — can quietly swap the material while every edge stays exactly where it was.
Every recipe and refusal below comes from real generations with the seeds recorded, and each recipe was re-run against a source it was not derived from. Two of the five only work on the kind of source they came from. Their tier says so.
Before doing anything: classify the request
Read what the user is actually asking for and put it in one of three buckets.
Bucket 1 — rendering change. Proceed. Light direction, light colour, number of light sources, palette, medium, rendering style. The set of objects in the frame is identical before and after.
Bucket 2 — content change. Refuse. The user wants something in the frame that is not there, or wants something gone that is. Do not run it. Do not try a higher strength. Go to Refusals below.
Bucket 3 — identity carry. Refuse. The user wants a specific person or character to appear in a new image. Go to Refusals below.
If a request mixes buckets ("relight this and remove the powerline"), do the bucket-1 half, and tell the user the other half needs a different tool. Do not silently drop it.
Running a recipe
- Read
recipes.json. Pick the recipe whosechangesfield matches the request. - Check its
tieragainst the user's source before running.holdsis safe.partialandnarrowcarry ageneralisation.use_when— if the user's image does not match it, say so first.relight-single-sourceon an outdoor photo andmedium-cyanotypeon a photograph both come back looking almost right and missing the thing that was asked for, which is worse than an obvious failure. - Fill the
slots. Every slot is there because leaving it vague measurably degraded the result — name the concrete thing that must not move. - Use the recipe's
strengthverbatim. These are not starting points, they are the values that produced the paired image inexamples/. The working band is 0.50–0.60 and it is narrow. - Run it:
python3 same_frame.py --image <path-or-url> --recipe <id> \
--slot <name>="..." --slot <name>="..." \
--out result.png
Pass every slot the recipe declares. The script refuses to run with one missing
rather than filling it in for you, and it prints which ones it wanted. Add
--dry-run to see the assembled prompt without spending anything.
Or with a prompt you wrote yourself, still inside the band:
python3 same_frame.py --image ref.png --prompt "..." --strength 0.55 --out result.png
FAL_KEY is read from a .env file next to the script, or from the environment. Roughly $0.008 per megapixel, so a 1024×1024 edit is about eight tenths of a cent.
Writing your own prompt for a rendering change
Two things separate the kept edits from the cut ones.
Name what must not move, explicitly. Not "keep the composition" — say "every terrace contour stays in exactly the same position", "the rock placement, horizon line and framing identical", "every component in exactly the same position and spacing". The kept edits all did this. The phrasing is doing real work.
Say the change is the only change. "only the medium changes", "Change only the time and mood". Without it the model treats your instruction as a suggestion and drifts elsewhere.
Concrete beats atmospheric. Three named colours ("deep violet water, salmon sky, warm cream foam") hold. "Make it moodier" does not.
Check the source can make the marks you are asking for. A medium change only lands if the source already makes that kind of mark. Gouache transfers onto a photograph because both are continuous tone — the model is changing surface, not structure. medium-cyanotype run against a photograph returns a blue-toned photograph with the rocks in exactly the right places and no line work at all (examples/limit-cyanotype-on-photo.webp, seed 2065751023). Outlines are content a photograph does not contain, and the model will not invent them, for the same reason it will not invent an object you asked it to add.
So: continuous tone → continuous tone works. Anything → line work needs a line-art source. If the user wants a blueprint from a photo, say that up front rather than spending the request. The reverse direction is fine — gouache on a line-art diagram is the cleanest result in the repo.
Check the lighting configuration is physically available to the scene. "One light source at the far end, everything nearer falling into shadow" works in a corridor and does nothing outdoors, where the sky is the light source (examples/limit-single-source-outdoors.webp, seed 1114110846). The composition held and the instruction simply did not land.
After a run, check the material and not just the composition
The composition will almost always be right, and that is the trap. relight-hard-sun on wet rice terraces held every contour and returned dry stone amphitheatre steps — the water and the vegetation were gone (examples/limit-relight-material-drift.webp, seed 232270180).
When you show the user a result, look at what things are made of. If the material moved, say so rather than presenting a correct-looking composition as a success. The higher the demand on surface behaviour — hard light most of all — the more likely this is.
Refusals
These are the whole point of this skill. Say no, show the evidence, name the tool that would work.
Object add or remove — refuse
Krea 2 does not add or remove objects, and turning up strength does not fix it — it just replaces your subject with a different one. I asked it to remove the steam from a mug at strength 0.5 and the steam came back (
examples/refuse-removal-after.webp, seed 1499506316). Adding snow to a coastline returned the same coastline slightly cooler. Darkening a sky returned the same sky.This is a masking problem, not a strength problem. Use an inpainting model with a mask over the region.
Same character in a new scene — refuse
The same person cannot be carried into a new photograph, and there is no strength value that does it. At 0.45 the face survives but the source composition comes with it — a three-view studio reference sheet became the same three views at a harbour. At 0.72 you get a genuinely new scene and a different person; only the sweater and the palette carried over (
examples/refuse-identity-after.webp, seed 1317515569).Train a LoRA. Prompting cannot do this.
Do not soften these into "it may be inconsistent". They were run. They failed. The user is deciding whether to spend money and time, and a hedge costs them both.
Reproducing a result
The endpoint is deterministic. Two runs at the same seed, strength, prompt and input bytes came back differing on 0 of 1,048,576 pixels. So if a re-run looks different, something about the input changed — and for image-to-image the input includes the source file itself.
This bites in a specific way: feeding a lossy WebP copy of the PNG an edit was originally made from moved the result by 17.0/255 mean per-pixel. The composition, the palette and the medium all came back. The brush texture did not.
Tell the user to keep the original file if they intend to re-run. For image-to-image, the seed alone does not reproduce a generation — the seed and the exact input bytes do.
What is verified and what is not
Verified: the five recipes, at the stated strengths, on the paired images in examples/. Each ran once, no cherry-picking across seeds. Determinism was measured directly, twice.
Not verified: whether these strengths transfer to Krea 2 non-turbo, to other models, or to aspect ratios far from square. The band is a Krea 2 Turbo measurement. If you use a different model, re-measure before trusting the number — and say so rather than carrying the number over.
What ships with it: 73 files
7708.2 KB alongside SKILL.md, 4 of them executable
docs/
- examples/01-after.webp111.6 KB
- examples/01-before.webp100.6 KB
- examples/02-after.webp72.6 KB
- examples/02-before.webp88.4 KB
- examples/03-after.webp205.6 KB
- examples/03-before.webp206.5 KB
- examples/04-after.webp222.7 KB
- examples/04-before.webp238.8 KB
- examples/05-after.webp103.9 KB
- examples/05-before.webp80.0 KB
- examples/limit-cyanotype-on-photo.webp67.1 KB
- examples/limit-gouache-on-character.webp70.2 KB
- examples/limit-relight-material-drift.webp104.1 KB
- examples/limit-single-source-daylight.webp52.0 KB
- examples/limit-single-source-outdoors.webp47.1 KB
- examples/ok-cyanotype-on-lineart.webp216.3 KB
- examples/ok-cyanotype-on-portrait.webp76.0 KB
- examples/ok-gouache-on-diagram.webp54.6 KB
- examples/ok-palette-on-character.webp60.6 KB
- examples/ok-palette-on-photo.webp55.2 KB
- examples/ok-relight-on-concrete.webp41.8 KB
- examples/refuse-identity-after.webp129.1 KB
- examples/refuse-identity-before.webp144.6 KB
- examples/refuse-removal-after.webp67.0 KB
- examples/refuse-removal-before.webp76.6 KB
- examples/test-anime.webp58.6 KB
- examples/test-attic.webp65.7 KB
- examples/test-concrete.webp55.6 KB
- examples/test-highcontrast.webp65.8 KB
- examples/test-lineart.webp204.1 KB
- index.html20.4 KB
examples/
- 01-after.webp111.6 KB
- 01-before.webp100.6 KB
- 02-after.webp72.6 KB
- 02-before.webp88.4 KB
- 03-after.webp205.6 KB
- build_demo.pyruns7.0 KB
- build_pages.pyruns11.3 KB
- demo.webp1319.0 KB
- .env.example22 B
33 more files not listed here. See all 73 in the repository.