LIOR PESOAGet in touch
PlaybookBy Lior

How I make AI UGC ads with Claude Code

How I make AI UGC ads with Claude Code is a playbook on making a UGC-style video ad, with an AI avatar talking over real screen recordings of a product, from the script to the posting notes, with Claude Code doing the editing.

Lior PesoaUpdated · Works with Claude Code

I made a 24-second Instagram ad for Top Banana, my tool that checks whether ChatGPT recommends your business. A wedding caterer named Monica talks to camera from the bottom-left corner while recordings of my phone play behind her. Monica isn't real: I made her in OpenArt. Everything behind her is real.

The first 6 seconds: the hook.

I did it in Claude Code, start to finish, then turned the process into a skill, ugc-video. Here is what I did and what went wrong.

The script: a dare, not a testimonial

Top Banana already had a reel for caterers that told the story on screen. The UGC ad needed a different angle, so I had Claude search for UGC hook patterns first. Most sources were ad-tool vendor blogs, so I treated them as ideas to test, not rules.

The usual UGC hook is a testimonial: "I was struggling, then I found this." That was out straight away. An AI person can't honestly have results. A challenge hook fit instead: Monica tells caterers to do something on their own phone, right now. Four lines, one per avatar clip:

  • "Okay, caterers, do this right now. Open ChatGPT and type: who should cater a wedding in, and then your city."
  • "Read the names. If you're not there, it's probably not your food. ChatGPT pulls its picks from wedding blogs and best-of lists."
  • "Top Banana checks it for you, free. It shows which lists skip you and writes the email to the editor. You send it."
  • "Link in bio. Check before your next couple does."

Three rules shaped every line. Monica never says she uses Top Banana or got results. She says no numbers and tells no stories that didn't happen. And the post says she's an AI presenter.

Making Monica in OpenArt

Monica is a character in OpenArt: a 43-year-old wedding caterer in Austin, with a short background story that sets her voice and manner. Each clip is text to video with the Seedance 2.5 model and her line in the prompt. What I learned:

  • Clips run about 10 seconds, so one script line is one clip. Four lines, four clips.
  • The voice can change between clips. From least to most work, the fixes are: attach a voice to the character, clone one from clip 1, or record the audio first and lip-sync the face to it. The library voices I tried all sounded like AI.
  • Clip 4 came back with words I never wrote: "check bow tip with a friend". I didn't hear it. A transcript caught it. Now every clip is transcribed and checked against the script before the edit.
  • Later clips were framed wider than clip 1. Cropping them about 30% made the cut look like one take.

The edit

Claude did the edit with ffmpeg and HyperFrames (opens in a new tab), which builds video from HTML. The four clips ran 34.3 seconds raw. Cutting the pauses and speeding up to 1.12x, with the pitch kept, brought them to 23.6 seconds. Loudness went to -16 LUFS.

The first version put Monica in a box, like a video call stuck on top of an ad. Removing the background made her look like a creator in front of a green screen. npx hyperframes remove-background does it on your own machine: 565 frames in 62 seconds on a Mac with Apple silicon.

The same frame twice. Left: Monica in a small box over the ChatGPT screen, with burned-in captions. Right: Monica cut out, larger, standing in the bottom-left corner.
Left: the first cut, boxed. Right: the final, background removed.

The layout follows the platform. Monica's face sits above Instagram's bottom 420 pixels, where the caption and buttons go. Real phone recordings fill the frame behind her, blurred wherever a real business appears, and they cut on her words: the ChatGPT answer, the free check, the report, the drafted email, then an end card.

Monica talking in the bottom-left corner over a Top Banana report screen that reads: You're losing 10 of 14 AI answers to competitors.
Line 3, over the Top Banana report.

A full render took about 30 seconds. After every render, Claude transcribed the audio and compared it with the script, so I never had to scrub through the video to check a word.

Captions and posting

I left captions out of the render and added them in Instagram Edits with its auto captions, which Instagram can read. Alt text isn't offered for reels on my account, so Instagram's AI label is the disclosure. Claude also wrote the posting notes: timed caption lines, a hook headline, the post caption, music and cover, and the ad link with UTM tags.

The skill

Once the ad was done, I turned the process into a skill: brief, script, avatar, clip check, edit, posting notes. Three scripts do the fiddly parts: clip-report.py transcribes each clip and flags words added or dropped, build-avatar.py joins the clips with pauses cut and framing matched, and caption-groups.py turns the transcript into caption lines.

npx skills add lior-pesoa/skills --skill ugc-video

You still make the avatar clips in your own video tool, record your screens on a real phone, and post it yourself. The skill does the rest and keeps the avatar honest. The source is on GitHub (opens in a new tab).

Questions

Is it honest to use an AI avatar in an ad?

It can be, with rules. The avatar never claims to use the product or to have results, says no numbers that aren't real, and the post discloses the AI presenter. Everything on screen is a real recording.

Which AI avatar tool did you use?

OpenArt, with a saved character and the Seedance 2.5 text-to-video model. HeyGen, Hedra and Kling have the same parts: a saved face, a prompt with the line, a clip length and a voice.

Do I need to know video editing?

No. Claude Code runs ffmpeg and HyperFrames for the cuts, background removal and render. You watch the render and say what to change.

How long should a UGC ad be?

Mine is 24 seconds: four lines of about 60 to 75 words in total. The hook has to work in the first 3 seconds.