SkillAgentSearch skills...

omni-ugc-ad-factory

Produce a UGC-style talking-head video ad end to end on the MaxFusion MCP — research the product with user-supplied competitor leads, tear down 5 competitor Meta ads and 5 organic TikToks, write a pain-driven script that sounds like a person talking (never like an ad), reverse-prompt a rights-clean…

Install / Use

npx skills add MegaTroll222/OMNI-UGC-AD-FACTORY

Installs into whichever agent you are using.

About this skill
📄

SKILL.md

Installable skill definition

Quality Score

78/100

Supported Platforms

Claude Code
Gemini CLI

Our assessment of omni-ugc-ad-factory

omni-ugc-ad-factory scores 78/100 on our quality scale, 1049th of 1,178 Content & Media skills we index.

Its SKILL.md is 15 KB long, well organised into 14 sections with 3 code examples: a thorough specification that gives an agent plenty to work with.

It has no GitHub stars yet, so there is no community track record; judge it on its content.

Substance
30/30
Structure
18/20
Description
15/15
Adoption
0/20
Freshness
15/15

Maintenance, license and trust

  • The repository was last updated about 3 months ago, so omni-ugc-ad-factory is actively maintained.
  • No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
  • Its trust signals score 80/100, with 2 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

omni-ugc-ad-factory compared with similar skills

All 4 of these similar skills score higher than omni-ugc-ad-factory; compare them before choosing.

SkillScoreStarsUpdatedFormat
omni-ugc-ad-factory (this skill)by MegaTroll2227803mo agoSKILL.md
Agent-Reachby Panniantong10096.5k4d agoCLAUDE.md
headroomby headroomlabs-ai10075.1ktodayCLAUDE.md
CowAgentby zhayujie10047.4ktodayCLAUDE.md
Scraplingby D4Vinci10087.0ktodayMCP Server

Frequently asked questions

How do I install omni-ugc-ad-factory?
Run npx skills add MegaTroll222/OMNI-UGC-AD-FACTORY. The install tabs above show the steps for each supported agent.
Which AI agents does omni-ugc-ad-factory work with?
It is written for Claude Code and Gemini CLI, as a SKILL.md file. Other agents that read the same format can often use it too.
Is omni-ugc-ad-factory safe to use?
It declares no license and scores 80/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is omni-ugc-ad-factory still maintained?
The repository was last updated about 3 months ago, so omni-ugc-ad-factory is actively maintained.

name: omni-ugc-ad-factory description: Produce a UGC-style talking-head video ad end to end on the MaxFusion MCP — research the product with user-supplied competitor leads, tear down 5 competitor Meta ads and 5 organic TikToks, write a pain-driven script that sounds like a person talking (never like an ad), reverse-prompt a rights-clean photoreal actor from a user-supplied reference photo, generate two chained 10-second Gemini Omni clips that play as one continuous take, and ship a single seamless 9:16 MP4. Use whenever the user wants a UGC ad, a talking-head ad, an ad for an app or product, mentions Omni or Gemini Omni Flash, drops an actor photo and asks for a video ad, or says anything like "make me some UGC", "let's make ads for X", or "another variation". Built for Claude Code (local ffmpeg); degrades to Claude app with documented fallbacks.

Omni UGC Ad Factory

Turns a product + an actor reference photo into one finished ~20-second UGC ad: two chained 10-second Omni clips stitched into a single seamless 9:16 vertical MP4. That file is the deliverable — no composites, no extra formats. The user does what they want with it.

Model: gemini-omni-flash, locked. The only model that produces synchronized speech AND 10-second clips. Casting stills: gpt-image-2, locked (see references/actor-image.md — nanobanana produced plastic skin through four rounds of tuning; the model is the first variable to change, not the last).


How this skill is enforced — read this first

You never hand-write a prompt for a paid generation call. Every prompt is assembled by a gate script from structured JSON you write. If the gate fails, you fix the JSON and re-run it. The generation call uses the approved file's content verbatim:

casting.json  → scripts/gate_casting.py →  ad1/approved_casting.txt  → gpt-image-2
clip1.json    → scripts/gate_omni.py    →  ad1/approved_clip1.txt    → gemini-omni-flash
clip2.json    → scripts/gate_omni.py    →  ad1/approved_clip2.txt    → gemini-omni-flash

The gates encode every production failure this pipeline has ever had: age-drifted casting, device words rendering into frame, robot voices, choreographed disfluencies, "same girl" identity shorthand, ad-copy closers, re-described seed frames, negated visual instructions, missing camera landings. A prompt that skipped its gate does not exist.

Data files the gates read (edit these to improve the system, not the prose rules): data/age_lexicon.json · data/delivery_glossary.json · data/voice_spec.json · data/color_grading_glossary.json


The chaining mechanism

Omni holds its reference image for the first ~8–10 frames before dissolving into the generated scene. Seed clip 2 with clip 1's trimmed final frame and that hold becomes an invisible join. The order cannot be rearranged:

generate clip 1 → TRIM clip 1's dead-air tail → extract the trimmed clip's last frame
              → seed clip 2 with it → generate clip 2 → seam-check → trim tail → stitch

Trim clip 1 before extracting the seed — trim after, and clip 2 chains to a frame that no longer exists in the final cut. scripts/adkit.py enforces this.

Corollary: the hold also puts the casting still's lighting on screen for the first third of a second of every clip. Prompt the scene the still is already lit for, or the dissolve IS a visible mid-clip light change.


0 — Setup: one round of questions, then stop asking

Ask all of these in one message, then infer everything else:

  1. Actor age bracket — 20s / 40s / 50s (drives the casting lexicon, mechanically).
  2. Delivery tone — yapping & fast / agitated & fed up / excited & hyped / calm, honest & direct.
  3. Visual lane — lane zero (no graphics — the default and usually the best) / hand-drawn illustration / bold color + arrows / motion graphics / environment & light.
  4. Research leads (open question): "To make research fastest — do you know your competitors? Paste their Meta Ads Library URLs if you have them, or just give me the keywords that best fit the product. Otherwise I'll search from scratch."
  5. Actor reference image: ask the user to supply one (Pinterest or anywhere). Recommend: a natural, uneven, real photo — ordinary light, imperfect framing, no studio polish. The more accidental the photo, the better the actor.

If the user already answered any of these, don't re-ask. If they say "you pick", pick, state the pick in one line, move on.

1 — Research the product

Web-search it. Establish what it does, its mechanism (the specific thing it does that solves the problem), and the real pain in users' own words (reviews, Reddit, App Store). "Reduces screen time" is a category. "Makes you take a breath before the app opens" is a mechanism. The mechanism is what the ad turns on.

2 — Pull reference: 5 paid + 5 organic

Use the user's leads first. Competitor page URLs → pull those advertisers directly. User keywords → use them verbatim before inventing your own. Only fall back to your own queries if theirs return nothing — and then follow the keyword-hygiene rules in references/pitfalls.md §4 (query the advertiser's copy-words, 2–3 words, check hit rate, dedupe by page_id, days_running is age not runtime).

Meta — maxfusion_search_meta_ads: media_type: "video", limit: 10, select 5. TikTok — maxfusion_search_tik_tok: sort: "most_liked", count: 10 (enum floor), select 5. Rank organic by save rate (saves/views), not views. Import via maxfusion_import_meta_ads / maxfusion_import_tik_tok.

3 — Tear them down on the canvas

One flow, two flowGroups (paid: adItem ×5; organic: tiktokItem ×5), each into a contentAnalyzer (gemini-3.1-pro-preview, master prompts left "" — the backend hydrates forensic transcribers; don't rewrite them). Validate (free) → run → read runtime_state.node_outputs[node][0].items[].analysis_text via maxfusion_get_flow.

HARD GATE — no analyzer text, no scripts

Metadata is not research. Ad copy, page names and engagement counts assemble a confident, plausible, wrong thesis — this happened on a real run and had to be retracted in full. If the user asks for scripts before the teardown has run, say you can't write them yet.

Mine: hooks separately from pitches (first-3-seconds VO verbatim), CAST across all ten (the uncast role is usually the ad), and the pain nobody is saying out loud.

4 — Write the script

PROBLEM (pain) → TWIST THE KNIFE → SOLUTION. ~25–28 words per 10s clip (drop to ~22–25 with heavy disfluency). Clip 1 = problem + twist; clip 2 = solution. Two distinct candidate scripts, presented in one approval gate; the user approves one.

The not-an-ad law. This is a person talking, just sharing what's up — never copy:

  • The product name gets the smallest event, thrown away mid-sentence, unstressed. Bury the endorsement in a subordinate clause she isn't paying attention to.
  • The strongest structure: complaint-as-endorsement — she's annoyed she needs it, or humiliated that it worked. She's already on the viewer's side against the ad.
  • Real speech ends on something unimportant. One line of pure waste. One line unresolved. No em dashes (Omni performs them). No antithesis pairs. No closers.
  • The gate_omni script enforces the mechanical tells (dashes, ad-copy closers, word budget); the ear test is yours: read it aloud — if a copywriter would be proud, rewrite.

Then the humanizer — forced, not inferred. Read references/humanizer.md in full and apply it to the approved script. If that file is a placeholder, STOP and tell the operator. Never substitute your own idea of "humanize".

5 — Compile the Omni prompts (beat tagging → glossary → gate)

For each clip, write ad1/clipN.json:

  1. Beat-tag every script line with the speaker's internal state, from the glossary's state list (venting, ashamed, resigned, thinking, deciding, confiding, …).
  2. Pick behaviors per beat from data/delivery_glossary.json — only behaviors valid for that beat's state, within budget (3–6 per clip, ≥2 categories, throat-clear once per ad). Weave each behavior's phrasing into the delivery prose (the gate verifies it's there).
  3. Write the voice block once — all six categories: pitch placement, texture, pacing, volume dynamics, terminal pitch, accent mechanics (a city, rhoticity, vowel shape). Paste it byte-identical into clip 2 (the gate hashes it).
  4. Delivery = states, never choreography. "She runs out of air so her voice sags into a creak on its own" — never "creak on the word 'day'". No emotion words anywhere.
  5. Clip 2: style must be "" and nothing may re-describe face/hair/wall/light/crop — the gate injects the seed-premise line itself and fails you on any visual re-description.
  6. Closing: the speech may trail off; the camera never does. Land the shot: still, eyes open, mouth closed, camera locked (clip 1's closing IS the seed frame).
  7. framing_hold (clip 1, when the casting still has a hard angle): Omni's prior is a centred level talking head and it will quietly straighten a canted/low/off-centre shot. State positively what STAYS true for all ten seconds ("the frame stays canted, she keeps the phone where it is…"). The gate rejects prohibitions. Expect partial obedience — the model resists hard angles; production practice is to also trim clip 1's head past the hold-then-dissolve jump (step 8) so the ad opens on the model's settled frame.

Run python3 scripts/gate_omni.py --input ad1/clip1.json --workdir ad1/ until PASS.

6 — Cast the actor (reverse-prompt, never invent)

Casting is reverse-prompting the user's reference photo. We do not compose an image of our own, and we do NOT pass the photo in references (that clones a real person — rights problem; text-to-image only). The photo is read with your eyes, exhaustively:

  1. LOOK at the photo with a tool — crop, enlarge, view. Never assert from memory; when corrected, re-open the image, don't re-reason.
  2. Write ad1/casting.json, reverse-prompting every field from the photo: subject (mechanics, not emotions — and include eye color; omit it and the model picks its own), framing_angle, shoot_style, lighting (direction + source + hardness + how it sits on the skin), color_grade (terms from data/color_grading_glossary.json), background, composition_accidents (a real photo is badly made — canted, off-centre, clipped, missed focus).
  3. physiology comes from the age bracket lexicon, not from taste: the gate requires ≥4 right-age terms and zero wrong-age terms (data/age_lexicon.json). Never write "young" — write the physiology and let age fall out.
  4. Device words never appear — iphone/phone/tripod/ring light render INTO the image. Describe the look of the capture, not the equipment. The gate enforces this.
  5. The still's lighting must match the scene the clips will prompt (see Corollary above).

Run python3 scripts/gate_casting.py --input ad1/casting.json --workdir ad1/ until PASS. Generate: maxfusion_generate_image, model: "gpt-image-2", aspect_ratio: "9_16", quality: "high", image_count: 2, prompt = approved_casting.txt verbatim. User picks. Check the pick against the bracket — a mis-aged actor is baked into every clip downstream. Change ONE variable per correction round.

7 — Generate clip 1

Upload the chosen still (maxfusion_upload_asset: filename, size_bytes, purpose: "image_reference", content_type), then:

maxfusion_generate_video:
  video_model:        "gemini-omni-flash"
  aspect_ratio:       "9_16"
  duration:           10
  resolution:         "720p"
  ref_image_mode:     "ingredients"
  ref_image_file_ids: [<still file_id>]
  prompt:             <ad1/approved_clip1.txt, verbatim>

Omni has **no `fr

Truncated for display — read the full file on GitHub.

Related Skills

View on GitHub
GitHub Stars0
CategoryContent
Updated2mo ago
Forks0

Trust signals

80/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

1 medium1 low