answer-ads-questions
Answer questions about a brand's Meta ads (spend, results, which ad is winning, is it paused,…
Assemble an Apple Notes list video ad from a note + end-card JSON — a frame-accurate fake iPhone screen recording of a short list being typed into Apple Notes (character by character, key pops, blinking caret, the note scrolling up as it fills) crossfaded into a checklist end
$ npx -y skills add gooseworks-ai/goose-skills --skill render-apple-notes-chat --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/render-apple-notes-chatContext preview
The summary Claude sees to decide when to auto-load this skill.
Assemble an Apple Notes list video ad from a note + end-card JSON — a frame-accurate fake iPhone screen recording of a short list being typed into Apple Notes (character by character, key pops, blinking caret, the note scrolling up as it fills) crossfaded into a checklist end
name: render-apple-notes-chat description: Assemble an Apple Notes list video ad from a note + end-card JSON — a frame-accurate fake iPhone screen recording of a short list being typed into Apple Notes (character by character, key pops, blinking caret, the note scrolling up as it fills) crossfaded into a checklist end card (the note's picks as ticked rows, real product photos, logo, CTA, in the brand's colours and fonts), with an optional music bed. FREE assembly (Playwright + ffmpeg); the recipe supplies the per-brand note + end card and gates the paid music call to its own capability. The Apple Notes sibling of render-imessage-chat and render-chatgpt-chat. Use for the apple-notes format. status: active
The free renderer for the **apple-notes** video ad format: someone types a short, honest list into Apple Notes ("my chai cheat sheet", "chai for every mood") and every line points to a real product. It ends on a checklist end card with the products and the CTA. Deterministic Playwright + ffmpeg; no generative video of the UI, so every typed character stays pixel-crisp.
Siblings: `render-imessage-chat` (a peer's reply is the punchline) and `render-chatgpt-chat` (an AI answer is the punchline). Reach for this one when the creative is **a list someone keeps for themselves**.
The recipe asks these before any paid step; this renderer only draws what the config says.
personality, one per mood or moment, a routine, a gift guide). Sets `note.title`, `note.lines` and `end_card.head1/head2`.
and capitalisation of `note.lines`.
Sets `note.status_bar.time`.
Brand facts (logo, colours, fonts, product photos, CTA, claims) come from the brand kit.
1. **The note** (`record-notes.js`) — one PNG per visual state, each held for its own duration, concatenated into a 1080×1920 30fps MP4:
letter, a darker space/return key, and a human rhythm (slower after spaces and punctuation);
2. **The end card** (`render-end-card.js`) — a paper card slides and tilts in over the brand colour; the heading has a hand-drawn underline; each row's check draws in turn. Real product cut-outs sit above the rows; the logo (or a wordmark) and CTA pill sit below. 3. **The master** (`stitch.sh`) — ~0.3 s crossfade into the end card, music faded in and out and normalised to −14 LUFS (peaks ≤ −1.5 dBFS). No music → silent master.
cd scripts && npm install # once — installs Playwright
npx playwright install chromium # once
node record-notes.js --config config.json --out-dir <work> --still-only # free review stills
node record-notes.js --config config.json --out-dir <work> # → notes.mp4
node render-end-card.js --config config.json --out-dir <work> # → endcard.png + endcard.mp4
bash stitch.sh --notes <work>/notes.mp4 --end <work>/endcard.mp4 \
--out <work>/master.mp4 [--music <work>/music-bed.mp3]`--still-only` writes `note-hook.png` (the opening frame) and `note-still.png` (the finished list) for the review, without recording the video.
See `scripts/config.example.json`. Two blocks:
| Block | Fields | |---|---| | `note` | `title`, `lines[]` (`text`, `type_seconds`, `pre_pause_seconds`), `post_hold_seconds`, `status_bar` (`time`, `battery_pct`), `keyboard_state` | | `end_card` | `head1`, `head2`, `underline` (a word in `head2`), `rows[]` (`label`, `value`; max 4), `products[]` (`src`, `h` = height %, `wide`), `logo` (file) or `wordmark`, `cta`, `fine_print`, `theme` (`bg`, `bg2`, `paper`, `ink`, `accent`, `label`), `fonts` (`heading`, `label` — Google Fonts family names), `seconds` |
Image paths are resolved relative to the config file. Pacing that reads well: ~1.6–2.8 s per line (about 18 characters a second), 1.0 s before the first line, 0.55 s between lines, 0.9 s before the last line.
copy and the logo are real HTML and real files.
or over 80 characters.
chosen fonts don't load.
(`scripts/mockup/`), so this runs standalone with no sibling fetch.
on Linux/Windows it falls back to the nearest sans.
when a product has none; this renderer only places what it's given.
(not a fallback), the pad under the card matches `theme.bg`.
Put your AI agent on the growth team. Research customers and competitors, analyze what is working, create the next campaign, and learn from the result.
Repo: gooseworks-ai/goose-skills
Answer questions about a brand's Meta ads (spend, results, which ad is winning, is it paused,…
Burned-in captions for a finished vertical video, three kinds. transcribe.py gets word…
Composite a generated creator track into a product layer, per beat — in the creator's zone on…
Generate an AI creator talking to camera, saying an approved script, as one continuous track…
Generate or edit an image via any FAL image model (nano-banana edit, gpt-image, flux, ...),…
Generate a single photoreal or designed image with OpenAI gpt-image via fal.ai. Supports…