agentleFS
tymoshenko-dmytrotymoshenko-dmytro/marketing-agent-kit/skills/ads-video-library/SKILL.md

ads-video-library

Skill2 starsChanged 23 days agoMITView on GitHub

Name, store and catalogue finished ad videos — canonical file names, a poster frame for every video (optionally baked in as frame 0 so feeds and chats show it as the thumbnail), contact sheets for QA, storage under Month / Language / Type in a local folder or a Google shared drive, a CSV catalogue (plus an optional Google Sheet), and a gallery.html review page with approve / reject / notes. Use after rendering any batch of ad creatives — motion cards, UGC, demos, cut-downs. Triggers: "upload the renders", "catalogue these videos", "name these files", "publish the creatives", "make a review page". Not for rendering.

  • Installs packages

1 other project uses a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

7 rules. About 0 are common, 2 are distinctive, and 5 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 5

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Names: every file canonically — the name says what the file is without opening it.

    line 17
  2. Very specific:

    Run --dry-run first on any batch you haven't published before: it prints the names, the folders and the chosen poster times, and touches …

    line 24
  3. Very specific:

    Read references/posters.md.

    line 60
  4. Very specific:

    Update each item's status (approved / rejected) and notes in the manifest, fix the rejected ones, re-run publish.py.

    line 70
  5. Very specific:

    created is remembered for an id already in the catalogue: Always pass --catalog: without it the publisher has no memory and every run …

    line 89
  6. Very specific:

    Add your languages to "langs" in library.json ({"sv": "SV 🇸🇪"}).

    line 97
  7. Distinctive:

    Write a small manifest generator in your render project: it is the only project-specific part.

    line 98

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Ads video library

Where finished ad creatives live, what they are called, and how a team reviews and finds them again. Rendering is someone else's job; this skill starts the moment an mp4 exists.

One command does everything:

python3 ${CLAUDE_SKILL_DIR}/scripts/publish.py manifest.json --catalog catalog.csv
  1. Names every file canonically — the name says what the file is without opening it.
  2. Pulls a poster — the strongest settled frame (text fully in, nothing mid-transition) → <name>.jpg.
  3. Makes a contact sheet — six stills across the video → <name>.sheet.jpg, for QA.
  4. Stores the video and poster under <Month> / <LANG 🏳> / <Video type> — in a local folder (default) or on a Google shared drive.
  5. Writes the catalogue — catalog.csv, the source of truth, plus a Google Sheet tab if configured.
  6. Writes dist/gallery.html — a review page: every video with its poster, fields and contact sheet, and approve / reject / note buttons. "Copy review" puts the verdicts on the clipboard to paste back here.

Run --dry-run first on any batch you haven't published before: it prints the names, the folders and the chosen poster times, and touches nothing.

Needs FFmpeg (ffmpeg, ffprobe) on PATH. Google Drive mode also needs pip install google-auth requests.

The manifest

The generating agent writes it; it is the only file that knows anything about the batch:

{
  "type": "motion",
  "label": "Motion Cards",
  "lang": "en",
  "extras": ["headline", "cta", "caption"],
  "items": [
    {"topic": "hr-interviews", "src": "renders/hr.mp4", "voice": "female",
     "headline": "An AI scheduler for recruiters", "cta": "Try for free",
     "caption": "Candidates pick an interview slot in their own time zone. No back-and-forth emails."}
  ]
}

type goes into the file name, label is the folder and the Sheet tab, extras are the columns this type carries beyond the core set. Per item topic, src and voice are required; poster_at (seconds) overrides the automatic poster pick. Full contract: references/manifest.md.

Configuration

library.json in the working folder (or ~/.config/marketing-agent-kit/video-library.json):

{"storage": "local", "local_root": "~/Ads Video Library"}

For Google Drive: {"storage": "gdrive", "drive_id": "<shared drive id>", "sheet_id": "<optional sheet id>"} — setup in references/setup.md. Without a config file the skill uses local storage in ~/Ads Video Library.

Posters and frame 0

Read references/posters.md. In short:

  • Almost every player and feed shows frame 0 as the idle thumbnail, and frame 0 of an ad is usually a fade or a half-drawn title. --bake-poster replaces only frame 0's pixels with the poster: same duration, same frame count, audio untouched, invisible on playback — but every thumbnail grabber now shows a real frame.
  • Platforms that accept a custom thumbnail upload (Meta, TikTok, YouTube, the LinkedIn post editor) get the .jpg.
  • Look at the posters and contact sheets before reporting. Automatic picking is a good default, not a guarantee. If a poster lands on the wrong moment, set poster_at for that item and re-run.

Review loop

  1. Publish → open dist/gallery.html (or send it to the reviewer with the dist/ folder).
  2. The reviewer approves, rejects and leaves notes, then clicks Copy review and pastes the text into the chat.
  3. Update each item's status (approved / rejected) and notes in the manifest, fix the rejected ones, re-run publish.py. The catalogue and the gallery update; links stay valid.

Read before publishing a new video type

  • references/naming.md — the name, field by field, and why the catalogue never joins on it
  • references/storage.md — folder layout, what belongs in the library and what doesn't
  • references/manifest.md — the manifest contract
  • references/setup.md — Google credentials, and what to do when Google stops trusting them
  • references/posters.md — posters, frame 0, contact sheets, captions

What this skill won't decide for you

  • The type slug and label. A new format is a new folder beside the existing ones. Keep the slug short, lowercase, no underscores — underscores separate fields in the name.
  • What belongs in extras. A column is worth adding when someone choosing a creative to run would sort or filter on it: the headline, the CTA, the hook, the caption. Not the render settings.

Things that cost time to learn

  • The catalogue joins on id, never on the file name. id is <type>_<topic>_<lang>_<aspect>_<voice> and survives re-renders, new dates, new lengths and new versions; an EN and an ES cut, or a 16x9 and a 9x16 cut, are separate ids. Ad performance joined on a file name splits one creative's history in two.
  • Length and date are in the name, so a re-render renames the file. The publisher retires what is in the type's folder and not in the batch — locally into _retired/, on Drive into the trash. Skip it with --no-sweep and the folder fills with older renders, all looking current.
  • created is remembered for an id already in the catalogue. Always pass --catalog: without it the publisher has no memory and every run stamps today.
  • Two items with the same id or the same name is a refusal, not a warning. Two render projects producing the same basename once shipped the wrong screen inside a card for a week.
  • One catalog.csv for the whole library. A batch replaces its own rows and leaves other types and languages alone; columns you added (spend, CTR) are kept. Rows whose files the sweep just retired get status = retired.
  • A Sheet tab is overwritten wholesale. The CSV is the source of truth; anything typed into the tab by hand is gone on the next run.
  • Drive: a service account can only write to a shared drive (it has no storage of its own), and every call against a shared drive needs supportsAllDrives. Details in references/setup.md.

Adapt it

  • Add your languages to "langs" in library.json ({"sv": "SV 🇸🇪"}).
  • Write a small manifest generator in your render project: it is the only project-specific part. Everything after it is this skill.

Poster selection and the frame-0 technique are adapted from /brag (MIT).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.