Skip to content

Musab/ai content pipeline for on brand videos - #29

Merged
dazzatronus merged 11 commits into
shotstack:masterfrom
musab123-afk:musab/ai-content-pipeline
Oct 28, 2026
Merged

dazzatronus merged 11 commits into
shotstack:masterfrom
musab123-afk:musab/ai-content-pipeline

Conversation

@musab123-afk

Copy link
Copy Markdown
Collaborator

Makes an on-brand 9:16 video for each product in a store's CSV export, from a brand guide in brand.json. Claude writes each voice-over script, an image-edit model puts the real product on a brand backdrop or in a scene for its type, an image-to-video model animates it, and code checks on the words and vision checks against the packshot hold anything off-brand in an approval sheet. Shotstack renders each video from one saved template with the voice-over, captions and one music track for the run.

Companion code for https://shotstack.io/learn/ai-content-pipeline-automation-brands/

Checks done:

  • Fresh clone: no key, wrong key and the preview run each print one line; no key and wrong key exit 1
  • Template save, update and recovery from a deleted template run live (templates are free, deleted after)
  • Resume from the sheet run with a real public mp4 and a missing one
  • prettier passes with the repo config (CI command, whole repo)
  • README commands run in order; one real product run on production with this exact revision (planter: template, music, 2K still, 1080p clip, Claude script and both vision checks, render, approval row, 267 s), then a rerun that skips it, then a rerun with the video file removed that downloads it from the link in the sheet instead of rendering again

Give Claude room to think before it answers and stop on a cut-off reply,
keep one approval row per outcome whatever the reviewer writes in it,
hold CSV values that name Object.prototype members, name the job in a
timeout, keep ffmpeg's own message when a frame fails, replace every
placeholder in a scene line, and exit 0 after the preview.
A video that was rendered but not downloaded is downloaded from the
link in the approval sheet instead of being rendered and paid again.
The first run saves the template and later runs update it. Held rows
in the sheet are replaced on each run and rows with a video are never
changed. A missing key in brand.json stops the run with its name.
The approval sheet keeps its own header, so a column the reviewer adds
or moves survives a rewrite. A rerun resumes from the latest video row.
A handle starts with a letter or a digit. A null value in brand.json
counts as missing. The download-failed note says what the next run does.
Both files go through the same reader, so a sheet with a renamed or
deleted column, or a row with too many fields, stops the run with the
file name like the product export does. Header cells are quoted like
every other cell. The download-failed note and the README say that a
product is rendered again only when its link fails.
@vercel

vercel Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
reelestate Ignored Ignored Preview Oct 27, 2026 5:48pm UTC

@dazzatronus dazzatronus left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dazzatronus
dazzatronus merged commit 9b4e19f into shotstack:master Oct 28, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants