Table of Contents

Hey all, happy Friday.
If you signed up for this newsletter during my Motion presentation on Tuesday, welcome! Great to have you. I spent the entire weekend rewriting that presentation from a live demo into a typed one because my friend Dara told me she didn't risk a live demo at hers, and I figured, "yeah, better not tempt it." I mean, Claude never goes down, right?
Claude then went down the day of my presentation. Sometimes you call the right shot for the wrong reason.
Anyway. Onto the important stuff:
James was in school every day this week, which is nothing short of a miracle after last week when he was out four of five days.
He can now move around the entire apartment on his own, though he's still leaning on walls and furniture like a tiny drunk.
He's also at the stage where he thinks throwing things on the ground is hilarious, but nothing truly beats the humor of handing Linus food directly off his plate. This has created quite an alliance. It's something I've been looking forward to (Steed and James, taking the world on), but I never really came to terms with the externalities (i.e., cleaning up all the crap on the floor).
Needless to say, Linus has been waiting for this moment for some time. Meanwhile, some people wait a lifetime for a moment like this.
Last Friday night, Maddie had plans, James was asleep, and I was on my own. So I had a THC beverage (don’t worry, just 5mg), ordered Shake Shack, and played with Claude Code. The most exciting Friday night of my life. I am in my thirties and writing a parenting newsletter. Take notes.
TV situation: We watched Summer House last night. For those keeping score, I am a Summer House and a Real Housewives of Salt Lake City guy. And I have opinions (#teamciara).
Quick note for new readers: this newsletter is for marketers and founders running DTC ads who want to use AI without the fluff. If you've ever wished you could iterate on the same winning ad 10 different ways without losing quality, this one's for you
Anyway.
A client asked me a simple question this week: Can you iterate on this ad with our five different color variants (SKUs) within the hour?
I opened fal.ai (the platform I use to run AI image models), fed the ad back into Nano Banana 2 with a color-swap prompt, and watched the output come back slightly worse than the input.
Ran it again.
Worse.
By the third edit, the background had drifted, the headline was softer, and the whole thing felt photocopied.
This is not a new problem.
Everyone generating AI ads eventually hits it. I spent most of a day figuring out what's actually going on and how to stop it. The fix turned out to be simple, a little weird, and borrowed from a video-editing technique that compositors have used for 30 years.
By the end of the day, I had a pipeline that produces unlimited ad SKU variants at full quality and a test that proved it works on real creative.
Here's the whole thing. I'm holding nothing back.
And, the important part, you don't need to touch a terminal, write a line of Python, or understand any of the technical stuff. You need one file, Claude Code, and a fal.ai account. That's the whole tool list.
What can I say except you’re welcome. 🎶
The problem, in plain English
Nano Banana 2 is the best model for ad creative.
Text rendering: solved.
Composition: solved.
Product photography: solved.
It has one architectural secret that will destroy your workflow if you don't know about it: every edit re-generates the entire image from scratch, not just the part you asked to change.
That means making edits on your ads is mf-ing impossible.
Here's why, skipping the jargon (feel free to scroll past this):
Other AI image models like Flux and Stable Diffusion work by starting with a field of random noise and gradually sculpting it into your prompt. There's a "seed" that locks the starting noise, so the same seed + the same prompt = the same image every time. You can hold parts of the image steady.
Nano Banana 2 is built different.
It's grounded on Google's Gemini, which generates images one chunk at a time, just as an LLM writes text one word at a time. There's nothing to lock down. Every time you hit edit, the model reads your reference image, interprets it, and generates a fresh version from scratch. The seed parameter that fal.ai exposes for Nano Banana is basically decorative: it's there for API consistency but doesn't do anything useful.
The result: every edit introduces tiny drift. Background tone shifts by a few values. Text letterforms re-render with slightly different weights. Shadows soften. These changes compound across edits like generational loss on a photocopier. By your third edit, the ad feels vaguely wrong in a way you can't articulate.

If you've ever looked at your third edit and thought "something feels off" - that's what you were seeing.
It's not you. It's architecture (thanks a lot, Ted Mosby).
The Workflow
Step 1: Choose the master ad that you want to change the color SKU on
If you're starting from scratch, use Nano Banana 2 at 2K PNG to generate an ad. I go through how to do this in many of my older newsletters
If you already have the master (i.e., a winning ad that you simply want to change the variant to), skip to Step 2.

This will be my example
Step 2: Make the product mask with EVF-SAM
I know this sounds like a scary model.
It’s not.
It looks at an image and draws an outline around whatever object you describe. That way, you can simply alter that object without affecting the rest of the ad.
In other words, you need a mask: a black-and-white image where white marks the pixels you want to swap (the product) and black marks everything you want to preserve (text, background, layout).
You create it once per ad and reuse it for all variants.
The tool is EVF-SAM on fal.ai. It's a text-prompted segmentation model: you describe the object you want isolated, and it spits out a mask. Endpoint: fal.ai/models/fal-ai/evf-sam.
The catch is that EVF-SAM is finicky about exactly how you describe the object. "The wallet" gets you noise. "The dark blue metal wallet at the center of the image, not the overlapping cards or the circular line graphic," gets you a clean mask.
So we let Claude write the description. Open Claude, upload your ad image, and paste this prompt:
META-PROMPT FOR EVF-SAM (copy this into Claude):
I've attached an ad image. I want to generate a mask of a specific object in this image using EVF-SAM on fal.ai, which is a text-prompted segmentation model.
The object I want to mask is: [FILL IN — e.g., "the blue wallet", "the coffee cup on the table", "the pill bottle"]
Look at the image and write me a ready-to-paste EVF-SAM prompt with three things:
Positive prompt — describe the object using its specific visual properties (color, material, shape, position in the frame). Be specific enough that EVF-SAM can isolate it from anything else in the image.
Negative prompt — list every other element in the image that could bleed into the mask and should be excluded. Look carefully: overlapping objects, text, icons, callouts, graphics, background elements, shadows.
Format the output as a clean code block I can paste directly into the EVF-SAM playground at fal.ai/models/fal-ai/evf-sam.
Claude reads your image, figures out what's in it, and writes you a tuned prompt. You paste that into the EVF-SAM playground, run it, and download the mask as mask.png.
Takes 30 seconds, including the Claude round trip.
One load-bearing setting (see screenshot below):
Mask Only and Grounding Dino must be ON. Without it, EVF-SAM's mask is noisy across the entire frame
Set Blur Mask to ~10
Set Expand mask to ~10
Ensure Fill Holes is selected
Logic? Trust me, bro.
But seriously, these were the single most important changes I made during my testing.

The setup

Zoomed in
Step 3: Swap the product with Nano Banana 2 Edit
This is done independently of the masking. This and Step 2 can be completed in either order.
Feed Nano Banana 2 the master ad, your new product reference photo, and a swap prompt.
Endpoint: fal.ai/models/fal-ai/nano-banana-2/edit.
Same meta-prompt approach: let Claude look at your images and write the specific swap prompt.
META-PROMPT FOR NANO BANANA 2 EDIT (copy this into Claude):
I've attached two images:
My ad (first image).
The new product I want to swap in (second image).
I want to replace [FILL IN — e.g., "the blue wallet", "the coffee cup"] in the ad with the product shown in the second reference image.
Look carefully at both images. Write me a ready-to-paste Nano Banana 2 Edit prompt that:
Tells the model to swap the specific product in the ad with the product in the second reference image.
Explicitly requires the new product to appear at the exact same angle, position, scale, perspective, rotation, lighting direction, and shadow as the original.
Describes any visual details from the new product reference that should be preserved (brand marks, colors, artwork, logos, finishes).
Lists every text element, graphic, overlay, icon, and other ad element from my first image that must remain unchanged. Look at the image and call them out specifically.
Specifies PNG output at 2K resolution.
Format the output as a clean code block I can paste directly into the Nano Banana 2 Edit playground at fal.ai/models/fal-ai/nano-banana-2/edit.
Claude writes the prompt. You paste it into fal.ai, upload both reference images, hit run, download the output as nano-edit.png.

The setup
Heads up: the Nano Banana Edit output will render the new product correctly, but the background, text, and layout may have subtly drifted.
This is fine. You are about to throw that drift away.
Step 4: Download the file I built for you (the things I do for love)
Grab LOSSLESS_LOOP.md here:
It's a single Markdown file. Save it to the same folder you are working out of on Claude Code.

I know it seems minor, but minor matters when you have many variants!
Step 5: Make a folder with your stuff
Within that same folder, put four things in it:
LOSSLESS_LOOP.md(the file you just downloaded)ad.jpg: your master ad image. Rename your file to exactlyad.jpgso Claude knows which one it is. (.pngor.webpalso work.)mask.png: the black-and-white image showing the part of the ad to swap that you generated in step 2. White = the product. Black = everything you want to keep untouched. (If you don't have a mask yet, see "Making a mask" at the bottom of this piece: it takes about 30 seconds.)A subfolder named
products/with one or more product reference photos. These are the products you want to swap into the ad. Name them whatever you want:matte-black.png,burnt-titanium.png,dragon-edition.png, whatever.
Final folder structure:
my-variant-project/
├── LOSSLESS_LOOP.md
├── ad.jpg
├── mask.png
└── products/
├── matte-black.png
├── burnt-titanium.png
└── dragon-edition.png
Step 6: Tell Claude Code to run it
Open Claude Code. Navigate to your folder. Type exactly this into the chat:
Follow the runbook in this folderClaude reads the file, asks you for your fal.ai API key** (if you need help with this, scroll to the bottom of the newsletter), and runs the whole pipeline under the hood. You'll see it uploading your files, running Nano Banana 2 Edit for each product, and compositing the results. It takes 1-3 minutes, depending on how many variants you asked for.
When it's done, Claude opens your variants in Preview so you can flip through them. They're also saved in a final/ folder so you can grab them later.
That's the entire interaction. You typed one sentence. Claude did the rest.

Step 7: (Optional) Iterate
Want more variants? Drop more product reference photos into the products/ folder and tell Claude "run more variants." Want to adjust the edge blending if you see a subtle seam around the product? Tell Claude "increase the erode." Everything is conversational. You never touch code or command lines.
TLDR
Every Nano Banana edit degrades the whole image, not just the part you asked to change.
The fix: let the model wreck the whole thing, then throw away everything except the new product region using a mask.
I packaged the whole workflow into one file:
LOSSLESS_LOOP.md. Drop it in a folder with your ad, your mask, and product references. Open Claude Code. Say "follow the runbook in this folder." Done.You'll need a free fal.ai API key (60 seconds to set up, walkthrough below).
Cost: ~$0.08 per variant. Time: ~15 seconds per variant. Typing: zero terminal commands.
If you try this on one of your ads, reply with the result. Please share the weirdest product swap you run through this pipeline.
Have a great weekend.
Will.
**If you need help making a fal.ai key, here is a rundown:
Go to fal.ai and click Sign Up (top right). You can use Google, GitHub, or an email address.
Once you're signed in, click your profile icon in the top right and select Dashboard.
In the left sidebar, click Keys.
Click Add Key. Name it anything (I named mine "lossless loop").
Copy the key. It starts with something like
fal_xxx:xxxxxxxx. Paste it somewhere safe: a password manager is ideal, a sticky note works.
Fal.ai gives you free credits when you sign up. Each variant you generate costs about 8 cents, so the starter credits will get you 60+ variants before you need to add a payment method. For most people that's enough to run this whole workflow several times over for free.