| name | business-promo |
| description | Master workflow for making a social-media animation for a real business - a customer, a client, or your own company: restaurant, cafe, barbershop, law firm, clinic, gym, shop, studio, contractor, local service. Runs a step-by-step interview (ONE question per message) that collects the business name and what it sells, the goal of the video, the target social network and aspect (1:1 / 9:16 / 16:9), the language (English or Hebrew), the on-screen details (opening hours, phone, address, website, offer), the generation model, the shape language, and the look and feel - then orchestrates the HyperFrames workflows and domain skills to build, render, and caption the video. Use for "make a video for my client's business", "promo for a restaurant / barbershop / law office", "social ad for a local business", "animation for my customer", or any request naming a business plus a social network. This skill OWNS the deliverable end to end; the /hyperframes router and its workflows are called from inside it, not before it.
|
| metadata | {"tags":"business, promo, local-business, client-work, social-media, interview, master-workflow, orchestrator, hebrew, rtl, instagram, tiktok, reels, shorts, linkedin"} |
Business promo - the master workflow
One business, one interview, one finished post. This skill turns a customer's
business into a social-ready animation plus the caption that ships with it.
It does not re-implement authoring, animation, media, or rendering. It owns the
brief and the sequencing, and delegates every craft decision to the skill that
owns it. Read this file top to bottom before the first question.
Deliverables
Every run produces all four, inside videos/<business-slug>/:
| Artifact | What it is |
|---|
BRIEF.md | The confirmed interview answers. Written once, never re-asked. |
renders/*.mp4 | The animation at the chosen aspect, correct duration, last frame held. |
CAPTION.md | Post copy, CTA, and hashtags in the video language, per network. |
DELIVERY.md | What to post where, plus what the client still owes (logo, real photos). |
Never end a run with only the MP4. The caption is half the deliverable.
Hard rules
These override generic guidance from any downstream skill. They exist because
this is client work: a wrong phone number or an invented opening hour is a
real business harm, not a rendering bug.
- One question per message. Use
AskUserQuestion, one field per call, max
four options, recommended option first with a one-line reason. Never batch the
interview into a single wall of questions. Full protocol:
hyperframes-core -> references/brief-contract.md section 3.
- Never invent a business fact. Opening hours, phone, address, prices,
years in business, ratings, and claims come from the user only. If a detail is
missing, ask once; if still missing, omit it from the video and record the
gap in
DELIVERY.md. Do not guess, do not use a plausible placeholder, and
never ship 555 or 03-000-0000 as if it were real.
- Contact details are DOM text, never generated pixels. Phone numbers,
hours, addresses, and the business name are rendered as HyperFrames text
elements. Image and video models garble digits and mangle Hebrew glyphs.
Generated imagery is background and b-roll only; it never carries copy.
- No unverifiable claims. "Best in the city", "number 1", "cheapest",
medical or legal outcome promises: only if the user supplies them and confirms
they can stand behind them. Otherwise rewrite to something concrete the
business controls ("open until midnight", "same-day appointments").
- Hebrew is a gate, not a translation. If the video language is Hebrew or
any RTL language, load
/hyperframes-hebrew before writing a single line of
composition HTML. Ship the hebrew font subset, set direction per element,
and never put dir="rtl" on <html> (it renders black frames).
- Vertical fills the frame. For 9:16, use the full height: scale type up,
spread beats across the whole canvas, run backgrounds edge to edge. Never
center a square layout in a tall frame. Keep only text out of the platform
keep-out zones (see
references/formats.md).
- Motion doctrine first. Load
/motion-doctrine before composing anything.
The film is one continuous camera move, not a stack of slides.
- Render is user-gated. After checks pass, ask "render now, or changes?"
Render only after the answer.
Step 1 - orient before asking
Do this silently, in one pass, before the first question:
- Detect the chat language from the user's message and conduct the whole
interview in it. This is separate from the video language (asked in step 4).
- Resume, do not restart. If
videos/<slug>/BRIEF.md exists, read it, show a
one-line summary, and ask only what changed. A returning client is an edit run.
- Harvest answers already given. Skip any interview step the user's opening
message already answered. Inference is not an answer; an explicit statement is.
- Catch an autonomous signal ("surprise me", "just build it", "decide for
me"). It does not skip steps 1 to 6 - those are facts only the user has. It
does absorb steps 7 to 11: decide, state each choice with a one-line reason,
and build.
Step 2 - run the interview
Eleven steps, in order, one message each. The exact question copy, the option
sets, and the English and Hebrew phrasings are in
references/interview.md. Read that file before asking question 1.
| # | Field | Asks for |
|---|
| 1 | business | Name and what it actually sells |
| 2 | goal | The one thing the video must make a viewer do |
| 3 | platform aspect | Network -> 1:1, 9:16, or 16:9 |
| 4 | language | On-screen and voice language (English / Hebrew / mixed) |
| 5 | details | Which of hours, phone, address, web to show, then the exact strings |
| 6 | assets | Logo, photos, brand colors, website URL the client already has |
| 7 | model | Generation engine and model, with plain-language trade-offs |
| 8 | look | Look and feel preset |
| 9 | shapes | Shape language |
| 10 | sound length | Voiceover, music only, or silent-with-captions, plus duration |
| 11 | storyboard flow | Review on the board? Collaborative or automated? |
Supporting catalogs, loaded when that step comes up:
- Step 7 model options and what each is good at:
references/models.md
- Steps 8 and 9 presets, palettes, fonts, shape vocabulary:
references/looks.md
- Step 3 aspect, safe zones, per-network caption specs:
references/formats.md
Before the hand-off summary, run one integration check: look for a
consequence the combined answers create that no single answer showed, and raise
it with a proposed fix. Common ones:
- Hebrew copy plus a look whose font has no Hebrew subset -> propose the
Hebrew-capable equivalent from
references/looks.md.
- 9:16 plus a dense contact block -> propose splitting details across two beats.
- 15 seconds plus voiceover plus five facts -> propose 22 seconds or fewer facts.
- Photoreal AI model plus "must show my actual storefront" -> propose real photos
for the hero and generated imagery for texture only.
- No logo plus a premium look -> propose a type-only lockup rather than a fake mark.
Then present the summary, splitting stated fields from inferred ones, and
confirm. A correction means present the updated summary and confirm again.
Step 3 - write the brief
Scaffold the project and freeze the answers:
mkdir -p videos/<business-slug>
npx hyperframes init videos/<business-slug>
Copy assets/BRIEF.template.md to videos/<business-slug>/BRIEF.md and fill
every field. Validate before building:
node .claude/skills/business-promo/scripts/check-brief.mjs videos/<business-slug>/BRIEF.md
It exits non-zero and names the missing fields. Do not start building on an
incomplete brief; go back and ask the specific field.
Step 4 - route to the owning workflow
The brief now decides the route. Install it before reading it:
npx hyperframes skills update <workflow-name>
| Situation | Workflow |
|---|
| Business has a real website URL worth crawling for brand + assets | /product-launch-video |
| No website: logo, photos, and facts only (the common local case) | /general-video |
| Single idea under about 10s (logo sting, "now open", one offer) | /motion-graphics |
| A music track drives the whole piece | /music-to-video |
| The client supplied talking-head footage of themselves | /embedded-captions or /talking-head-recut |
Pass the confirmed BRIEF.md into the workflow. It must not re-ask anything the
interview already settled.
Always load, in this order, before composing:
/motion-doctrine - the gateway, first, always
/hyperframes-core - the composition contract
/hyperframes-animation - motion rules and scene blueprints
/cut-the-curve - seams, velocity matching, kinetic text entry
/seam-craft - render-correct scene seams, white-flash guard
/media-use - logo, photos, music, SFX, voiceover, color grade
/hyperframes-hebrew - if and only if the video language is RTL
Optional by choice: /oversized-cursor when a beat shows a website or app UI,
/hyperframes-keyframes for bespoke keyframe work, /dataviz for a stat beat.
Step 5 - build
The beat skeleton, the per-aspect layout rules, and the asset generation recipes
are in references/build.md. The short version: hook, identity, proof, details,
call to action, with a velocity-matched seam between every beat and the last
frame held.
Step 6 - gate before render
Run the checks and fix everything they report:
cd videos/<business-slug> && npm run check
Then walk the client-work checklist in references/build.md section 5. The two
that catch the most real damage: every digit on screen matches the string the
user typed, and the Hebrew font subset is actually loading rather than
silently falling back.
Ask "render now, or changes?" Render only after the answer.
npm run render
Step 7 - caption and deliver
Write CAPTION.md from assets/CAPTION.template.md, in the video language,
using the per-network rules in references/formats.md (hook line, body, CTA,
contact line, hashtag count). Write DELIVERY.md: where to post, the aspect, the
duration, and any detail the client still owes.
Report the render path, the duration, and the aspect. Show frames from the beat
midpoints so the user has a review surface without opening the file.
Publishing this workspace
This skill ships no customer data. Client facts live in videos/<slug>/, which
is where real phone numbers and addresses land. Before pushing this workspace
anywhere public, run /security-audit and confirm the client project folders are
either scrubbed or ignored.